将最后一小时的平均值添加到 pandas 数据帧的每个样本

Add last hour mean to every sample of a pandas dataframe

正如我在标题中所写,给定一个具有多个特征和每分钟粒度的 pandas 数据框,我想将每分钟最后 1 小时的平均值添加为新特征。

我该怎么做?

示例:

import pandas as pd
import datetime
import numpy as np

date_today = datetime.datetime.now()
days = pd.date_range(date_today, date_today + datetime.timedelta(10), freq='T')
data=[]
for i in range(3):
    np.random.seed(seed=i)
    data.append(np.random.randint(1, high=100, size=len(days)))
    
df = pd.DataFrame({'Datetime': days, 'feature1': data[0],'feature2': data[1],'feature3': data[2]})
df = df.set_index('Datetime')
df.index = df.index.map(lambda x: x.replace(second=0,microsecond=0))

所以现在我想为 df 中的每个特征添加过去 60 分钟的平均值,删除无法计算该平均值的数据。

如有任何提示,我们将不胜感激

在您的评论中,您要求计算前 60 行的每一行的平均值。这意味着滚动 window.

下面的循环可以做到这一点:

rolling_avg = pd.DataFrame(columns=['f1', 'f2', 'f3'])

for i in range(df.shape[0]):
    if i<60: print(i, df.index[i], str('computation previous 60 minutes not possible'))
    else: rolling_avg.loc[i] = list(df.iloc[i-60:i,[0,1,2]].mean())

最后,预期结果:

rolling_avg

f1  f2  f3
60  48.733333   45.083333   54.433333
61  49.316667   45.150000   54.483333
62  48.600000   46.316667   54.766667
..  ..          ..          ..

虽然您的数据大小可行,但此解决方案相当慢。 对于更大的数据,最好有一个更快的解决方案。

我找到了我认为更好的解决方案:

从示例开始:

df_new=df.rolling('1h').mean()
df_final=pd.merge(df, df_new, left_index=True, right_index=True)
df_final[60:-1]