Jas*_*ald 1 python aggregation python-itertools pandas
我有一个数据集,其结构是:Date Profit
数据集的一个示例是:
Date Profit
2013-06-21 14
2013-06-22 19
2013-06-23 11
2013-06-24 13
2013-06-25 6
2013-06-26 22
2013-06-27 22
2013-06-28 3
2013-06-29 5
2013-06-30 10
2013-07-01 17
2013-07-02 14
2013-07-03 9
2013-07-04 7
Run Code Online (Sandbox Code Playgroud)
Sample input 是 :
data = [('2013-06-21',14),
('2013-06-22',19),
('2013-06-23',11),
('2013-06-24',13),
('2013-06-25',6),
('2013-06-26',22),
('2013-06-27',22),
('2013-06-28',3),
('2013-06-29',5),
('2013-06-30',10),
('2013-07-01',17),
('2013-07-02',14),
('2013-07-03',9),
('2013-07-04',7)]
Run Code Online (Sandbox Code Playgroud)
现在我想做一个rolling aggregation并存储聚合。通过滚动聚合,我的意思是说对于第 1 周(2013-06-21 到 2013-06-27),我想添加前一个日期的利润并将其与当前日期一起存储。因此,对于2013-06-21总和将是14唯一的,因为它是一周的第一天,但然后2013-06-22它应该是的总和previous date (2013-06-21)与current date (2013-06-22)这应该与当前的日期一起存储。这将持续到本周末,然后下周它将再次重新开始,新周没有以前的日期。所以第一周sample output应该是这样的:
Date Profit
2013-06-21 14
2013-06-22 33 #(14 + 19)
2013-06-23 44 #(33 + 11)
2013-06-24 57 #(44 + 13)
2013-06-25 63 #(57 + 6)
2013-06-26 85 #(63 + 22)
2013-06-27 107 #(85 + 22)
Run Code Online (Sandbox Code Playgroud)
我试着看看defaultdict并做到了这一点:
def aggregate(data, key, value, func):
measures_dict = collections.defaultdict(list)
for k,v in zip(data[key], data[value]):
measures_dict[k].append(v)
return [(k,func(measures_dict[k])) for k in measures_dict.keys()]
Run Code Online (Sandbox Code Playgroud)
但我没有得到结果,并认为这defaultdict不是正确的方法。我也看过,pandas但我无法开始这样做。谁能帮我做这个滚动聚合?
请参阅此答案: 列上的累积总和和百分比?
和这个:http : //pandas.pydata.org/pandas-docs/stable/basics.html#basics-dt-accessors 和这个:http : //pandas.pydata.org/pandas-docs/stable/groupby.html
每周累积更新:
df = pd.DataFrame(data)
df.columns = ['Date','Profit']
df['Date'] = pd.to_datetime(df['Date'])
df['weekofyear'] = df['Date'].dt.weekofyear
df.reset_index('Date')
df.sort_index(inplace=True)
df['Weekly_Cum'] = df.groupby('weekofyear').cumsum()
Run Code Online (Sandbox Code Playgroud)
输出:
Date Profit weekofyear Weekly_Cum
0 2013-06-21 14 25 14
1 2013-06-22 19 25 33
2 2013-06-23 11 25 44
3 2013-06-24 13 26 13
4 2013-06-25 6 26 19
5 2013-06-26 22 26 41
6 2013-06-27 22 26 63
7 2013-06-28 3 26 66
8 2013-06-29 5 26 71
9 2013-06-30 10 26 81
10 2013-07-01 17 27 17
11 2013-07-02 14 27 31
12 2013-07-03 9 27 40
13 2013-07-04 7 27 47
Run Code Online (Sandbox Code Playgroud)