Предположим, у меня есть случайная выборка данных, которые собираются каждые 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()
