【问题标题】:Calculating Rolling Mean Over Time [duplicate]计算随时间推移的滚动平均值[重复]
【发布时间】:2020-03-28 09:18:34
【问题描述】:

我有一个如下的数据框:


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,数据的平均值1 为 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_mean 来堆叠结果。

【问题讨论】:

标签: python pandas for-loop statistics rolling-computation


【解决方案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】:

    我认为最好使用 Quang Hoang 的解决方案,但另一种方法是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2018-05-08
      • 1970-01-01
      • 2020-06-06
      相关资源
      最近更新 更多