2015-02-09 23 views
0

我有一个数据集,其结构是:日期利润如何在python中实现星期数据的滚动聚合?

数据集的样本是:

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 

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)] 

现在我想做一个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) 

我想看看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()] 

,但我没有得到结果,认为defaultdict不是正确的方式来做到这一点。我也看着pandas,但我无法开始做到这一点。任何人都可以帮助我进行滚动聚合吗?

+1

它看起来像你希望我们为你写一些代码。尽管许多用户愿意为遇险的编码人员编写代码,但他们通常只在海报已尝试自行解决问题时才提供帮助。证明这一努力的一个好方法是包含迄今为止编写的代码,示例输入(如果有的话),期望的输出和实际获得的输出(控制台输出,堆栈跟踪,编译器错误 - 无论是适用)。您提供的细节越多,您可能会收到的答案就越多。 – 2015-02-09 20:42:46

+0

另外,什么定义了一个星期;是星期一还是星期天是一周的开始? – 2015-02-09 20:43:04

+0

这个数据的格式是什么?它是否分类?日期已经解析成对象还是仅仅是字符串? – 2015-02-09 20:43:35

回答

3

看到这个答案: Cumulative sum and percentage on column?

这: 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() 

输出:

  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 
+0

以上的更新后的帖子我想每周做滚动总和。所以对于2013-06-21到2013-06-27的一周,将会有一个滚动总和,但是从2013年6月28日开始,它应该从新鲜开始并且不会将之前2013-06-27的值计入 – 2015-02-10 02:10:51

+0

@JasonDonnald:也许[文档可以在这里帮助](http://pandas.pydata.org/pandas-docs/dev/computation.html#moving-rolling-statistics-moments)? – 2015-02-10 14:39:31

+0

@JasonDonnald刚更新为每周累积。我确实阅读了原始评论,并且我认为您可以先完成更多搜索,但是您确实发布了代码以创建我欣赏的df。我喜欢解决我在自己的工作中不会遇到的假互联网点问题。 – 2015-02-10 19:30:48