Как рассчитать среднее значение другого таймфрейма на реальных данных?

Я борюсь с ресэмплингом и средним вычислением таймсерии. Мой пример работает правильно НО он не выглядит оптимизированным для меня, для больших фреймов данных он будет медленным.

Пример:

import pandas as pd
import numpy as np

df = pd.DataFrame(data={
    'open': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'low': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1],
    'high': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
    'close': [1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5]
}, index=pd.date_range('2018-01-01 00:00:00', freq='T', periods=10))

df
                     open  low  high  close
2018-01-01 00:00:00     1  0.1    10    1.5
2018-01-01 00:01:00     2  0.2    20    2.5
2018-01-01 00:02:00     3  0.3    30    3.5
2018-01-01 00:03:00     4  0.4    40    4.5
2018-01-01 00:04:00     5  0.5    50    5.5
2018-01-01 00:05:00     6  0.6    60    6.5
2018-01-01 00:06:00     7  0.7    70    7.5
2018-01-01 00:07:00     8  0.8    80    8.5
2018-01-01 00:08:00     9  0.9    90    9.5
2018-01-01 00:09:00    10  1.0   100   10.5

затем я передискретизирую до 5T для каждого индекса df, потому что мне нужно вычислить среднее значение до этого индекса на более высокой частоте (5T) и поместить значение mean () в основной фрейм данных df.

Чтобы моделировать, что мне нужно сделать, посмотрите полный код передискретизации:

ohlc = {'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last'}
sma = []
for row in df.itertuples():
    sma.append(df.loc['2018-01-01 00:00:00':row.Index].resample('5T', closed='left', label='left').apply(ohlc)['close'].rolling(2).mean().tail(1)[0])

df['5t_sma'] = sma

Работает отлично. Результат:

df
                     open  low  high  close  5t_sma
2018-01-01 00:00:00     1  0.1    10    1.5     NaN
2018-01-01 00:01:00     2  0.2    20    2.5     NaN
2018-01-01 00:02:00     3  0.3    30    3.5     NaN
2018-01-01 00:03:00     4  0.4    40    4.5     NaN
2018-01-01 00:04:00     5  0.5    50    5.5     NaN
2018-01-01 00:05:00     6  0.6    60    6.5     6.0
2018-01-01 00:06:00     7  0.7    70    7.5     6.5
2018-01-01 00:07:00     8  0.8    80    8.5     7.0
2018-01-01 00:08:00     9  0.9    90    9.5     7.5
2018-01-01 00:09:00    10  1.0   100   10.5     8.0

Значения верны, но есть проблемы:

  1. Я делаю передискретизацию по каждому индексу, звучит слишком тяжело.
  2. Я знаю, что могу вычислять среднее значение каждые 5 минут индекса, не передавая диапазон loc[start:end], проблема в том, что он предполагает, что я хочу проанализировать весь фрейм данных сразу, Я не могу этого сделать, я должен относиться к этому как к «живым данным». Каждую минуту я получаю обновление с данными за 1 минуту (открытие, минимум, максимум, закрытие), а затем мне нужно вычислить среднее значение на старшем таймфрейме.

Могу ли я получить тот же результат, не слишком сильно напрягая панд (0,23,4)? :)

FWIW, простая скользящая средняя 5t - это просто rolling(5).mean(). Понятия не имею, почему вы делаете кумулятивное среднее значение с полуночи ...

TheMaster 11.09.2018 01:57
1
1
46
0

Другие вопросы по теме