为一天中的每个小时绘制直方图 Pandas/matplotlib

Plotting histogram in Pandas/matplotlib for each hour of the day

我有一个每小时粒度的时间序列数据集,显示一年中一天中每个小时的资产价格 return。

我正在尝试为一天中的每个小时绘制 returns 的分布,并认为可能有一种方法可以按小时对 returns 进行分组,然后绘制直方图每小时 - 所以 loop/function/method 的输出(即我要实现的目标)将是 24 个分布图,显示整个时间内一天中每小时的 returns 分布期间。

我当前的数据框被多重索引为 DayHour(这可能无法实现我的目标,如果需要我可以更改它)。

我能够使用 groupby 在时间范围 (df.groupby("Hour").mean()) 内获得 return 的每小时平均值,并且我认为我可以使用类似的方法来绘制我的分布图。

如有任何关于如何实现此目标的建议,我们将不胜感激

具有非常简单数据的示例(仅上午 9 点到 10 点和上午 10 点到 11 点,持续 3 天):

import pandas as pd
import matplotlib.pyplot as plt

arrays = [[1, 1, 2, 2, 3, 3], [9, 10, 9, 10, 9, 10]]
ind = pd.MultiIndex.from_arrays(arrays, names=['Day', 'Hour'])
df = pd.DataFrame({'Price': [34, 35, 37, 31, 30, 29]}, index=ind)

for hour, group in df.groupby("Hour"):
    group.plot(kind='hist', bins=10, title=f'{hour}:00 - {hour+1}:00')
    plt.show()


是的,groupby 已经准确地完成了您想要的操作——将 DataFrame 分组。 然后您可以轻松地遍历这些组并单独绘制每个组。 (事实上​​ ,对我来说,在组列表上调用 .mean() 是不太直观的事情。)。这是按组打印每个组的输出:

          Price
Day Hour       
1   9        34
    10       35
2   9        37
    10       31
3   9        30
    10       29

(9,           Price
Day Hour       
1   9        34
2   9        37
3   9        30)
(10,           Price
Day Hour       
1   10       35
2   10       31
3   10       29)