【问题标题】:Pandas adjust last row of dataframe group熊猫调整数据框组的最后一行
【发布时间】:2017-03-18 21:25:30
【问题描述】:

我有一个每日级别数据列表,我已针对每个独特的公司/集团分组汇总到季度级别。然后我计算同比增长。

但是,对于当前季度,我想调整同比计算以仅考虑本季度至今。例如,假设数据是截至 2016 年 11 月 4 日的最新数据,并且该季度从 2016 年 10 月 1 日开始到 2016 年 12 月 31 日结束,我想计算 2016 年 10 月 1 日至 11 月 4 日之间的交易增长/2016 和 10/1/2015-11/4/2015。

假设数据是 2016 年 11 月 4 日的最新数据,我如何计算我只有部分数据的最近一个季度的同比增长?

每日数据: df =

Company Group Period  Date        Value 
A       X     2014Q1  02/21/2015  3     
A       X     2014Q1  03/04/2015  4
A       X     2014Q1  03/16/2015  2   
A       X     2014Q2  04/21/2015  1    
A       X     2014Q2  05/04/2015  2
A       X     2014Q2  05/16/2015  3  
A       X     2014Q3  08/03/2015  1
A       X     2014Q3  08/14/2015  2 
A       X     2014Q4  10/16/2015  4  
A       X     2014Q4  11/03/2015  2
A       X     2014Q4  12/14/2015  3     
A       X     2015Q1  02/21/2015  2     
A       X     2015Q1  03/04/2015  2
A       X     2015Q1  03/16/2015  1   
A       X     2015Q2  04/21/2015  3     
A       X     2015Q2  05/04/2015  2
A       X     2015Q2  05/16/2015  3  
A       X     2015Q3  08/03/2015  4
A       X     2015Q3  08/14/2015  2 
A       X     2015Q4  10/16/2015  1  
A       X     2015Q4  11/03/2015  1
A       X     2015Q4  12/14/2015  2 
A       X     2016Q1  02/21/2016  3     
A       X     2016Q1  03/04/2016  2
A       X     2016Q1  03/16/2016  2   
A       X     2016Q2  04/21/2016  3     
A       X     2016Q2  05/04/2016  1
A       X     2016Q2  05/16/2016  2  
A       X     2016Q3  08/03/2016  5
A       X     2016Q3  08/14/2016  4 
A       X     2016Q4  10/16/2016  3
A       XX    2015Q1  02/21/2015  2     
A       XX    2015Q1  03/04/2015  1
A       XX    2015Q1  03/16/2015  1   
A       XX    2015Q2  04/21/2015  3     
A       XX    2015Q2  05/04/2015  2
A       XX    2015Q2  05/16/2015  1  
A       XX    2015Q3  08/03/2015  4
A       XX    2015Q3  08/14/2015  2 
A       XX    2015Q4  10/16/2015  5  
A       XX    2015Q4  11/03/2015  1
A       XX    2015Q4  12/14/2015  2 
A       XX    2016Q1  02/21/2016  5     
A       XX    2016Q1  03/04/2016  2
A       XX    2016Q1  03/16/2016  2   
A       XX    2016Q2  04/21/2016  1     
A       XX    2016Q2  05/04/2016  1
A       XX    2016Q2  05/16/2016  2  
A       XX    2016Q3  08/03/2016  2
A       XX    2016Q3  08/14/2016  3 
A       XX    2016Q4  10/13/2016  1
A       XX    2016Q4  10/18/2016  1

季度数据:df2=

Company Group Period  EndDate      Value Pct_Growth_YoY
A       X     2014Q1  3/31/2015    9     NaN
A       X     2014Q2  6/30/2015    6     NaN
A       X     2014Q3  9/30/2015    3     NaN
A       X     2014Q4  12/31/2015   9     NaN
A       X     2015Q1  3/31/2015    5     -0.44
A       X     2015Q2  6/30/2015    8     0.33
A       X     2015Q3  9/30/2015    6     1.0
A       X     2015Q4  12/31/2015   4     -0.55
A       X     2016Q1  3/31/2016    7     0.40
A       X     2016Q2  6/30/2016    6     -0.25
A       X     2016Q3  9/30/2016    9     0.50
A       X     2016Q4  12/31/2016   3     -0.25
A       XX    2015Q1  3/31/2015    4     NaN
A       XX    2015Q2  6/30/2015    6     NaN
A       XX    2015Q3  9/30/2015    6     NaN
A       XX    2015Q4  12/31/2015   8     NaN
A       XX    2016Q1  3/31/2016    9     1.25
A       XX    2016Q2  6/30/2016    4     -0.33
A       XX    2016Q3  9/30/2016    5     -0.16
A       XX    2016Q4  12/31/2016   2     -0.75

