【问题标题】:Python - Aggregate by month and calculate averagePython - 按月汇总并计算平均值
【发布时间】:2023-03-13 04:02:02
【问题描述】:

我有一个如下所示的 csv:

Date,Sentiment
2014-01-03,0.4
2014-01-04,-0.03
2014-01-09,0.0
2014-01-10,0.07
2014-01-12,0.0
2014-02-24,0.0
2014-02-25,0.0
2014-02-25,0.0
2014-02-26,0.0
2014-02-28,0.0
2014-03-01,0.1
2014-03-02,-0.5
2014-03-03,0.0
2014-03-08,-0.06
2014-03-11,-0.13
2014-03-22,0.0
2014-03-23,0.33
2014-03-23,0.3
2014-03-25,-0.14
2014-03-28,-0.25
etc

我的目标是按月汇总日期并计算月的平均值。日期可能不以 1. 或一月开头。问题是我有很多数据,这意味着我还有更多年。为此,我想找到最早的日期(月份),然后从那里开始计算月份及其平均值。例如:

Month count, average
1, 0.4 (<= the earliest month)
2, -0.3
3, 0.0
...
12, 0.1
13, -0.4 (<= new year but counting of month is continuing)
14, 0.3

我正在使用 Pandas 打开 csv

data = pd.read_csv("pks.csv", sep=",")

所以在data['Date'] 我有日期,在data['Sentiment'] 我有价值观。知道怎么做吗?

【问题讨论】:

    标签: python date csv pandas aggregate


    【解决方案1】:

    可能最简单的方法是使用resample 命令。首先,当您读取数据时,请确保解析日期并将日期列设置为索引(忽略 StringIO 部分和 header=True ...我正在从多行字符串中读取您的示例数据):

    >>> df = pd.read_csv(StringIO(data),header=True,parse_dates=['Date'],
                         index_col='Date')
    >>> df
    
                Sentiment
    Date
    2014-01-03       0.40
    2014-01-04      -0.03
    2014-01-09       0.00
    2014-01-10       0.07
    2014-01-12       0.00
    2014-02-24       0.00 
    2014-02-25       0.00
    2014-02-25       0.00
    2014-02-26       0.00
    2014-02-28       0.00
    2014-03-01       0.10
    2014-03-02      -0.50
    2014-03-03       0.00
    2014-03-08      -0.06
    2014-03-11      -0.13
    2014-03-22       0.00
    2014-03-23       0.33
    2014-03-23       0.30
    2014-03-25      -0.14
    2014-03-28      -0.25
    
    
    >>> df.resample('M').mean()
    
                Sentiment
    2014-01-31      0.088
    2014-02-28      0.000
    2014-03-31     -0.035
    

    如果你想要一个月份计数器,你可以在resample之后添加它:

    >>> agg = df.resample('M',how='mean')
    >>> agg['cnt'] = range(len(agg))
    >>> agg
    
                Sentiment  cnt
    2014-01-31      0.088    0
    2014-02-28      0.000    1
    2014-03-31     -0.035    2
    

    您也可以使用groupby 方法和TimeGrouper 函数来执行此操作(按月分组,然后调用groupby 提供的平均便捷方法)。

    >>> df.groupby(pd.TimeGrouper(freq='M')).mean()
    
                Sentiment
    2014-01-31      0.088
    2014-02-28      0.000
    2014-03-31     -0.035
    

    【讨论】:

    • 太好了,这正是我所需要的。非常感谢!
    • 使用新语法进行重采样; df.resample('M').mean()
    • 如果日期不在索引中而是作为列并且列名为“日期”,则df.resample('M', on="date").mean()
    【解决方案2】:

    要在 DataFrame 具有每日数据行“Sentiment”时获取 DataFrame 的月平均值,我会:

    1. 将日期列df['dates']转换为DataFrame的索引df:df.set_index('date',inplace=True)
    2. 然后我将索引dates 转换为月份索引:df.index.month
    3. 最后我将计算 DataFrame GROUPED BY MONTH 的平均值:df.groupby(df.index.month).Sentiment.mean()

    我去这里慢慢扔每一步:

    带有日期和值的生成 DataFrame

    • 你需要先导入 Pandas 和 Numpy,以及模块datetime

      from datetime import datetime
      
    • 在 2019 年 1 月 1 日和 2019 年 3 月 5 日之间以“W”周为间隔生成一个列 'date'。还有一列'Sentiment',随机值在1-100之间:

      date_rng = pd.date_range(start='1/1/2018', end='3/05/2018', freq='W')
      df = pd.DataFrame(date_rng, columns=['date'])
      df['Sentiment']=np.random.randint(0,100,size=(len(date_rng)))
      
    • df 有两列 'date''Sentiment'

              date  Sentiment
      0 2018-01-07         34
      1 2018-01-14         32
      2 2018-01-21         15
      3 2018-01-28          0
      4 2018-02-04         95
      5 2018-02-11         53
      6 2018-02-18          7
      7 2018-02-25         35
      8 2018-03-04         17
      

      设置'date'column为DataFrame的索引:

      df.set_index('date',inplace=True)
      
    • df 有一列'Sentiment',索引为'date'

                  Sentiment
      date                 
      2018-01-07         34
      2018-01-14         32
      2018-01-21         15
      2018-01-28          0
      2018-02-04         95
      2018-02-11         53
      2018-02-18          7
      2018-02-25         35
      2018-03-04         17
      

    从索引中获取月份数

        months=df.index.month
    

    按月分组获取每个月的平均值:

        monthly_avg=df.groupby(months).Sentiment.mean()
    

    'monthly_avg' 月份数据集的平均值为:

        date
        1    20.25
        2    47.50
        3    17.00
    

    【讨论】:

      猜你喜欢
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 2014-01-24
      相关资源
      最近更新 更多