Скользящие средние Python для данных временных рядов с непоследовательными точками данных - PullRequest
0 голосов
/ 09 октября 2018

Я нашел много информации, касающейся скользящих средних, когда данные выбираются через регулярные интервалы (например, 1 мин, 5 мин и т. Д.).Однако мне нужно решение для набора данных временных рядов с нерегулярными временными интервалами.

Набор данных содержит два столбца: Timestamp и Price.Временная метка уменьшается до миллисекунды, и для строк нет заданного интервала.Мне нужно взять мой фрейм данных и добавить три столбца скользящих средних:

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.

1 Ответ

0 голосов
/ 11 октября 2018

Следующие работы, за исключением NaN - я не знаю, насколько вы привязаны к ним:

foo  = df.apply(lambda x: df[(df['Timestamp'] <= x['Timestamp']) & (df['timestamp']> x['timestamp'] - pd.Timedelta('5 min'))]['Price'].mean(), axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...