取滚动和函数中前一组的最后一个值?PandasPython

2024-04-27 00:10:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一个函数,根据滚动窗口上的特定索引求和/平均。在

我的数据如下:

Date (L0)   Date - (L1) Value   4-Period-L0-Sum 
12/31/2011  1/25/2012   1321    
3/31/2012   4/25/2012   1457    
6/30/2012   7/25/2012   2056    
9/30/2012   10/26/2012  3461    8295
12/31/2012  1/24/2013   2317    9291
3/31/2013   4/24/2013   2008    9842
6/30/2013   7/24/2013   1885    9671
6/30/2013   7/27/2013   1600    9386
9/30/2013   10/29/2013  1955    7880
9/30/2013   11/1/2013   1400    7325
12/31/2013  1/28/2014   1985    6993
12/31/2013  1/30/2014   1985    6993
3/31/2014   4/24/2014   1382    6367
3/31/2014   4/25/2014   1200    6185
6/30/2014   7/23/2014   2378    6963
9/30/2014   10/21/2014  3826    9389
3/31/2015   4/28/2015   2369    9773
3/31/2015   4/30/2015   2369    9773

我正在尝试生成pd滚动总和(dataframe,window=4),但根据level=0索引(Date(L0))并使用先前level=0索引项中的最后一个值。例如,要计算期间的滚动和

^{pr2}$

我的解决方案是使用一个扩展窗口groupby level 0,然后取尾和:

def custom_sum(datadf, period):            
    idx_range = np.arange(n)       
    mm = period * 2 + 4   
    tmpdf = pd.concat(
                map(lambda i:
                    pd.DataFrame( datadf.iloc[ :i], ].
                                 groupby(level=0,axis=0).tail(1).tail(period).
                                 sum(skipna=False) 
                                ).T
                    , idx_range[period:] ))
    tmpdf.index = datadf.index[period-1:]
    return tmpdf

虽然它跑得很慢。我相信一定有更好的办法。在

一种方法可能是使用pd.加重适用(),但它没有保留要对其应用函数的dataframe,因此无法获得正确的GroupBy索引。。在

谢谢!在


Tags: 函数dataframedateindexrangelevelperiodtail
1条回答
网友
1楼 · 发布于 2024-04-27 00:10:15

可以按如下方式使用groupby:

import pandas as pd

text = """DateL1   DateL2 Value   Sum 
12/31/2011  1/25/2012   1321    
3/31/2012   4/25/2012   1457    
6/30/2012   7/25/2012   2056    
9/30/2012   10/26/2012  3461    8295
12/31/2012  1/24/2013   2317    9291
3/31/2013   4/24/2013   2008    9842
6/30/2013   7/24/2013   1885    9671
6/30/2013   7/27/2013   1600    9386
9/30/2013   10/29/2013  1955    7880
9/30/2013   11/1/2013   1400    7325
12/31/2013  1/28/2014   1985    6993
12/31/2013  1/30/2014   1985    6993
3/31/2014   4/24/2014   1382    6367
3/31/2014   4/25/2014   1200    6185
6/30/2014   7/23/2014   2378    6963
9/30/2014   10/21/2014  3826    9389
3/31/2015   4/28/2015   2369    9773
3/31/2015   4/30/2015   2369    9773"""

from io import BytesIO

df = pd.read_csv(BytesIO(text), delim_whitespace=True, parse_dates=[0], index_col=0)
s1 = pd.rolling_sum(df.groupby(df.index, sort=False).Value.last(), 4)

def f(s):
  return s - s.iat[-1]

s2 = df.groupby(df.index, sort=False).Value.transform(f).fillna(0)

print s1 + s2

输出如下:

^{pr2}$

相关问题 更多 >