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

我有一组项目,例如:

id1 date1 user1
id2 date2 user1
id3 date3 user2


在此示例中,我希望绘图具有2条线,X轴将具有三个条目(date1,date2,date3),而user1的Y值在date1处为1,在date2处为2,在date3处为2; 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')


python - Altair的累计计数-LMLPHP

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

10-09 08:55