2017-10-20 87 views
1

我有一個CSV文件看起來像這樣:如何重新組合數據框並累積colume的值?

date      price  volume 
2017-10-17 01:00:11.031 51.91  1 
2017-10-17 01:00:11.828 51.91  1 
2017-10-17 01:00:12.640 51.91  1 
2017-10-17 01:00:13.140 51.90  -9 
2017-10-17 01:00:15.328 51.90  -5 
2017-10-17 01:00:16.531 51.90  1 
2017-10-17 01:00:16.531 51.89  -2 
2017-10-17 01:00:19.937 51.90  1 
2017-10-17 01:00:24.546 51.90  1 
2017-10-17 01:00:25.250 51.90  1 
2017-10-17 01:00:32.843 51.89  -9 
2017-10-17 01:00:42.859 51.89  -5 
2017-10-17 01:00:43.453 51.89  -1 
2017-10-17 01:00:43.546 51.90  1 
2017-10-17 01:00:45.953 51.90  7 
... 

我想打一個數據幀,顯示多少量有所每5一刻才積累,在每一個價格水平。

例如,如果最高和最低價格分別爲51.21和51.11 2017年10月17日00:05之間的00:00〜2017年10月17日,結果將是:

datetime     price  pos_volume  neg_volume 
2017-10-17 00:00   51.21  3    4 
         51.20  21    23 
         51.19  44    21 
         51.18  31    33 
         ... 
         51.14  14    21 
         51.13  30    29 
         51.12  2    3 
         51.11  5    1 

有兩列來區分正面和負面的數量。

我想我可以做到這一點,如果我使用很多條件循環,但我想知道是否有更多pythonic簡單的方法來做到這一點。謝謝您閱讀此篇!

+1

你見過'df.resample'? –

+0

@cᴏʟᴅsᴘᴇᴇᴅ哦,謝謝!我會查找它 – maynull

回答

2

可以使用np.where分隔正和負值,則用樞軸與桌子索引作爲grouper與頻率爲5分鐘,然後使用如aggfunccount(它忽略NaN值)。

df['pos_vol'] = np.where(df['volume']>0,df['volume'],np.nan) 
df['neg_vol'] = np.where(df['volume']<0,df['volume'],np.nan) 

ndf = df.pivot_table(values=['pos_vol','neg_vol'],index=[pd.Grouper(key='date', freq='5min'),'price'],aggfunc='count') 

輸出:

 
          neg_vol pos_vol 
date    price     
2017-10-17 01:00:00 51.89  4  0 
        51.90  2  6 
        51.91  0  3 

對於排序索引可以使用ndf = ndf.sort_index(level=1,ascending=False)

輸出:

 
          neg_vol pos_vol 
date    price     
2017-10-17 01:00:00 51.91  0  3 
        51.90  2  6 
        51.89  4  0 
+1

不錯,使用'pd.Grouper'。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅThankyou,一週前回答了類似的問題。考慮到這一點。 – Dark

+1

@Bharath shetty非常感謝你的幫助! :) – maynull