Скользящее среднее с пандами со смещением времени - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть набор данных временных меток и значений в пандах.Интервал между временными метками составляет ~ 12 секунд на общем временном промежутке, равном примерно одному году, но иногда есть пропущенные точки (т. Е. Временные ряды нерегулярны, поэтому я не могу использовать фиксированные размеры окон).

Я хочу вычислить скользящие средние значений за интервалы в 1 минуту, но я не получаю ожидаемого поведения.Я нашел похожую проблему здесь , но она использовала сумму, а также предварительные панды 0.19.0.Я использую Pandas 0.23.4.

Пример данных

Time, X
2018-02-02 21:27:00,    75.4356
2018-02-02 21:27:12,    78.29821
2018-02-02 21:27:24,    73.098345
2018-02-02 21:27:36,    78.3331
2018-02-02 21:28:00,    79.111

Обратите внимание, что 2018-02-02 21:27:48 отсутствует.

Для скользящей суммы я мог бы просто заполнить пропущенные значения нулями, но для среднего значения я не хочу, чтобы пропущенные точки считались реальными точками данных (например, я хочу, чтобы окно было суммой(точки данных за данный интервал) / количество точек данных за интервал).

Я хотел бы сделать это для разных отрезков времени (т. Е. 1 мин, 5 мин, 15 мин, 1 час и т. Д.).

Самое близкое к получению фактических значений я должен был сделать:

Код

df['rolling_avg']=df.rolling('1T',on='Time').X.mean()

Насколько я понимаю, это будет 1 минутасредние.

Но тогда я не уверен, как интерпретировать вывод.Я ожидал бы NaN в течение первой 1 + 1 минуты, поскольку нет ничего, на чем можно основывать скользящее среднее, но вместо этого у меня есть значения.

Выход

    Time                X         rolling_avg
0   2018-02-02 21:27:00 75.4356   75.435600
1   2018-02-02 21:27:12 78.29821  76.866905
2   2018-02-02 21:27:24 73.098345 75.610718
3   2018-02-02 21:27:36 78.3331   76.291314
4   2018-02-02 21:28:00 79.111    77.210164

По сути, в этих выходных данных df[1].rolling_avg равен (Value[0]+Value[1])/2, хотя интервал составлял 12 секунд, а не 1 минуту.

Есть ли способ сделать то, что я пытаюсь сделать, или мне нужно написать цикл for, чтобы сделать это вручную?

1 Ответ

0 голосов
/ 13 февраля 2019

Я думаю, что проблема может быть в ваших данных.И тогда, возможно, я не решаю проблему.Я получил ту же ошибку, используя ваши данные, но это сработало, когда я попробовал это.

import  pandas as pd
import numpy as np
import datetime

time = pd.date_range(start='1/1/2018', end='1/02/2018', freq='12s')
time

DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 00:00:12',
               '2018-01-01 00:00:24', '2018-01-01 00:00:36',
               '2018-01-01 00:00:48', '2018-01-01 00:01:00',
               '2018-01-01 00:01:12', '2018-01-01 00:01:24',
               '2018-01-01 00:01:36', '2018-01-01 00:01:48',
               ...
               '2018-01-01 23:58:12', '2018-01-01 23:58:24',
               '2018-01-01 23:58:36', '2018-01-01 23:58:48',
               '2018-01-01 23:59:00', '2018-01-01 23:59:12',
               '2018-01-01 23:59:24', '2018-01-01 23:59:36',
               '2018-01-01 23:59:48', '2018-01-02 00:00:00'],
              dtype='datetime64[ns]', length=7201, freq='12S')

B = np.random.randint(0, 9, 7201)

df = pd.DataFrame(B, time)
df['rolling_avg']=df.rolling('60s', min_periods=3).mean()
df.head(20)

    0                rolling_avg
2018-01-01 00:00:00 5   NaN
2018-01-01 00:00:12 0   NaN
2018-01-01 00:00:24 1   2.0
2018-01-01 00:00:36 0   1.5
2018-01-01 00:00:48 6   2.4
2018-01-01 00:01:00 7   2.8
2018-01-01 00:01:12 6   4.0
2018-01-01 00:01:24 3   4.4
2018-01-01 00:01:36 7   5.8
2018-01-01 00:01:48 6   5.8
2018-01-01 00:02:00 2   4.8
2018-01-01 00:02:12 6   4.8
2018-01-01 00:02:24 1   4.4
2018-01-01 00:02:36 0   3.0
2018-01-01 00:02:48 8   3.4
2018-01-01 00:03:00 2   3.4
2018-01-01 00:03:12 5   3.2
2018-01-01 00:03:24 8   4.6
2018-01-01 00:03:36 4   5.4
2018-01-01 00:03:48 1   4.0
...