Как создать интерактивный график на большом наборе данных? - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь создать интерактивный график, используя holoviews на большом наборе данных. Ниже приведен пример файла данных с именем trackData.cvs

Event         Time             ID     Venue    
Javeline      11:25:21:012345  JVL    Dome
Shot pot      11:25:22:778929  SPT    Dome
4x4           11:25:21:993831  FOR    Track
4x4           11:25:22:874293  FOR    Track
Shot pot      11:25:21:087822  SPT    Dome
Javeline      11:25:23:878792  JVL    Dome
Long Jump     11:25:21:892902  LJP    Aquatic
Long Jump     11:25:22:799422  LJP    Aquatic

. Таким образом, я читаю данные и строю график рассеяния.

trackData = pd.read_csv('trackData.csv')
scatter = hv.Scatter(trackData, 'Time', 'ID')
scatter

Потому что этот набор данных довольно большой, увеличение и уменьшение графика рассеяния очень медленное, и хотелось бы ускорить этот процесс. Я исследовал и обнаружил, что holoviews decimate рекомендуется для больших наборов данных, но я не знаю, как его использовать в приведенном выше коде. В большинстве случаев, которые я пробовал, кажется, выдается ошибка. Кроме того, есть ли способ убедиться, что столбец Time преобразован в микро? Заранее спасибо за помощь

Ответы [ 2 ]

2 голосов
/ 02 февраля 2020

Datashader действительно не обрабатывает категориальные оси, как здесь, но это не столько ограничение программного обеспечения, сколько мое воображение - что должно делать с ними? Диаграмма рассеяния Datashader (Canvas.points) предназначена для очень большого числа точек, расположенных на непрерывно индексируемой 2D-плоскости. Такой график аппроксимирует двухмерную функцию распределения вероятности, накапливая точки на пиксель, чтобы показать плотность в этой области, и выявляя пространственные закономерности по пикселям.

Категориальная ось не обладает теми же свойствами, что и непрерывная числовая ось, поскольку между смежными значениями нет пространственной связи. В частности, в этом случае нет никакого очевидного смысла в упорядочении поля идентификатора (кажется, что это буквенный код для типа спортивного события), поэтому я не вижу смысла накапливать значения идентификатора на пиксель так, как это делает Datashader. предназначен для этого. Даже если вы конвертируете идентификаторы в числа, вы получите либо случайный шум (если значений идентификаторов больше, чем вертикальных пикселей), либо серию пятнистых линий (если значений идентификаторов меньше, чем пикселей).

Здесь, может быть, есть только несколько десятков или около того уникальных значений идентификаторов, но много, много измерений времени? В этом случае большинство людей будет использовать прямоугольник, скрипку, гистограмму или гистограмму для каждого идентификатора, чтобы увидеть распределение значений для каждого значения идентификатора. График точек Datashader - это 2D гистограмма, но если одна ось является категориальной, вы действительно имеете дело с набором 1D гистограмм, а не с одной комбинированной 2D гистограммой, поэтому просто используйте гистограммы, если вы ищете.

Если вы действительно хотите попробовать построить все точки для каждого идентификатора как необработанные точки, вы можете сделать это, используя события вертикального всплеска, как в https://examples.pyviz.org/iex_trading/IEX_stocks.html. Вы также можете добавить некоторое вертикальное дрожание и затем использовать Datashader, но это прямо сейчас не поддерживается, и у него нет четкой математической интерпретации, которую делает обычный график Datashader (в терминах аппроксимации функции плотности).

stocks taxi tips

1 голос
/ 30 января 2020

Недостаток decimate() в том, что он уменьшает ваши точки данных.
Я думаю, вам нужно datashader() здесь , но dataashader не нравится, что ID является категориальной переменной вместо числовое значение.

Таким образом, может быть решение преобразовать вашу категориальную переменную в числовой код.

См. Пример кода ниже для обоих hvPlot (который я предпочитаю) и HoloViews :

import io
import pandas as pd
import hvplot.pandas
import holoviews as hv
# dynspread is for making point sizes larger when using datashade
from holoviews.operation.datashader import datashade, dynspread

# sample data
text = """
    Event         Time             ID     Venue    
    Javeline      11:25:21:012345  JVL    Dome
    Shot pot      11:25:22:778929  SPT    Dome
    4x4           11:25:21:993831  FOR    Track
    4x4           11:25:22:874293  FOR    Track
    Shot pot      11:25:21:087822  SPT    Dome
    Javeline      11:25:23:878792  JVL    Dome
    Long Jump     11:25:21:892902  LJP    Aquatic
    Long Jump     11:25:22:799422  LJP    Aquatic
"""

# create dataframe and parse time
df = pd.read_csv(io.StringIO(text), sep='\s{2,}', engine='python')
df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S:%f')
df = df.set_index('Time').sort_index()

# get a column that converts categorical id's to numerical id's
df['ID'] = pd.Categorical(df['ID'])
df['ID_code'] = df['ID'].cat.codes

# use this to overwrite numerical yticks with categorical yticks
yticks=[(0, 'FOR'), (1, 'JVL'), (2, 'LJP'), (3, 'SPT')]

# this is the hvplot solution: set datashader=True
df.hvplot.scatter(
    x='Time', 
    y='ID_code', 
    datashade=True,
    dynspread=True,
    padding=0.05, 
).opts(yticks=yticks)

# this is the holoviews solution
scatter = hv.Scatter(df, kdims=['Time'], vdims=['ID_code'])
dynspread(datashade(scatter)).opts(yticks=yticks, padding=0.05)


Более подробная информация о даташере и десятичном коде:
http://holoviews.org/user_guide/Large_Data.html

Итоговый участок:

using datashader for large data

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...