对从大型数据集中聚合的数据使用 Altair

Posted

技术标签:

【中文标题】对从大型数据集中聚合的数据使用 Altair【英文标题】:Using Altair on data aggregated from large datasets 【发布时间】:2020-02-13 15:39:52 【问题描述】:

我正在尝试对大型(300,000 条记录)时态数据集的计数进行直方图计算。我现在只是尝试按月绘制直方图,只有 6 个数据点,但是使用 json 或 altair_data_server 存储会导致页面崩溃。纯 Altair 就无法处理好这件事吗?我当然可以在 pandas 中进行预处理,但这会破坏 altair 的美妙声明性。

如果是这样,这是 altair 缺少的功能还是超出了范围?我正在学习 vegalite 存储整个基础数据并在运行时应用转换,但似乎 altair 可以(并且可能确实)有办法只存储图表的相关数据。

alt.Chart(df).mark_bar().encode(
    x=alt.X('month(timestamp):T'),
    y='count()'
)

【问题讨论】:

【参考方案1】:

试试下面:-

alt.data_transformers.enable('default', max_rows=None)

然后

alt.Chart(df).mark_bar().encode(
    x=alt.X('month(timestamp):T'),
    y='count()'
)

您将获得图表,但如果浏览器崩溃,请确保保存所有工作。

【讨论】:

请不要只设置 max_rows=None 而不考虑后果。如果页面因问题中提到的json 转换器或数据服务器转换器而崩溃,那么禁用 max_rows 肯定会做同样的事情,此外还会将整个序列化数据集添加到单元格输出中,如果保存可能会每当您尝试再次使用笔记本时,浏览器都会在加载时崩溃。 @jakevdp 我在回答中也提到过!我不知道你为什么反对它。但有时你有 6000 行但你没有完成它。在这种情况下,这是最简单的解决方案。【参考方案2】:

Altair 图表通过将整个数据集发送到您的浏览器并在前端进行处理来工作;因此,无论数据集如何提供给前端,它都不适用于较大的数据集。

在像您这样的情况下,您在显示之前聚合数据,理论上可以在后端进行聚合,并且只将聚合数据发送到前端渲染器。有一些项目希望让这更加无缝,包括scalable Vega 和altair-transform,但是这两种方法都还不是很成熟。

同时,我建议在 Pandas 中进行聚合,并将聚合数据发送到 Altair 进行绘图。

【讨论】:

感谢您的回答和 altair! altair-transform 是否有正在进行的工作?如果可以的话,我有兴趣做出贡献。有了它,世界将变得更加美丽! 功能的外壳就在那里 - 在存储库中搜索 TODO 以查看需要工作的地方。另一个更复杂的部分是将聚合从编码中推到转换中。 仅供参考 - 我已经向 altair_transform 添加了一些功能,现在应该支持这个用例。见github.com/altair-viz/… 太棒了。感谢您的仅供参考。我已经分叉了它,并正在查看了解一般工作原理,并看看我是否可以实现任何 TODO

以上是关于对从大型数据集中聚合的数据使用 Altair的主要内容,如果未能解决你的问题,请参考以下文章

从大型数据集中采样

JAVA spark数据集中的GroupBy和聚合函数

在大型数据集中查找相关性

使用 Spark 过滤大型数据集中的列

在 BigQuery 中订购大型时间序列数据集以进行导出

查找大型数据集中子字符串的所有匹配项的(行、列)位置