使用先前值的平均值继续列

Continue column with average of previous values

我有许多列都按日期时间索引,我需要根据过去 n(假设在本例中为 4)天对某些列进行预测。

          A  B  C
31-12-201917 19 49
1-1-2020  4  9  2
2-1-2020  2  23 3
3-1-2020  8  23 7
4-1-2020  6  21 4
5-1-2020  5
6-1-2020  5
7-1-2020  5
8-1-2020  5
9-1-2020  5
10-1-2020 5 
11-1-2020 5

因此,所需的输出将过去 4 天的平均值作为每个未来日期的该列的相应值(如 A 列所示)。请注意,它应该只需要最后 4 天,而不是数据框中的所有日期。

我尝试了各种滚动 ave 函数,但似乎都需要一个新列!

有人可以帮忙吗?

因此,通过在列中重复 5 个值,我假设它就像用从一些平均中获得的常数值填充 NaN 一样简单,对吗?

那么怎么样:

for c in df.columns:
    df[c].fillna(
        df[df[c].notna()].tail(4)[c].mean(),
        inplace=True
    )
  • .fillna() 简单地填充 NaN 值
  • df[df[c].notna()].tail(4) 为您提供最近 4 天的非 nan 天数。随意更改 .tail()
  • 的值
  • [c].mean() 计算列 c
  • 的平均值

你试过了吗(假设dfpandas.DataFrame):

days_logged = 5
rolling_days = 4
cols = ['B', 'C']

for col in cols:
    for i in range(days_logged, len(df.index)):
        df[col].iloc[i] =  df[col].iloc[i - rolling_days: i].mean()

这不是最好的解决方案,但它具有高度可扩展性。 df.update 在这些情况下是您的救星。

import pandas as pd

df = pd.DataFrame([[17, 19, 49],
                   [4, 9, 2],
                   [2, 23, 3],
                   [8, 23, 7],
                   [6, 21, 24],
                   [5, "", ""],
                   [5, "", ""],
                   [5, "", ""],
                   [5, "", ""],
                   [5, "", ""],
                   [5, "", ""],
                   [5, "", ""]], columns=list("ABC"))

df.index = pd.date_range(start="12-31-2019", end="01-11-2020", freq="D")

def forecast(df):
    last_day = df.iloc[-1]
    new_day = last_day.name + pd.Timedelta(days=1)
    new_data = df.loc[last_day.name - pd.Timedelta(days=3):last_day.name, :].mean()
    new_data.name = new_day
    return new_data

num_predict_days = 7
columns_to_predict = ['B', 'C']

available_data = df.shape[0] - num_predict_days
df_to_predict = df.iloc[:available_data, :].loc[:, columns_to_predict]

for i in range(num_predict_days):
    df_to_predict = df_to_predict.append(forecast(df_to_predict))

df.update(df_to_predict)