将最后一小时的平均值添加到 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]
正如我在标题中所写,给定一个具有多个特征和每分钟粒度的 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]