Pandas中有一个groupby的TimeSeries



我想查看Pandas中不同时间段内每个客户端的TimeSeries数据。

import pandas as pd
import numpy as np
import random
clients = np.random.randint(1, 11, size=100)
dates = pd.date_range('20130101',periods=365)
OrderDates = random.sample(list(dates),100)
Values = np.random.randint(10, 250, size=100)

df = pd.DataFrame({ 'Client' : clients,'OrderDate' : OrderDates, 'Value' : Values})
df = df.sort_values(['OrderDate', 'Client'], ascending=['True', 'True'])
df.head()
#     Client  OrderDate  Value
# 36       3 2013-01-11     40
# 55       4 2013-01-12    192
# 54       8 2013-01-15    130
# 48      10 2013-01-17    153
# 78       9 2013-01-22    171

我试图完成的是获得"价值"列的计数和总和,按不同时间段的"客户"分组(每月、每季度、每年-我可能会为此数据构建3个不同的数据帧,然后使数据帧"宽")。

对于Quarterly,我期待这样的东西:

Client      OrderDate       NumberofEntries SumofValues
1           2013-03-31      7               28
1           2013-06-30      2               7
1           2013-09-30      6               20
1           2013-12-31      1               3
2           2013-03-31      1               4
2           2013-06-30      2               8
2           2013-09-30      3               17
2           2013-12-31      4               24

我可以通过获取每个条目的季度(或月或年)来附加该数据帧,然后使用Pandasgroupby函数,但当我应该使用TimeSeries时,这似乎是额外的工作。

我已经阅读了文档,并查看了Wes的TimeSeries演示,但我看不出有什么方法可以为客户端执行groupby,然后在我试图构建的时间段内执行TimeSeries(或者,我可以运行for loop并以这种方式构建数据帧,但同样,这似乎比应该做的工作更多。)

有没有办法将groupby过程与TimeSeries结合起来?

在进行分组之前,可以选择set_index

In [11]: df.set_index('OrderDate', inplace=True)
In [12]: g = df.groupby('Client')
In [13]: g['Value'].resample('Q', how=[np.sum, len])
Out[13]: 
sum  len
Client OrderDate           
1      2013-03-31  239    1
2013-06-30   83    1
2013-09-30  249    2
2013-12-31  506    3
2      2013-03-31  581    4
2013-06-30  569    4
2013-09-30  316    4
2013-12-31  465    5
...

注意:在执行此操作之前,您不需要进行排序。

类似的东西?我首先进行分组,然后对每个分组应用重采样。

In [11]: grouped = df.groupby('Client')
In [12]: result = grouped.apply(lambda x: x.set_index('OrderDate').resample('Q', how=[np.sum, len]))
In [13]: result['Value']
Out[13]: 
sum  len
Client OrderDate            
1      2013-03-31   227    4
2013-06-30   344    2
2013-09-30   234    1
2      2013-03-31   299    2
2013-06-30   538    4
2013-09-30   236    2
2013-12-31  1124    7
3      2013-03-31   496    4
2013-06-30   NaN    0
2013-09-30   167    2
2013-12-31   218    1

更新:在@AndyHayden的回答中,这变得更干净了:

df = df.set_index('OrderDate')
grouped = df.groupby('Client')
grouped['Value'].resample('Q', how=[np.sum, len])

最新更新