python - Altair 的累积计数

标签 python data-visualization altair

我正在尝试绘制数据,其中日期为 X 轴,多个累积计数为 Ys。

我有一组元素,例如:

id1 date1 user1
id2 date2 user1
id3 date3 user2

在这个例子中,我希望绘图有 2 条线,X 轴将有三个条目(日期 1、日期 2、日期 3),用户 1 在日期 1 处的 Y 值为 1,在日期 2 处为 2,2在日期3; user2 在日期 1 处有 0,在日期 2 处有 0,在日期 3 处有 1。

直接制作图表,我看不出应该用什么来获得这个累计计数。例如

Chart(data).mark_line().encode(x='date:T', y='count(*)', color='username')

显然创建了一个大多数值为 0 的图表(很少有条目具有完全相同的日期)。

理想情况下,

Chart(data).mark_line().encode(x='date:T', y='cumcount(*)', color='username')

可以工作,但似乎没有等效的 in the documentation .

在我的真实案例中,几个月内我有大约 10 个用户和几千个条目。

最佳答案

我认为 Altair 中尚不支持累积计数聚合。同时,可以在Pandas中进行相应的操作。这是一种这样的方法。我确信可以有更有效的方法来做到这一点。

import pandas as pd
import numpy as np
np.random.seed(0)
user_list = ['user1', 'user2']
df = pd.DataFrame({'date':range(2000, 2010),
                  'username':np.random.choice(user_list, 10)})

这就是 df 的样子。

    date    username
0   2000    user1
1   2001    user2
2   2002    user2
3   2003    user1
4   2004    user2
5   2005    user2
6   2006    user2
7   2007    user2
8   2008    user2
9   2009    user2
交叉制表
d = pd.crosstab(df.date, columns=df.username).cumsum()
d = d.stack().reset_index()
d = d.rename(columns={0:'CummulativeCount'})

这是d.head()的输出。

date    username    CummulativeCount
0   2000    user1   1
1   2000    user2   0
2   2001    user1   1
3   2001    user2   1
4   2002    user1   1

现在,我们可以使用 Altair,而无需担心任何聚合。

from altair import Chart
c = Chart(d)
c.mark_line().encode(x='date:T', y='CummulativeCount:Q', color='username')

enter image description here

关于python - Altair 的累积计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40933985/

相关文章:

python - python re中的可能错误

python - Airflow 如何使用 Oracle Hook 执行查询

python - 有没有办法使 Google Cloud Pub/Sub 架构字段成为可选字段?

javascript - D3 - 具有负值的路径

python - 如何将默认值传递给 Altair 编码

python - Altair 中的垂直多面图表

python - Pandas Dataframe 过滤列并返回列名称

javascript - 在 Svelte 中存储远程数据的位置,以便使用 Svelte 和 D3 进行响应式数据可视化(最佳实践)

javascript - d3.js 在追加时不返回动态构造的 html 元素

python - Altair 并排分组条形图而不是单个图表