我想计算每个独特的公司/集团组合的季度至今同比增长,而不是比较 2016 年第四季度的部分与 2015 年第四季度的全部情况。

我想要的结果是:

结果=

Company Group Period  EndDate      Value Pct_Growth_YoY
A       X     2014Q1  3/31/2015    9     NaN
A       X     2014Q2  6/30/2015    6     NaN
A       X     2014Q3  9/30/2015    3     NaN
A       X     2014Q4  12/31/2015   9     NaN
A       X     2015Q1  3/31/2015    5     -0.44
A       X     2015Q2  6/30/2015    8     0.33
A       X     2015Q3  9/30/2015    6     1.0
A       X     2015Q4  12/31/2015   4     -0.55
A       X     2016Q1  3/31/2016    7     0.40
A       X     2016Q2  6/30/2016    6     -0.25
A       X     2016Q3  9/30/2016    9     0.50
A       X     2016Q4  12/31/2016   3     0.50
A       XX    2015Q1  3/31/2015    4     NaN
A       XX    2015Q2  6/30/2015    6     NaN
A       XX    2015Q3  9/30/2015    6     NaN
A       XX    2015Q4  12/31/2015   8     NaN
A       XX    2016Q1  3/31/2016    9     1.25
A       XX    2016Q2  6/30/2016    4     -0.33
A       XX    2016Q3  9/30/2016    5     -0.16
A       XX    2016Q4  12/31/2016   2     -0.66

【问题讨论】:

  • 您如何获得季度数据?你的代码在哪里?
  • @Parfait 我有一个包含季度数据(期间和 QuarterEndDate)的数据框。然后我将其与每日数据合并以添加一个时期列,并在公司、组和时期列上进行分组。
  • 但是为什么最后一行是唯一缺失的呢?
  • 我已将问题编辑得更清楚。它没有丢失,但同比增长率不正确。数据截至 11 月 4 日,因此当汇总 2016 年第四季度时,它仅包括 2016 年 10 月 1 日至 2016 年 11 月 4 日的数据。但是,2015Q4 有整个季度的数据(10/1/2015-12/31/2015),所以当我计算增长时,它会将部分季度与整个季度进行比较。相反,我想计算同一时期的数据:10/1/2016-11/4/2016 与 10/1/2015-11/4/2015 相比。
  • 你能发布你的groupbypandas代码吗?

标签: python pandas numpy


【解决方案1】:

考虑在运行 groupby 聚合后更新选择行。选择的行将是每个 Company 和 Group 分组中的最大 Period。计算会过滤掉一年前的今天之后发生的日期。

但是,首先,将您的 Date 转换为 datetime 类型。下面将保持以下范围内的行:1/1/2015 - 11/5/2015, 1/1/2016 - today.

import datetime as dt 
...

df1['Date'] = pd.to_datetime(df1['Date'], format="%m/%d/%Y")   

# ORIGINAL GROUP BY (NO CHANGE)
df2 = df.groupby(['Company','Group','Period']).sum().reset_index()
df2['Pct_Growth_YoY'] = df2.sort_values('Period').groupby(['Company','Group'])\
                           .pct_change(4)

# LOCATE MAX QUARTER GROUP INDICES    
maxgrps = df2.groupby(['Company','Group'])['Period']\
             .apply(lambda row: row[row==row.max()].index.values[0])\
             .reset_index()['Period'].values.tolist()

# UPDATE ONLY MAX QUARTER GROUP ROWS
df2.ix[maxgrps, 'Pct_Growth_YoY'] = \
                     df[(df['Date'] <= (dt.datetime.today() - dt.timedelta(days=365.25))) |
                        (df['Date'] >= dt.datetime(dt.datetime.today().year, 1, 1))]\
                        .groupby(['Company','Group','Period']).sum().reset_index()\
                        .groupby(['Company','Group']).pct_change(4)['Value']\
                                                     .iloc[maxgrps].values

【讨论】:

  • 这会为 2015 年第四季度生成不正确的 Value。此外,如果我只有两年以上的时间,那么每个 Q4 都会产生不正确的 Value 和 Pct_Growth_YoY。
  • 对于此处发布的数据,我得到 2016Q4 的 -0.66667,运行您的确切 groupby。删除所有 12 月值。所以 12/2015 的 2 将被删除。
  • 当我按照你的代码分组时,2015Q4 X 组的df2.Value 是2,应该是4。Value 列应该保持不变。
  • 我已更新问题以包含 2014 年的数据,以显示 2015Q4 Pct_Growth_YoY` 使用此方法将不正确..
  • 您是否还需要将 2014 年第四季度的值设置为 11 月的值?如果是这样,您需要在我的答案中使用第二种方法(不是第一种),该方法适用于数据集中的所有年份。
猜你喜欢
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 2013-12-29
相关资源
最近更新 更多