pandas 按类别和时间间隔分组的条形图

gpfsuwkq  于 2023-10-14  发布在  其他
关注(0)|答案(1)|浏览(86)

我有一个pandas框架中的请求响应时间的数据

execution_time  request_type    response_time_ms    URL     Error
2   2023-10-12 08:52:16     Google  91.0    https://www.google.com  NaN
3   2023-10-12 08:52:16     CNN     115.0   https://edition.cnn.com     NaN
6   2023-10-12 08:52:27     Google  90.0    https://www.google.com  NaN
7   2023-10-12 08:52:27     CNN     105.0   https://edition.cnn.com     NaN
10  2023-10-12 08:52:37     Google  5111.0  https://www.google.com  NaN

它包含请求的时间,request_type只是网站名称和响应时间。
我想实现的是一个条形图,组的中位数响应时间的网站(请求类型)和时间框架,说组每4小时在一起。这应该表明响应时间因白天而异。
我设法创造了情节,但着色是“关闭”。我的问题是,我希望不同的网站颜色不同。
到目前为止我所拥有的:

df_by_time = df.groupby(["request_type", pd.Grouper(key="execution_time", freq="4h")]).agg({"response_time_ms": ["median"]})
df_by_time.plot(kind='bar', figsize=(8, 6), title='Response Times', xlabel='Type', ylabel='Response time [ms]', rot=90)

这导致下面的图像:

我想:

  • 将时间分组在一起,以便每个时间只出现一次,每个网站都有不同颜色的堆栈
  • 或者至少在这个图中不同的网站用不同的颜色
  • 去掉传说中的“没有,没有”

我怎么才能做到这一点?

5vf7fwbs

5vf7fwbs1#

如果我理解正确的话,你需要用'median'聚合,而不是['median']来避免MultiIndex,那么你可以使用seaborn.barplot

import seaborn as sns

df_by_time = (df.groupby(["request_type", pd.Grouper(key="execution_time",
                                                     freq="4h")])
                .agg({"response_time_ms": "median"})
                .reset_index()
             )

sns.barplot(data=df_by_time, x='execution_time', y='response_time_ms',
            hue='request_type')

或者,使用groupby.median生成Series,使用unstack使用pandas的plot.bar

df_by_time = (df.groupby(["request_type", pd.Grouper(key="execution_time", freq="4h")])
                ['response_time_ms'].median()
                .unstack('request_type')
             )

df_by_time.plot.bar()

输出量:

每20秒聚合一次,向您显示多个时间组的行为:

相关问题