【问题标题】:Python Moving Averages for Time Series Data with Inconsistent Data Points具有不一致数据点的时间序列数据的 Python 移动平均值
【发布时间】:2019-03-14 16:30:43
【问题描述】:

当数据以固定间隔(即 1 分钟、5 分钟等)进行采样时,我发现了大量与移动平均线相关的信息。但是,我需要一个针对时间间隔不规则的时间序列数据集的解决方案。

数据集包含两列,时间戳和价格。时间戳下降到毫秒,并且没有设置行的间隔。我需要获取我的数据框并添加三个移动平均列:

1 分钟 5分钟 10 分钟

我不想对数据进行重新采样,我希望最终结果的行数相同,但在适用的情况下填充了三列。 (IE、NaN 分别到每列的 1/5/10 分钟间隔)

我觉得我快接近了,但不知道如何将移动平均变量传递给这个函数:

import pandas as pd
import numpy as np

# Load IBM data from CSV
df = pd.read_csv(
    "C:/Documents/Python Scripts/MA.csv", names=['Timestamp',
                                                            'Price'])
# Create three moving average signals
df['Timestamp'] = pd.to_datetime(df['Timestamp'], errors='coerce')
df.set_index('Timestamp', inplace=True)


def movingaverage(values, window):
    weights = np.repeat(1.0, window)/window
    smas = np.convolve(values, weights, 'valid')
    return smas


MA_1M = movingaverage(df, 1)
MA_5M = movingaverage(df, 5)
MA_10M = movingaverage(df, 10)

print(MA_1M)

示例数据:

Timestamp               Price
2018-10-08 04:00:00.013 152.59
2018-10-08 04:00:00.223 156.34
2018-10-08 04:01:00.000 152.73
2018-10-08 04:05:00.127 156.34
2018-10-08 04:10:00.000 152.73

Expected Output:

Timestamp               Price  MA_1M  MA_5M  MA10M
2018-10-08 04:00:00.013 152.59 N/A    N/A    N/A  
2018-10-08 04:00:00.223 156.34 N/A    N/A    N/A 
2018-10-08 04:01:00.000 154.73 154.55 N/A    N/A 
2018-10-08 04:05:00.127 155.34 155.34 155.47 N/A 
2018-10-08 04:10:00.000 153.73 153.73 154.54 154.55

在每一行,MA 列采用该时间戳并回顾 1、5 或 10 分钟并计算平均值。使这变得困难的事情是可以在任何毫秒内生成行。在我上面的代码中,我只是试图让移动平均线与时间变量一起工作。我假设只要行数匹配,我就可以使用逻辑向我的 df 添加一列。

【问题讨论】:

  • 能否包含您的数据帧样本以及该样本数据帧的预期输出?
  • @rahlf23 我​​已经编辑了我的帖子以包含所请求的信息。
  • 该示例似乎与描述不符:04:00:00.023 不在04:05:00.127 的五分钟内,但仍包含在五分钟平均值中。
  • 糟糕,我是手工把它放在一起的。我将毫秒更改为 5 分钟内。
  • 时间而不是观察中使用滑动窗口,并使用1 / diff(Timestamp)来加权平均值呢? stackoverflow.com/q/14631139/2954547

标签: python pandas numpy dataframe time-series


【解决方案1】:

以下工作,除了 NaN - 我不知道您对这些的依恋程度:

foo  = df.apply(lambda x: df[(df['Timestamp'] <= x['Timestamp']) & (df['timestamp']> x['timestamp'] - pd.Timedelta('5 min'))]['Price'].mean(), axis=1)

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    相关资源
    最近更新 更多