Python 如何在大型数据集上创建交互式图形?

Python 如何在大型数据集上创建交互式图形?,python,scatter-plot,holoviews,datashader,hvplot,Python,Scatter Plot,Holoviews,Datashader,Hvplot,我试图在一个大数据集上使用全息视图创建一个交互式图形。下面是名为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

我试图在一个大数据集上使用全息视图创建一个交互式图形。下面是名为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,但我不知道如何在上面的代码中使用。
我试过的大多数案例似乎都出错了。另外,是否有办法确保时间列转换为微秒?提前感谢您的帮助

decimate()的缺点是它会对您的数据点进行降采样。
我想您需要
datashader()
在这里
,但是datashader不喜欢
ID
是一个分类变量而不是一个数值

因此,一个解决方案是将分类变量转换为数字代码。

请参见下面的代码示例(我更喜欢)和:


有关数据隐藏和抽取的更多信息:


结果图:


Datashader确实没有像这里使用的那样处理分类轴,但这与其说是软件的限制,还不如说是我的想象——它应该如何处理它们?Datashader散点图(Canvas.points)适用于连续索引2D平面上的大量点。这样的图近似于2D概率分布函数,每像素累积点以显示该区域的密度,并显示像素之间的空间模式

分类轴与连续数值轴的属性不同,因为相邻值之间没有空间关系。特别是在这种情况下,ID字段的顺序没有明显的意义(它似乎是体育赛事类型的字母代码),因此我看不出像Datashader设计的那样,在每个像素上累积ID值有什么意义。即使将ID转换为数字,也会得到随机外观的噪声(如果ID值大于垂直像素),或者一系列斑点线(如果ID值小于像素)

在这里,可能只有几十个左右的唯一ID值,但是很多很多时间测量?在这种情况下,大多数人会对每个ID使用方框、提琴、直方图或脊线图来查看每个ID值的值分布。Datashader points图是一个2D直方图,但是如果一个轴是分类的,那么你实际上是在处理一组1D直方图,而不是一个单一的组合2D直方图,所以如果你想要的是直方图,就使用直方图

如果确实希望尝试将每个ID的所有点绘制为原始点,可以使用垂直尖峰事件(如中所示)进行绘制。您也可以添加一些垂直抖动,然后使用Datashader,但目前还不直接支持这种方法,而且它没有普通Datashader绘图所具有的清晰数学解释(就近似密度函数而言)


您能将错误包括在内吗?很难说问题出在哪里。我已经到了一个地步,我想用整个数据,而不仅仅是一个样本来作图。问题是它是57G.txt文件。有没有办法解决这个问题?我已经到了一个点,我想用整个数据,而不仅仅是一个样本来绘制图表。问题是它是57G.txt文件。有办法解决这个问题吗?57GB不应该是datashader的问题。纽约出租车示例使用大文件来:
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)