Если вы пытались визуализировать pandas.DataFrame
раньше, то вы, вероятно, сталкивались с Pandas .plot() API. Эти команды используют Matplotlib для рендеринга статических PNG или SVG в Jupyter блокнотах с использованием встроенного бэкэнда или интерактивных графиков через %matplotlib widget
.
API-интерфейс Pandas .plot()
стал де-факто стандартом для высокоуровневого построения графиков в Python и теперь поддерживается множеством различных библиотек, которые используют набор базовых механизмов построения графиков для обеспечения дополнительных возможностей. Библиотеки, которые в настоящее время поддерживают этот API, включают:
В этом блокноте мы исследуем возможности стандартного API .plot
и продемонстрируем дополнительные возможности, предоставляемые .hvplot
, которые включают бесшовную интерактивность в развернутых информационных панелях и рендеринг на стороне сервера больших наборов данных.
Чтобы показать эти особенности, мы будем использовать набор данных в виде таблиц о землетрясениях и других запрошенных сейсмологических событиях из Каталога землетрясений USGS, используя его API. Конечно, этот набор данных является всего лишь примером; тот же подход можно использовать практически с любым табличным набором данных, и аналогичные подходы можно использовать с наборами данных с координатной привязкой (многомерный массив).
Для работы с пакетом hvplot понадобится настроить программное окружение (установить множество модулей).
Я предпочитаю работать с miniconda и раздельными виртуальными средами.
Далее в командной строке для настройки среды окружения необходимо выполнить:
conda create --name holoviz
conda activate holoviz
conda install anaconda-project
anaconda-project download pyviz/holoviz_tutorial
cd holoviz_tutorial
anaconda-project run jupyter lab
После процесса установки всех необходимых модулей и запуска Jupyter Lab можно открыть оригинал данного блокнота: tutorial/02_Plotting.ipynb
.
Здесь мы сосредоточимся на Pandas, но аналогичный подход будет работать для любого поддерживаемого типа DataFrame, включая Dask для распределенных вычислений или RAPIDS cuDF для вычислений на GPU. Этот набор данных относительно велик (2,1 млн строк), но он все равно должен уместиться в памяти на любой современной машине и, следовательно, не потребует специальных внепроцессорных или распределенных подходов, таких как Dask.
import pandas as pd
!wget https://www.dropbox.com/s/m2r388lpoo7isu9/earthquakes-projected.parq
df = pd.read_parquet('earthquakes-projected.parq')
df.time = df.time.astype('datetime64[ns]')
df = df.set_index(df.time)
print(df.shape)
df.head()
(2116537, 25)
index | depth | depthError | dmin | gap | horizontalError | id | latitude | locationSource | longitude | ... | net | nst | place | rms | status | time | type | updated | easting | northing | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
time | |||||||||||||||||||||
2000-01-31 23:52:00.619 | 0 | 7.800 | 1.400 | 0.09500 | 245.14 | NaN | nn00001936 | 37.1623 | nn | -116.6037 | ... | nn | 5.0 | Nevada | 0.0519 | reviewed | 2000-01-31 23:52:00.619 | earthquake | 2018-04-24T22:22:44.135Z | -1.298026e+07 | 4.461754e+06 |
2000-01-31 23:44:54.060 | 1 | 4.516 | 0.479 | 0.05131 | 52.50 | NaN | ci9137218 | 34.3610 | ci | -116.1440 | ... | ci | 0.0 | 26km NNW of Twentynine Palms, California | 0.1300 | reviewed | 2000-01-31 23:44:54.060 | earthquake | 2016-02-17T11:53:52.643Z | -1.292909e+07 | 4.077379e+06 |
2000-01-31 23:28:38.420 | 2 | 33.000 | NaN | NaN | NaN | NaN | usp0009mwt | 10.6930 | trn | -61.1620 | ... | us | NaN | Trinidad, Trinidad and Tobago | NaN | reviewed | 2000-01-31 23:28:38.420 | earthquake | 2014-11-07T01:09:23.016Z | -6.808523e+06 | 1.197310e+06 |
2000-01-31 23:05:22.010 | 3 | 33.000 | NaN | NaN | NaN | NaN | usp0009mws | -1.2030 | us | -80.7160 | ... | us | NaN | near the coast of Ecuador | 0.6000 | reviewed | 2000-01-31 23:05:22.010 | earthquake | 2014-11-07T01:09:23.014Z | -8.985264e+06 | -1.339272e+05 |
2000-01-31 22:56:50.996 | 4 | 7.200 | 0.900 | 0.11100 | 202.61 | NaN | nn00001935 | 38.7860 | nn | -119.6409 | ... | nn | 5.0 | Nevada | 0.0715 | reviewed | 2000-01-31 22:56:50.996 | earthquake | 2018-04-24T22:22:44.054Z | -1.331836e+07 | 4.691064e+06 |
5 rows × 25 columns
Чтобы сравнить подходы HoloViz с другими, мы возьмем подвыборку (1%) из большого набора данных для дальнейшей обработки любым инструментом:
small_df = df.sample(frac=.01)
print(small_df.shape)
small_df.head()
(21165, 25)
index | depth | depthError | dmin | gap | horizontalError | id | latitude | locationSource | longitude | ... | net | nst | place | rms | status | time | type | updated | easting | northing | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
time | |||||||||||||||||||||
2010-01-30 04:15:07.412 | 537 | 8.700 | 0.10 | NaN | NaN | NaN | ak0101doldjp | 61.576900 | ak | -147.822800 | ... | ak | NaN | Southern Alaska | 0.6700 | reviewed | 2010-01-30 04:15:07.412 | earthquake | 2018-07-06T19:53:39.618Z | -1.645556e+07 | 8.759508e+06 |
2016-01-17 15:31:10.240 | 4984 | 13.000 | 3.00 | 0.33500 | 215.64 | NaN | nn00527303 | 39.901400 | nn | -119.026900 | ... | nn | 9.0 | 37km NNE of Fernley, Nevada | 0.1462 | reviewed | 2016-01-17 15:31:10.240 | earthquake | 2018-07-02T17:46:02.559Z | -1.325001e+07 | 4.851624e+06 |
2005-04-30 01:55:42.980 | 318 | 10.424 | 2.03 | 0.16400 | 122.00 | 0.39 | nc21454257 | 41.020000 | nc | -121.554333 | ... | nc | 11.0 | Northern California | 0.0700 | reviewed | 2005-04-30 01:55:42.980 | earthquake | 2017-01-11T03:26:06.953Z | -1.353137e+07 | 5.015292e+06 |
2007-01-14 13:05:52.210 | 4415 | -0.498 | 3.11 | 0.07117 | 95.00 | 0.90 | nc71006801 | 38.613833 | nc | -122.326667 | ... | nc | 11.0 | Northern California | 0.2600 | reviewed | 2007-01-14 13:05:52.210 | earthquake | 2017-01-16T03:08:12.875Z | -1.361734e+07 | 4.666506e+06 |
2006-10-17 08:18:54.620 | 4072 | 13.200 | 58.50 | NaN | 238.20 | NaN | usp000evcp | -5.923000 | us | 151.013000 | ... | us | 12.0 | New Britain region, Papua New Guinea | 0.5000 | reviewed | 2006-10-17 08:18:54.620 | earthquake | 2014-11-07T01:30:35.061Z | 1.681069e+07 | -6.605228e+05 |
5 rows × 25 columns
Мы будем переключаться между small_df
и df
в зависимости от того, работает ли метод, который мы показываем, только для небольших наборов данных, или его можно использовать для любого набора.
.plot()
¶Первое, что мы хотели бы сделать с этими данными, - это визуализировать места с землетрясениями. Итак, мы хотели бы построить диаграмму рассеяния, где x - долгота, а y - широта.
Мы можем это сделать для небольшого фрейма данных, используя API pandas.plot
и Matplotlib:
%matplotlib inline
small_df.plot.scatter(x='longitude', y='latitude');
Попробуйте заменить inline
на widget
и посмотрите, какие интерактивные возможности доступны в Matplotlib. В некоторых случаях вам может потребоваться перезагрузить страницу и перезапустить блокнот, чтобы она отображалась правильно.
.hvplot
¶Как вы могли увидеть выше, Pandas API легко строит график, где вы можете посмотреть структуру краев тектонических плит, которые во многих случаях соответствуют визуальным краям континентов (например, западная сторона Африки, в центре). Вы можете создать очень похожий график с теми же аргументами, используя hvplot, после импорта hvplot.pandas
для поддержки hvPlot в Pandas:
import hvplot.pandas # noqa: adds hvplot method to pandas objects