使用先前值的平均值继续列
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 的平均值
你试过了吗(假设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)
我有许多列都按日期时间索引,我需要根据过去 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 的平均值
你试过了吗(假设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)