【问题标题】:Time series: Mean per hour per day per Id number时间序列:每个 ID 号每天每小时的平均值
【发布时间】:2015-08-10 06:55:39
【问题描述】:

我是一个有点初学者的程序员,正在学习 python (+pandas),希望我能很好地解释这一点。我有一个超过 300 万行的大型时间序列 pd 数据框,最初有 12 列跨越数年。这包括从 ID 号(其中 350 个)表示的不同地点取票的人。每行是一个实例(一张票)。 我搜索了很多问题,例如counting records per hour per daygetting average per hour over several years。但是,我遇到了包含“Id”变量的麻烦。 我希望得到每个小时、一周中的每一天(周一至周五)和每个车站的购票人数的平均值。
我有以下,将日期时间设置为索引:

    Id          Start_date  Count  Day_name_no
    149 2011-12-31 21:30:00      1            5  
    150 2011-12-31 20:51:00      1            0  
    259 2011-12-31 20:48:00      1            1  
    3015 2011-12-31 19:38:00     1            4  
    28 2011-12-31 19:37:00       1            4  

使用groupbyStart_date.index.hour,我似乎无法包含“Id”。

我的替代方法是将日期分开一小时并具有以下内容:

    Id  Count  Day_name_no  Trip_hour
    149      1            2         5
    150      1            4         10
    153      1            2         15
    1867     1            4         11
    2387     1            2         7

然后我首先得到计数:

Count_Item = TestFreq.groupby([TestFreq['Id'], TestFreq['Day_name_no'], TestFreq['Hour']]).count().reset_index()

     Id Day_name_no Trip_hour   Count
     1  0           7          24
     1  0           8          48
     1  0           9          31
     1  0           10         28
     1  0           11         26
     1  0           12         25

然后使用 groupby 和均值:

Mean_Count = Count_Item.groupby(Count_Item['Id'], Count_Item['Day_name_no'], Count_Item['Hour']).mean().reset_index()

但是,由于平均值不正确,这并没有给出预期的结果。 我希望我已经清楚地解释了这个问题。我正在寻找每个 ID 每天每小时的平均值,因为我计划在对这些组应用预测模型之前进行聚类以将我的数据集分成组。

任何帮助将不胜感激,如果可能的话,请解释我做错了什么,无论是代码还是我的方法。

提前致谢。

我已对此进行了编辑,以使其更清晰一些。写一个缺乏睡眠的问题可能是不可取的。 我开始使用的玩具数据集:

    Date        Id     Dow Hour Count
    12/12/2014  1234    0   9   1
    12/12/2014  1234    0   9   1
    12/12/2014  1234    0   9   1
    12/12/2014  1234    0   9   1
    12/12/2014  1234    0   9   1
    19/12/2014  1234    0   9   1
    19/12/2014  1234    0   9   1
    19/12/2014  1234    0   9   1
    26/12/2014  1234    0   10  1
    27/12/2014  1234    1   11  1
    27/12/2014  1234    1   11  1
    27/12/2014  1234    1   11  1
    27/12/2014  1234    1   11  1
    04/01/2015  1234    1   11  1

我现在意识到我必须先使用日期并得到类似的东西:

    Date         Id    Dow Hour Count
    12/12/2014  1234    0   9   5
    19/12/2014  1234    0   9   3
    26/12/2014  1234    0   10  1
    27/12/2014  1234    1   11  4
    04/01/2015  1234    1   11  1

然后计算每个 Id、每个 Dow、每个小时的平均值。并想得到这个:

    Id  Dow Hour    Mean
    1234    0   9   4
    1234    0   10  1
    1234    1   11  2.5

我希望这能让它更清楚一点。我的真实数据集跨越 3 年,包含 300 万行,包含 350 个 ID 号。

【问题讨论】:

    标签: python pandas time-series dataframe mean


    【解决方案1】:

    您可以通过“Id”列使用 groupby 函数,然后将 resample 函数与 how='sum' 一起使用。

    【讨论】:

      【解决方案2】:

      你的问题不是很清楚,但我希望这会有所帮助:

      df.reset_index(inplace=True)
      # helper columns with date, hour and dow
      df['date'] = df['Start_date'].dt.date
      df['hour'] = df['Start_date'].dt.hour
      df['dow'] = df['Start_date'].dt.dayofweek
      # sum of counts for all combinations
      df = df.groupby(['Id', 'date', 'dow', 'hour']).sum()
      # take the mean over all dates
      df = df.reset_index().groupby(['Id', 'dow', 'hour']).mean()
      

      【讨论】:

      • 感谢@Def_Os。我进行了编辑以尝试使问题更清楚一些。我正在做的事情与您发布的内容非常相似,但只得到了“1”。我在想它把所有的 1 相加并除以总和,得到一个 1 的平均值。我希望编辑可以让我更清楚我想要做什么。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2012-08-17
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 2022-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多