2016-12-02 8 views
1

私は、日付をX軸として、いくつかの累積数をYとしてプロットしようとしています。altairの累積数

私のようなアイテムのセットがあります。この例では

id1 date1 user1 
id2 date2 user1 
id3 date3 user2 

を、私はX軸は3つのエントリ(日付1、日付2、date3)を持っているだろう、プロットは2行を持つようにしたいと思いますし、 user1は、date1に1、date2に2、date3に2のY値を持ちます。 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人のユーザーと数千のエントリがあります。

+0

私はパンダの操作を経由して必要なプロットを作成するには、以下の答えているが、問題にタブを維持する価値があるかもしれない:https://github.com/altair-viz/ altair/issues/348 –

答えて

1

私はAltairで累積集計がまだ利用できないと思います。その間、パンダで対応する操作を行うことができます。ここにそのような方法があります。私はそうするより効率的な方法があると確信しています。

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

+1

あなたの答えをありがとう!この目的のために、私はあなたが提案したようにそれをしましたが、きれいではありません。 – Sildar