我有以下通用格式的數據,我想重新取樣到30天有一系列窗口:Python的大熊貓:重新取樣多元時間序列與GROUPBY
'customer_id','transaction_dt','product','price','units'
1,2004-01-02,thing1,25,47
1,2004-01-17,thing2,150,8
2,2004-01-29,thing2,150,25
3,2017-07-15,thing3,55,17
3,2016-05-12,thing3,55,47
4,2012-02-23,thing2,150,22
4,2009-10-10,thing1,25,12
4,2014-04-04,thing2,150,2
5,2008-07-09,thing2,150,43
我想在30天的窗口啓動於2014-01-01至2011年12月31日結束。不保證每個客戶都會在每個窗口中都有記錄。如果一個客戶在一個窗口中有多個交易,那麼它將對價格進行加權平均,對這些單位進行求和,然後對產品名稱進行拼接,爲每個客戶每個窗口創建一條記錄。
我有什麼到目前爲止是這樣的:
wa = lambda x:np.average(x, weights=df.loc[x.index, 'units'])
con = lambda x: '/'.join(x))
agg_funcs = {'customer_id':'first',
'product':'con',
'price':'wa',
'transaction_dt':'first',
'units':'sum'}
df_window = df.groupby(['customer_id', pd.Grouper(freq='30D')]).agg(agg_funcs)
df_window_final = df_window.unstack('customer_id', fill_value=0)
如果有人知道一些更好的方式來處理這個問題(特別是就地和/或矢量方法),我將不勝感激。理想情況下,我也想將窗口開始日期和停止日期作爲列添加到行中。
最後的輸出應該是這樣的理想:
'customer_id','transaction_dt','product','price','units','window_start_dt','window_end_dt'
1,2004-01-02,thing1/thing2,(weighted average price),(total units),(window_start_dt),(window_end_dt)
2,2004-01-29,thing2,(weighted average price),(total units),(window_start_dt),(window_end_dt)
3,2017-07-15,thing3,(weighted average price),(total units),(window_start_dt),(window_end_dt)
3,2016-05-12,thing3,(weighted average price),(total units),(window_start_dt),(window_end_dt)
4,2012-02-23,thing2,(weighted average price),(total units),(window_start_dt),(window_end_dt)
4,2009-10-10,thing1,(weighted average price),(total units),(window_start_dt),(window_end_dt)
4,2014-04-04,thing2,(weighted average price),(total units),(window_start_dt),(window_end_dt)
5,2008-07-09,thing2,(weighted average price),(total units),(window_start_dt),(window_end_dt)
加權平均價格需要用於其用於求隨着權重。什麼是重量。而且,爲了不存在歧義,最終的結果應該是什麼樣子,以便那些決定在提交答案之前幫助他們做出比較的人。 – piRSquared
對不起,如果它是令人困惑的,這應該是計算加權平均價格從一個窗口中的單位總數在groupby:wa = lambda x:np.average(x,weights = df.loc [x.index ,'units']) – Pylander
價格的權重是(#)個單位。 – Pylander