如何为大熊猫时间序列创建一个箱线图,我每天都有一个盒子?
每小时数据的样本数据集,其中一个框应包含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也存在类似问题,如果它有助于澄清我想要的内容。
答案 0 :(得分:10)
如果它是您的选项,我建议使用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]
答案 1 :(得分:8)
(没有足够的代表对已接受的解决方案发表评论,因此请添加答案。)
接受的代码有两个小错误:(1)需要添加numpy
导入和(2)nned以交换x
中的y
和boxplot
参数声明。以下是产生的图表。
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)
答案 2 :(得分:0)
我有一个可能有用的解决方案-它仅使用本地熊猫,并允许分层的日期时间分组(即跨年)。关键在于,如果将函数传递给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)