用以前数值的平均值继续列

问题描述 投票:0回答:1

我有一些列,都是以日期时间为索引的,我需要根据过去的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天,而不是数据框架中的所有日期。

我试过各种滚动平均数函数,但似乎都需要一个新的列!有谁能帮助我吗?

有谁能帮助我吗?

python pandas datetime average moving-average
1个回答
1
投票

所以通过重复 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天的非南天。.tail()
  • [c].mean() 取c列数值的平均值

1
投票

你有没有试过(假设 df 是一个 pandas.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()

1
投票

这不是最好的解决方案,但它是高度可扩展的。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)
© www.soinside.com 2019 - 2024. All rights reserved.