分享
三行代码  ›  专栏  ›  技术社区  ›  teteh May

计算随时间推移的滚动平均值

  •  0
  • teteh May  · 技术社区  · 1 周前

    我有一个数据框架如下:

    
    df = pd.DataFrame([['2019-01-01',2,5],['2019-01-02',15,8],['2019-01-03',1,9],['2019-01-04',10,20],['2019-01-05',5,15]],columns = ['date','data1','data2'])
    
             date  data1  data2
    0  2019-01-01      2      5
    1  2019-01-02     15      8
    2  2019-01-03      1      9
    3  2019-01-04     10     20
    4  2019-01-05      5     15
    
    

    我想计算每两天的滚动平均值,并将结果放入一个新的数据框架中。例如,对于日期2019-01-01和2019-01-02,data1的平均值为8.5,data2的平均值为6.5,那么对于日期2019-01-02和2019-01-03,data1的平均值为8,data2的平均值为8.5。我的原始数据帧比这个大,所以我不想一个一个地这样做,我更喜欢创建循环或者如果可能的话矢量化。我的目标是得到下面的数据框架

             date  data1  data2
    0  2019-01-02    8.5    6.5
    1  2019-01-03    8.0    8.5
    2  2019-01-04    5.5   14.5
    3  2019-01-05    7.5   17.5
    

    我的尝试:

    def my_attempt(df):
        result = []
        start_date = datetime.datetime.strptime('2019-01-01','%Y-%m-%d')
        start_date = start_date.date()
        for i in range(5):
            df1 = df.loc[df['date'].isin([str(start_date + datetime.timedelta(days = i)),str(start_date + datetime.timedelta(days = i) + datetime.timedelta(days = 1))])]
            df1_mean = df1.mean()
        result += df1_mean
        return result
    

    这不起作用,因为df1.mean()提供的格式与我想要得到的格式不同,并且无法使用result+=df1\u mean对结果进行堆栈。

    2 回复  |  直到 1 周前
        1
  •  1
  •   Quang Hoang    1 周前

    既然你的问题是关于时间的,最好把日期改成 datetime :

    df.date = pd.to_datetime(df.date)
    
    df.rolling('2D', min_periods=2, on='date').mean().dropna()
    

    输出:

          date  data1  data2            
    2019-01-02    8.5    6.5
    2019-01-03    8.0    8.5
    2019-01-04    5.5   14.5
    2019-01-05    7.5   17.5
    
        2
  •  0
  •   mermaldad    1 周前

    我认为使用广宏的解决方案更好,但另一种方法是:

    (df.set_index('date').iloc[1:] + df.set_index('date').shift(1).iloc[1:]) / 2