как анализировать данные временных рядов как функцию времени дня в пандах - PullRequest
0 голосов
/ 27 ноября 2018

Предположим, у меня есть случайная выборка данных, которые собираются каждые 1 минуту в течение месяца.Затем предположим, что я хочу использовать pandas, чтобы проанализировать эти данные как функцию времени дня и увидеть разницу между выходными и днем ​​недели.Я могу сделать это в pandas, если мой индекс равен DateTimeIndex, рассчитав время дня в виде десятичного значения 0-1, вручную разбивая результаты с интервалами в 10 минут (или как угодно), а затем нанося на график результаты, используяbins столбец, чтобы фактически рассчитать средние значения за временные интервалы дня, а затем вручную установить мои позиции тиков и метки во что-то понятное.

Тем не менее, это выглядит немного странно, и мне интересно, есть ливстроенные функции панд для достижения такого же вида анализа.Я пока не смог их найти.

dates = pd.date_range(start='2018-10-01', end='2018-11-01', freq='min')
vals = np.random.rand(len(dates))
df = pd.DataFrame(data={'dates': dates, 'vals': vals})
df.set_index('dates', inplace=True)

# set up a column to make the time of day a value from 0 to 1
df['day_fraction'] = (df.index.hour + df.index.minute / 60) / 24

# bin the time of day to analyze data during 10 minute intervals
df['day_bins'] = df['day_fraction'] - df['day_fraction'] % (1 / 24 / 6)

ax = df.plot('day_fraction', 'vals', marker='o', color='pink', alpha=0.05, label='')
df.groupby('day_bins')['vals'].mean().plot(ax=ax, label='average')
df[df.index.weekday < 5].groupby('day_bins')['vals'].mean().plot(ax=ax, label='weekday average')
df[df.index.weekday >= 5].groupby('day_bins')['vals'].mean().plot(ax=ax, label='weekend average')

xlabels = [label if label else 12 for label in [i % 12 for i in range(0, 25, 2)]]
xticks = [i / 24 for i in range(0, 25, 2)]
ax.set_xticks(xticks)
ax.set_xticklabels(xlabels)
ax.set_xlabel('time of day')
ax.legend()

enter image description here

1 Ответ

0 голосов
/ 27 ноября 2018

Я думаю, вам просто нужно использовать groupby с большим количеством встроенных .dt аксессоров.Сгруппируйте на основе дня недели или выходных, а затем формируйте ячейки каждые 10 минут (с .floor) и рассчитайте среднее значение.

Настройка

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

dates = pd.date_range(start='2018-10-01', end='2018-11-01', freq='min')
vals = np.random.rand(len(dates))
df = pd.DataFrame(data={'dates': dates, 'vals': vals})
df.set_index('dates', inplace=True)

Сюжет

df1 = (df.groupby([np.where(df.index.weekday < 5, 'weekday', 'weekend'),
                   df.index.floor('10min').time])
         .mean()
         .rename(columns={'vals': 'average'}))

fig, ax = plt.subplots(figsize=(12,7))
df1.unstack(0).plot(ax=ax)  
# Plot Full Average
df.groupby(df.index.floor('10min').time).mean().rename(columns={'vals': 'average'}).plot(ax=ax)
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...