【问题标题】:Time series data: bin data to each day, then plot by day of week时间序列数据:将数据分箱到每一天,然后按星期几绘制
【发布时间】:2018-05-25 05:48:57
【问题描述】:

我有一个非常简单的 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 新手,我当前的方法非常讨厌,涉及多个循环。我目前有两个专门的代码部分 - 一个用于计算平均值,另一个用于在一周中的每一天一次完成一个并计算结果以进行绘图。有没有更清洁的方法来做到这一点?

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    看来您正在寻找:

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

    更新

    在你问的评论中,

    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)
    

    【讨论】:

      猜你喜欢
      • 2020-06-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 2019-10-15
      • 2021-10-23
      相关资源
      最近更新 更多