Altair 的累计计数
Cumulative count with altair
我正在尝试以日期作为 X 轴并以多个累积计数作为 Y 来绘制数据。
我有一组项目,例如:
id1 date1 user1
id2 date2 user1
id3 date3 user2
在这个例子中,我希望绘图有 2 条线,X 轴有三个条目(日期 1、日期 2、日期 3),用户 1 在日期 1 的 Y 值为 1,在日期 2 为 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 个用户和几千个条目。
我认为 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')
我正在尝试以日期作为 X 轴并以多个累积计数作为 Y 来绘制数据。
我有一组项目,例如:
id1 date1 user1
id2 date2 user1
id3 date3 user2
在这个例子中,我希望绘图有 2 条线,X 轴有三个条目(日期 1、日期 2、日期 3),用户 1 在日期 1 的 Y 值为 1,在日期 2 为 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 个用户和几千个条目。
我认为 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')