【问题标题】:Add last hour mean to every sample of a pandas dataframe将最后一小时的平均值添加到 pandas 数据帧的每个样本
【发布时间】:2021-03-10 04:57:31
【问题描述】:

正如我在标题中所写,给定一个具有多个特征和每分钟粒度的 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 分钟的平均值,在无法计算平均值的地方删除数据。

任何提示将不胜感激

【问题讨论】:

    标签: python pandas datetime time-series feature-engineering


    【解决方案1】:

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

    下面的循环会这样做:

    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
    ..  ..          ..          ..
    

    此解决方案相当慢,尽管您的数据大小可行。 对于更大的数据,最好有更快的解决方案。

    【讨论】:

    • 欢迎您的回复,但我想为数据帧的每个样本(每个原始)获取过去 60 分钟的平均值,删除前 59 个元素,其中不可能获得该平均值
    • 好的,这是对的,我可以修复并将新功能添加到旧数据框中,关于速度我可以如何改进?
    【解决方案2】:

    在我看来我找到了更好的解决方案:

    从例子开始:

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

    【讨论】:

    • 有任何方法可以从索引中选择最后一小时,而不是使用 .loc['1h'] 之类的 60 个观察值???
    • 很好的解决方案!
    猜你喜欢
    • 1970-01-01
    • 2018-08-26
    • 2021-11-09
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2022-07-28
    • 2018-04-17
    • 1970-01-01
    相关资源
    最近更新 更多