gpt4 book ai didi

group-by - Pandas:将重采样与 groupby 结合起来并计算时间差

转载 作者:行者123 更新时间:2023-12-04 04:59:33 25 4
gpt4 key购买 nike

我正在用交易数据进行数据分析。我想使用 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 上的 John 的情况下:Dist = 60 (Diff John-Mark) + 120 (Diff John-Kevin) = 180

如果有人知道如何做到这一点,我将不胜感激。

谢谢

最佳答案

您的原始帧(重新采样的帧)

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,然后将其按摩为分钟(由于一些 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

关于group-by - Pandas:将重采样与 groupby 结合起来并计算时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16309739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com