时间序列数据:每天的bin数据,然后按星期几绘制

时间:2017-12-11 16:40:48

标签: python pandas matplotlib

我有一个非常简单的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

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

我是python的新手,我当前的方法非常讨厌,涉及几个循环。我目前有两个专门的代码部分 - 一个用于执行平均值,另一个用于每周一次执行一次,并计算绘图的结果。有更清洁的方法吗?

1 个答案:

答案 0 :(得分:4)

好像你正在寻找:

df[['day', 'P1']].groupby('day').mean().plot(kind='bar', legend=None)

df[['day', 'P2']].groupby('day').mean().plot(kind='bar', legend=None)

完整示例:

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)

请注意,在您现有的DataFrame上,对pd.Categorical的调用会为您提供自定义排序键,如here所示。

结果(对于P1):

enter image description here

更新

在你的评论中你问过,

  

groupby是否找到给定参数(比如P1)的平均值   小组的实例?例如,如果我有8个星期一,那就是   结果值是星期一发生的所有数据点的平均值?   这里增加的障碍是我对数据的采样不可靠。   如果我的星期一有10个样本,星期一有1个,那就简单了   平均所有11个值将在星期一淹没一小部分样本   尺寸。因此,我想平均给定日期之前的所有值   考虑一周中的某一天。

是的,上面的groupby会找到所有实例的平均值。在这里,您可以如何实现这一目标" double"平均:

# 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)