我正在使用交易数据进行数据分析。我想用Pandas来检查交易者活跃的时间。
特别是,我尝试提取每个交易者每天第一笔交易日期之间的分钟差异,并将其累计为每月
数据如下所示:
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的情况:Dist = 60(Diff John-Mark)+ 120(Diff John-Kevin)= 180
如果有人知道如何做到这一点,我将非常感激。
谢谢
答案 0 :(得分: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
按单日期分组
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,然后按摩到几分钟(这有点hacky现在因为一些numpy问题,应该在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
然后可以在最后分组:
In [14]: x.groupby(['start_buyer']).sum()
Out[14]:
diff
start_buyer
John 240