Python 调整数据帧组的最后一行
我有一个每日级别的数据列表,我已将每个独特的公司/集团分组汇总到季度级别。然后我计算同比增长 但是,对于当前季度,我希望调整同比计算,使其仅考虑到季度至今的期间。例如,假设数据是截至2016年11月4日的最新数据,且该季度从2016年10月1日开始至2016年12月31日结束,我想计算2016年10月1日至2016年11月4日和2015年10月1日至2015年11月4日之间的交易增长 假设数据是截至2016年11月4日的最新数据,我如何计算我仅有部分数据的最近一个季度的同比增长 每日数据: df= 季度数据:df2=Python 调整数据帧组的最后一行,python,pandas,numpy,Python,Pandas,Numpy,我有一个每日级别的数据列表,我已将每个独特的公司/集团分组汇总到季度级别。然后我计算同比增长 但是,对于当前季度,我希望调整同比计算,使其仅考虑到季度至今的期间。例如,假设数据是截至2016年11月4日的最新数据,且该季度从2016年10月1日开始至2016年12月31日结束,我想计算2016年10月1日至2016年11月4日和2015年10月1日至2015年11月4日之间的交易增长 假设数据是截至2016年11月4日的最新数据,我如何计算我仅有部分数据的最近一个季度的同比增长 每日数据: df
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
考虑在运行groupby聚合后更新select行。选择行将是每个公司和组分组中的最大期间。计算会过滤掉一年前发生在今天时间点之后的日期 但是,首先,将日期转换为datetime类型。以下将保留以下范围内的行:2015年1月1日-2015年11月5日,2016年1月1日-今天
你是如何获得季度数据的?您的代码在哪里执行此操作?@Parfait我有一个带有季度数据周期和QuarterEndDate的数据帧。然后,我将其与每日数据合并,在“公司”、“集团”和“期间”列中添加“期间”列和“组”。但为什么最后一行是唯一缺失的?我对问题进行了编辑,以使其更清楚。没有遗漏,但同比增长率是不正确的。该数据截止到2016年11月4日,因此当对2016年第四季度的数据进行汇总时,仅包括2016年1月10日至2016年4月11日的数据。然而,2015年第四季度有2015年1月10日至2015年12月31日整个季度的数据,因此当我计算增长时,它将部分季度与整个季度进行比较。相反,我想计算同一时期的数据:2016年1月10日至2016年4月11日,与2015年1月10日至2015年4月11日进行比较。你能发布你的groupby pandas代码吗?这会为2015年第四季度产生不正确的值。此外,如果我有超过两年的时间,它将为每个第四季度产生不正确的值和Pct年增长率。对于这里发布的数据,我得到了2016年第四季度的-0.66667,运行您的准确groupby。将删除所有十二月值。因此,2015年12月的2将被删除。当我按照您的代码分组时,2015年第四季度X组的df2.值为2,应该为4。值列应保持不变。我已更新了问题,将2014年的数据包括在内,以表明使用此方法计算的2015年第四季度Pct_年增长率是不正确的。您是否还需要将2014年第四季度的值调整为11月之前的值?如果是这样,您需要在我的回答中使用第二种方法,而不是第一种方法,这种方法在数据集中适用于所有年份。
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
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