我有一些列,都是以日期时间为索引的,我需要根据过去的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天,而不是数据框架中的所有日期。
我试过各种滚动平均数函数,但似乎都需要一个新的列!有谁能帮助我吗?
有谁能帮助我吗?
所以通过重复 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列数值的平均值你有没有试过(假设 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()
这不是最好的解决方案,但它是高度可扩展的。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)