2015-02-09 24 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