altair 的累积计数

Posted

技术标签:

【中文标题】altair 的累积计数【英文标题】:Cumulative count with altair 【发布时间】:2017-04-17 11:15:31 【问题描述】:

我正在尝试以日期为 X 轴和几个累积计数为 Ys 来绘制数据。

我有一组物品,例如:

id1 date1 user1
id2 date2 user1
id3 date3 user2

在此示例中,我希望绘图有 2 条线,X 轴将包含三个条目(date1、date2、date3),并且 user1 在 date1 处的 Y 值为 1,在 date2 处为 2,2在日期3; user2 在 date1 为 0,在 date2 为 0,在 date3 为 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 个用户和几千个条目。

【问题讨论】:

虽然我在下面回答了通过 Pandas 的操作制作所需的情节,但可能值得关注这个问题:github.com/altair-viz/altair/issues/348 【参考方案1】:

我认为 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')

【讨论】:

感谢您的回答!为此,我按照您的建议进行了操作,尽管没有那么干净。

以上是关于altair 的累积计数的主要内容,如果未能解决你的问题,请参考以下文章

从 Pandas 数据框中另一个系列分段的日期累积计数创建增量计数

累积条件计数

两个值匹配 pandas 时的累积计数

重复的累积计数

过去 X 个月内的 PostgreSQL 累积计数

获取每个二维数组的累积计数