我想查看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()
我想要实现的是获取“值”列的计数和总和,按“客户”分组各个时间段(每月,每季度,每年 - 我可能会为此数据构建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
我可以通过获取每个条目(或月份或年份)的季度来附加该数据框,然后使用Pandas
groupby
函数,但这似乎是我应该使用时的额外工作TimeSeries
。
我已阅读文档并审核了Wes的TimeSeries
演示文稿,但我看不到为客户端执行groupby
的方法,然后执行TimeSeries
我正在尝试构建的时间段(或者 - 我可以运行for loop
并以这种方式构建数据框,但是再次 - 似乎比应该更多的工作。)
有没有办法将groupby
流程与TimeSeries
合并?
答案 0 :(得分:9)
在执行groupby之前,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
...
注意:在执行此操作之前,您无需进行排序。
答案 1 :(得分:4)
这样的东西?我是先做一个groupby,然后在每个组上应用重新采样。
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])