时间序列数据:将数据装箱到每一天,然后按星期几绘制

Mat*_*ttM 4 python matplotlib pandas

我有一个非常简单的 Pandas DataFrame,格式如下:

date        P1      P2      day
2015-01-01  190     1132    Thursday
2015-01-01  225     1765    Thursday
2015-01-01  3427    29421   Thursday
2015-01-01  945     7679    Thursday
2015-01-01  1228    9537    Thursday
2015-01-01  870     6903    Thursday
2015-01-02  785     4768    Friday
2015-01-02  1137    7065    Friday
2015-01-02  175     875     Friday
Run Code Online (Sandbox Code Playgroud)

其中 P1 和 P2 是不同的感兴趣参数。我想为每个 P1 和 P2创建一个看起来像这样的条形图。如数据所示,我每天都有几个值。我想平均给定日期的给定值,然后针对星期几进行绘制(以便将第 1 周星期一的平均值添加到第 2 周星期一等)。

我是 python 的新手,我目前的方法很糟糕,涉及几个循环。我目前有两个专用的代码部分 - 一个用于计算平均值,另一个用于一次完成一周中的每一天并计算绘图结果。有没有更干净的方法来做到这一点?

Bra*_*mon 6

似乎您正在寻找:

df[['day', 'P1']].groupby('day').mean().plot(kind='bar', legend=None)
Run Code Online (Sandbox Code Playgroud)

df[['day', 'P2']].groupby('day').mean().plot(kind='bar', legend=None)
Run Code Online (Sandbox Code Playgroud)

完整示例:

import numpy as np
import pandas as pd

days = ['Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun']
day = np.random.choice(days, size=1000)
p1, p2 = np.random.randint(low=0, high=2500, size=(2, 1000))
df = pd.DataFrame({'P1': p1, 'P2': p2, 'day': day})

# Helps for ordering of day-of-week in plot
df['day'] = pd.Categorical(df.day, categories=days)

# %matplotlib inline

df[['day', 'P1']].groupby('day').mean().plot(kind='bar', legend=None)
df[['day', 'P2']].groupby('day').mean().plot(kind='bar', legend=None)
Run Code Online (Sandbox Code Playgroud)

请注意,在现有数据框调用pd.Categorical如图所示让你自定义排序的关键在这里

结果(对于 P1):

在此处输入图片说明

更新

在你的评论中,你问,

groupby 是否在组的所有实例上找到给定参数(比如 P1)的平均值?例如,如果我有 8 个星期一,结果值是星期一发生的所有数据点的平均值吗?这里的另一个障碍是我对数据的采样不可靠。如果我有一个有 10 个样本的星期一和一个有 1 个样本的星期一,那么简单地平均所有 11 个值就会用小样本量淹没星期一。因此,我想在考虑星期几之前对给定日期的所有值求平均值。

是的,上面的 groupby 会找到所有实例的平均值。以下是您如何获得“双倍”平均值:

# for P1; replace P2 with P1 to find P2 avgs.
df.drop('P2', axis=1).groupby(['date', 'day']).mean()\
    .reset_index().groupby('day').mean().plot(kind='bar', legend=None)
Run Code Online (Sandbox Code Playgroud)