熊猫中的时间序列箱线图

Posted

技术标签:

【中文标题】熊猫中的时间序列箱线图【英文标题】:Time-series boxplot in pandas 【发布时间】:2014-12-17 21:36:08 【问题描述】:

如何为 pandas 时间序列创建箱线图,其中我每天都有一个方框?

每小时数据的示例数据集,其中一个框应包含 24 个值:

import pandas as pd
n = 480
ts = pd.Series(randn(n),
               index=pd.date_range(start="2014-02-01",
                                   periods=n,
                                   freq="H"))
ts.plot()

我知道我可以为当天制作一个额外的专栏,但我希望有适当的 x 轴标签和 x 限制功能(如在 ts.plot() 中),以便能够使用日期时间索引会很棒。

对于 R/ggplot2 here 有一个类似的问题,如果它有助于澄清我想要什么。

【问题讨论】:

这个here 可能有一个更好的解决方案,它只使用Pandas,它的.boxplot().pivot() 函数并且不需要Seaborn 【参考方案1】:

如果它适合您,我建议使用 Seaborn,它是 Matplotlib 的包装器。您可以通过循环遍历时间序列中的组来自己完成,但这需要更多的工作。

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

n = 480
ts = pd.Series(np.random.randn(n), index=pd.date_range(start="2014-02-01", periods=n, freq="H"))


fig, ax = plt.subplots(figsize=(12,5))
seaborn.boxplot(ts.index.dayofyear, ts, ax=ax)

这给出了:

请注意,我将 day of year 作为 grouper 传递给 seaborn,如果您的数据跨越多年,这将不起作用。然后你可以考虑这样的事情:

ts.index.to_series().apply(lambda x: x.strftime('%Y%m%d'))

编辑,对于 3 小时,您可以将其用作石斑鱼,但它仅在没有定义分钟或更低的情况下才有效。 :

[(dt - datetime.timedelta(hours=int(dt.hour % 3))).strftime('%Y%m%d%H') for dt in ts.index]

【讨论】:

我实际上确实使用 seaborn,所以这绝对是一个选择。谢谢! /edit:有什么方法可以在任意时间使用它,例如3 小时箱线图、7 天箱线图等? 是的,您可以将任何东西传递给 Seaborns grouper。挑战是从系列的索引中定义组。我添加了一个以 3 小时为单位的示例。类似的东西可以在任意时间段内起作用。不幸的是,它的可读性不是很好,也许可以通过使用 Pandas Timegrouper 进行一些简化。在 Seaborns grouper 上打开一个特定问题可能会从经常使用 Seaborn 的人那里得到一些帮助,但我不是。【参考方案2】:

(没有足够的代表来评论接受的解决方案,所以添加一个答案。)

接受的代码有两个小错误:(1)需要添加numpy import 和(2)需要在boxplot 语句中交换xy 参数。以下产生所示的情节。

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

n = 480
ts = pd.Series(np.random.randn(n), index=pd.date_range(start="2014-02-01", periods=n, freq="H"))

fig, ax = plt.subplots(figsize=(12,5))
seaborn.boxplot(ts.index.dayofyear, ts, ax=ax)

【讨论】:

你是最棒的!【参考方案3】:

我有一个可能有用的解决方案——它只使用原生 pandas 并允许分层日期时间分组(即跨越年份)。关键是,如果您将函数传递给groupby(),它将在数据帧索引的每个元素上调用。如果您的索引是 DatetimeIndex(或类似的),您可以访问 dt 的所有便利功能进行重采样!

试试这个:

n = 480
ts = pd.DataFrame(np.random.randn(n), index=pd.date_range(start="2014-02-01", periods=n, freq="H"))
ts.groupby(lambda x: x.strftime("%Y-%m-%d")).boxplot(subplots=False, figsize=(12,9), rot=90)

【讨论】:

在上面的代码中添加 plt.show() 以获取图形。还将 matplotlib.pyplot 导入为 plt.

以上是关于熊猫中的时间序列箱线图的主要内容,如果未能解决你的问题,请参考以下文章

如何按熊猫中的中值对箱线图进行排序

向熊猫数据框箱线图添加标签?

带有熊猫和 Jupyter 笔记本的交互式箱线图

为熊猫箱线图(groupby)设置无标题

使用熊猫的箱线图

更改熊猫中箱线图的面色