如何在python中每周滚动聚合数据?

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但我无法开始这样做。谁能帮我做这个滚动聚合?

Lia*_*ley 5

请参阅此答案: 列上的累积总和和百分比?

和这个: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)