【问题标题】:Using Altair on data aggregated from large datasets对从大型数据集中聚合的数据使用 Altair
【发布时间】: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()'
)

【问题讨论】:

    标签: python data-visualization data-science altair vega-lite


    【解决方案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 Vegaaltair-transform,但是这两种方法都还不是很成熟。

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

    【讨论】:

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