TimeSeries与Pandas中的groupby

mik*_*sey 7 python pandas

我想查看TimeSeries各个时间段内每个客户的数据Pandas.

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(dates,100)
Values = np.random.randint(10, 250, size=100)


df = pd.DataFrame({ 'Client' : clients,'OrderDate' : OrderDates, 'Value' : Values})

df = df.sort(['OrderDate', 'Client'], ascending=['True', 'True'])

df.head()
Run Code Online (Sandbox Code Playgroud)

我想要完成的是获取"值"列的计数和总和,按"客户"分组各个时间段(每月,每季度,每年 - 我可能会为此数据构建3个不同的数据帧,然后制作数据帧"广泛").

对于季度,我希望这样的事情:

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
Run Code Online (Sandbox Code Playgroud)

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

我已经阅读了文档并审阅了TimeSeriesWes 的演示,但我没有看到groupby为客户做一个方法,然后在TimeSeries我尝试构建的时间段内执行(或者 - 我可以运行for loop并构建这样的数据框架,但再次 - 似乎比应有的更多的工作.)

有没有办法将groupby流程与TimeSeries

And*_*den 9

稍微替代方法是set_index在进行groupby之前:

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
...
Run Code Online (Sandbox Code Playgroud)

注意:在执行此操作之前,您无需进行排序.


jor*_*ris 4

像这样的东西吗?我首先进行分组,然后对每个组应用重新采样。

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
Run Code Online (Sandbox Code Playgroud)

更新:根据 @AndyHayden 在他的回答中的建议,这变得更加清晰的代码:

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