2013-04-30 78 views
2

我正在用交易數據進行數據分析。我想用熊貓來檢查交易者活躍的時間。熊貓:將重採樣與groupby結合並計算時差

特別是,我嘗試提取的差異在每個交易者對每一天的每一個第一次交易的日期之間分鐘,並累積按月

的數據是這樣的:

Timestamp (Datetime) | Buyer | Volume 
-------------------------------------- 
2012-01-01 09:00:00 | John | 10 
2012-01-01 10:00:00 | Mark | 10 
2012-01-01 16:00:00 | Mark | 10 
2012-01-01 11:00:00 | Kevin | 10 
2012-02-01 10:00:00 | Mark | 10 
2012-02-01 09:00:00 | John | 10 
2012-02-01 17:00:00 | Mark | 10 

現在我使用重採樣來檢索每天的第一筆交易。但是,我想也由買方將其分組以計算其交易日期的差異。像這樣

Timestamp (Datetime) | Buyer | Volume 
-------------------------------------- 
2012-01-01 09:00:00 | John | 10 
2012-01-01 10:00:00 | Mark | 10 
2012-01-01 11:00:00 | Kevin | 10 
2012-01-02 10:00:00 | Mark | 10 
2012-01-02 09:00:00 | John | 10 

總的來說,我期待計算每個交易者每日第一筆交易之間的分鐘差異。

更新

例如,在約翰對2012-01-01的情況下:距離= 60(DIFF約翰嘜)+ 120(DIFF約翰 - 凱文)= 180

我如果有人有一個想法如何做到這一點,將高度讚賞。

謝謝

+0

你能添加一些預期的輸出嗎? (例如,爲你的例子手動創建) – Jeff 2013-04-30 22:49:02

回答

3

你的原始幀(重採樣一個)

In [71]: df_orig 
Out[71]: 
    buyer    date volume 
0 John 2012-01-01 09:00:00  10 
1 Mark 2012-01-01 10:00:00  10 
2 Kevin 2012-01-01 11:00:00  10 
3 Mark 2012-01-02 10:00:00  10 
4 John 2012-01-02 09:00:00  10 

設置索引的日期欄,記錄日期欄到位

In [75]: df = df_orig.set_index('date',drop=False) 

創建此聚合功能

def f(frame): 
    frame.sort('date',inplace=True) 
    frame['start'] = frame.date.iloc[0] 
    return frame 

GROUPBY單日

In [74]: x = df.groupby(pd.TimeGrouper('1d')).apply(f) 

在幾分鐘內創建

In [86]: x['diff'] = (x.date-x.start).apply(lambda x: float(x.item().total_seconds())/60) 

In [87]: x 
Out[87]: 
           buyer    date volume    start diff 
      date                    
2012-01-01 2012-01-01 09:00:00 John 2012-01-01 09:00:00  10 2012-01-01 09:00:00  0 
      2012-01-01 10:00:00 Mark 2012-01-01 10:00:00  10 2012-01-01 09:00:00 60 
      2012-01-01 11:00:00 Kevin 2012-01-01 11:00:00  10 2012-01-01 09:00:00 120 
2012-01-02 2012-01-02 09:00:00 John 2012-01-02 09:00:00  10 2012-01-02 09:00:00  0 
      2012-01-02 10:00:00 Mark 2012-01-02 10:00:00  10 2012-01-02 09:00:00 60 

差分這裏的解釋。我們使用TimeGrouper按日期進行分組,其中一個幀被傳遞給函數f。這個函數然後使用當天的第一個日期(這裏需要排序)。你從入口日期減去這個timedelta64,然後按摩到幾分鐘(由於一些numpy問題,這是有點hacky,應該在0.12更自然)

感謝您的更新,我原本以爲你想要每個買家的差異,而不是來自第一個買家,但這只是一個小調整。

更新:

要跟蹤買家的名稱,以及(對應於開始日期),只包括 它在函數f

def f(frame): 
    frame.sort('date',inplace=True) 
    frame['start'] = frame.date.iloc[0] 
    frame['start_buyer'] = frame.buyer.iloc[0] 
    return frame 

然後可以在年底這個GROUPBY:

In [14]: x.groupby(['start_buyer']).sum() 
Out[14]: 
      diff 
start_buyer  
John   240 
+0

嗨,傑夫,非常感謝。這正是我所期待的。然而,你是對的,我也試圖計算每個買家的差異(這將是凱文:120(約翰 - 凱文)+60(馬克 - 約翰)= 180),並最終將這些每日總和彙總爲每月粒度約翰180(2012-01-01)+ 60(2012-01-02)= 240)。你會如何做到這一點? – Andy 2013-05-01 13:22:38

+0

我添加了一個更新,我認爲這是你想要的。此外,您可能需要每月在整個事件上設置一個TimeGrouper,以便每月進行彙總,但應該是一個簡單的擴展 – Jeff 2013-05-01 13:31:22