Различное поведение с использованием базового аргумента в Pandas повторной выборке в зависимости от частоты повторной выборки - PullRequest
3 голосов
/ 14 января 2020

Я борюсь с аргументом "base", используя pandas resample :

Ниже приведен минимальный пример с данными за 5 минут. Я использую Pandas 0.25.1 . Цель состоит в том, чтобы получить скользящее среднее с размером окна 24 часа, но только один раз в час (зеленые точки). Вот почему я использую аргумент "base" в pandas resample и сдвигаю его.

Если частота повторной выборки равна 23h, все как и ожидалось (верхний подзаговор). Но с 24h (нижний участок) происходит другое поведение: кажется, что базовый аргумент вообще не действует, зеленые точки перекрываются.

Редактировать для пояснения: функция, которую я хотел бы применить, может быть любой произвольной функцией и не обязательно должна быть «mean ()». Я использовал "mean ()" только для удобства.

Как я могу решить эту проблему?

Заранее большое спасибо!

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters
%matplotlib inline

register_matplotlib_converters()

df_5min = pd.DataFrame()
df_5min['DATETIME']=pd.date_range("2020-01-13 00:00:00", "2020-01-15 23:55:00", freq="5min")
df_5min.set_index('DATETIME', inplace=True)

t=np.linspace(0,6.28*3,len(df_5min.index))
df_5min['RAW']=np.cos(t)*t+t

df_5min['RAW_rolling_24h']=df_5min['RAW'].rolling(pd.Timedelta('24 hour')).mean()

result=[]
for base in range(0,24, 1):
    s=(df_5min['RAW'].resample(pd.Timedelta('24 hour'), base=base, loffset=pd.Timedelta('24 hour')).mean())
    s.rename('RAW_resampled_24h', inplace=True)
    result.append(s)
df_5min_resampled_24h = pd.concat(result)


df_5min['RAW_rolling_23h']=df_5min['RAW'].rolling(pd.Timedelta('23 hour')).mean()

result=[]
for base in range(0,23, 1):
    s=(df_5min['RAW'].resample(pd.Timedelta('23 hour'), base=base, loffset=pd.Timedelta('23 hour')).mean())
    s.rename('RAW_resampled_23h', inplace=True)
    result.append(s)
df_5min_resampled_23h = pd.concat(result)


fig, ax = plt.subplots(2, 1, figsize=(17,12),sharex=True)
ax[0].plot(df_5min['RAW'], color='blue', label='RAW')
ax[0].plot(df_5min['RAW_rolling_23h'], color='red', label='RAW rolling mean 23h')
ax[0].plot(df_5min_resampled_23h, 'o', color='green',alpha=0.3, label='RAW resampled 23h sliding base')
ax[0].legend(loc='upper left')

ax[1].plot(df_5min['RAW'], color='blue', label='RAW')
ax[1].plot(df_5min['RAW_rolling_24h'], color='red', label='RAW rolling mean 24h')
ax[1].plot(df_5min_resampled_24h, 'o', color='green',alpha=0.3, label='RAW resampled 24h sliding base')
ax[1].legend(loc='upper left')

ax[0].set_xlim("2020-01-13 00:00:00", "2020-01-16 00:30:00")
plt.show()

enter image description here

...