pandas 在x轴上显示日期的箱线图时间序列

z9smfwbn  于 2023-04-10  发布在  其他
关注(0)|答案(1)|浏览(106)

我准备了一个Pandas DataFrame:

df = pd.read_csv("data/pm25.csv")
df['date'] = pd.to_datetime(df['date'])

start_date = pd.to_datetime("2022-01-01T00:00:00.000Z")
end_date = pd.to_datetime("2022-12-31T00:00:00.000Z")
mask = (df['date'] >= start_date) & (df['date'] <= end_date)
df = df.loc[mask]

df.set_index('date', inplace=True)
min     max     median q1   q3     stdev  count
date                                                                      
2022-01-01 00:00:00+00:00  1.63   92.83    3.99  2.87  6.13  10.013    562
2022-01-02 00:00:00+00:00  0.70  122.47    2.97  2.40  3.79  10.038    552
2022-01-03 00:00:00+00:00  0.67   41.77    2.60  1.70  3.17   3.534    555
2022-01-04 00:00:00+00:00  0.60  122.47    2.17  1.40  3.60   7.237    565
2022-01-05 00:00:00+00:00  1.10   47.30    3.37  2.97  3.85   3.410    560
...                         ...     ...     ...   ...   ...     ...    ...
2022-12-27 00:00:00+00:00  1.17   32.67    2.20  1.93  2.57   1.459    535
2022-12-28 00:00:00+00:00  0.60    2.43    1.20  1.00  1.40   0.298    491
2022-12-29 00:00:00+00:00  0.50   10.40    1.50  0.92  2.20   0.896    553
2022-12-30 00:00:00+00:00  0.60   24.13    1.90  1.07  2.60   2.120    463
2022-12-31 00:00:00+00:00  0.40   93.60    1.40  0.80  2.29   6.909    536

[363 rows x 7 columns]>

现在我想把它画成一个箱线图。日期(大约365)应该显示在x轴上,每天都应该有一个盒子。
除了pandas和matplotlib,我不想使用任何其他库。我如何选择数据,让我像上面描述的那样显示它?我似乎只设法在x轴上显示列(min,max,median,...)...

4jb9z9bj

4jb9z9bj1#

当你使用聚合数据时,你不能使用ax.boxplot,但你仍然可以使用ax.bxp。但是,你必须计算一些缺失的数据,如iqrwhishiwhislo
从你的dataframe,你可以做:

data = (df.set_axis(df.index.strftime('%Y-%m-%d')).reset_index()
          .rename(columns={'date': 'label', 'median': 'med'})
          .assign(iqr=lambda x: x['q3'] - x['q1'],
                  whishi=lambda x: x['q3'] + 1.5*x['iqr'],
                  whislo=lambda x: x['q1'] - 1.5*x['iqr'])
          .to_dict('records'))

fig, ax = plt.subplots(figsize=(10, 8))
ax.bxp(data, showfliers=False)
ax.set_xticklabels(ax.get_xticklabels(), rotation=45)
plt.show()

输出:

相关问题