Скользящее среднее с пандами со смещением времени
У меня есть набор данных временных меток и значений в пандах. Интервал между временными метками составляет ~12 секунд на общем временном промежутке, равном примерно одному году, но иногда есть пропущенные точки (т. Е. Временные ряды нерегулярны, поэтому я не могу использовать фиксированные размеры окон).
Я хочу вычислить скользящие средние значения за интервалы в 1 минуту, но я не получаю ожидаемого поведения. Я нашел похожую проблему здесь, но это было использование суммы, а также предварительных панд 0.19.0. Я использую Панды 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, чтобы сделать это вручную?
2 ответа
Я думаю, что проблема может быть в ваших данных. И тогда, возможно, я не решаю проблему. Я получил ту же ошибку, используя ваши данные, но это сработало, когда я попробовал это.
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
Вы говорите: Но тогда я не уверен, как интерпретировать вывод. Я бы ожидал NaN в течение первых 1+1 минут, так как не на чем основывать скользящее среднее, но вместо этого у меня есть значения.
Метод
.rolling()
учитывает все значения, где индекс находится в 1-минутном интервале. Интервал открыт слева и закрыт справа (). Его правый конец - это текущий индекс (по умолчанию, но вы можете изменить это; используйте необязательный параметр
вы также можете изменить его; используйте необязательный параметр
center
closed
).
В вашем случае первый такой интервал ]
2018-02-02 21:26:00
,], который содержит только индекс
2018-02-02 21:27:00
. Поэтому среднее значение вычисляется только по одному значению.
Поэтому я действительно думаю, что это именно то поведение, которое вы хотите.