Pandas常用累計、同比、環(huán)比等統(tǒng)計方法實踐過程
統(tǒng)計表中常常以本年累計、上年同期(累計)、當期(例如當月)完成、上月完成為統(tǒng)計數據,并進行同比、環(huán)比分析。
如下月報統(tǒng)計表所示樣例,本文將使用Python Pandas工具進行統(tǒng)計。

其中:
- (本年)累計:是指本年1月到截止月份的合計數
- (上年)同期(累計):是指去年1月到與本年累計所對應截止月份的合計數
- 同比(增長率)=(本期數-同期數)/同期數*100%
- 環(huán)比(增長率)=(本期數-上期數)/上期數*100%
注:這里的本期是指本月完成或當月完成,上期數是指上月完成。
示例數據:

注:為了演示方便,本案例數據源僅使用2年,且每年5個月的數據。
1.(本年)累計
在做統(tǒng)計分析開發(fā)中,按年度、按月累計某些統(tǒng)計數據,是比較常見的需求。對于數據來說,就是按規(guī)則逐行累加數據。
Pandas中的cumsum()函數可以實現按某時間維度累計需求。
# 取本年累計值
import pandas as pd
df = pd.read_csv('data2021.csv')
cum_columns_name = ['cum_churncount','cum_newcount']
df[cum_columns_name] = df[['years','churncount','newcount']].groupby(['years']).cumsum()注:其中分組‘years’是指年度時間維度累計。
計算結果如下:

2.(上年)同期累計
對于(上年)同期累計,將直接取上一年度累計值的同月份數據。pandas DataFrame.shift()函數可以把數據移動指定的行數。

接續(xù)上列,讀取同期數據。首先是把‘yearmonth’上移五行,如上圖所示得到新的DataFrame,通過‘yearmonth’進行兩表數據關聯(左關聯:左側為原表,右側為移動后的新表),實現去同期數據效果。
cum_columns_dict = {'cum_churncount':'cum_same_period_churncount',
'cum_newcount':'cum_same_period_newcount'}
df_cum_same_period = df[['cum_churncount','cum_newcount','yearmonth']].copy()
df_cum_same_period = df_cum_same_period.rename(columns=cum_columns_dict)
#df_cum_same_period.loc[:,'yearmonth'] = df_cum_same_period['yearmonth'].shift(-12) # 一年12個月
df_cum_same_period.loc[:,'yearmonth'] = df_cum_same_period['yearmonth'].shift(-5) # 由于只取5個月數據的原因
df = pd.merge(left=df,right=df_cum_same_period,on='yearmonth',how='left')
3. 上月(完成)
取上月的數據,使用pandas DataFrame.shift()函數把數據移動指定的行數。
接續(xù)上列,讀取上期數據。(與取同期原理一樣,略)
last_mnoth_columns_dict = {'churncount':'last_month_churncount',
'newcount':'last_month_newcount'}
df_last_month = df[['churncount','newcount','yearmonth']].copy()
df_last_month = df_last_month.rename(columns=last_mnoth_columns_dict)
df_last_month.loc[:,'yearmonth'] = df_last_month['yearmonth'].shift(-1) # 移動一行
df = pd.merge(left=df,right=df_last_month,on='yearmonth',how='left')
4. 同比(增長率)
計算同比涉及到除法,需要剔除除數為零的數據。
df.fillna(0,inplace=True) # 空值填充為0 # 計算同比 df.loc[df['cum_same_period_churncount']!=0,'cum_churncount_rat'] = (df['cum_churncount']-df['cum_same_period_churncount'])/df['cum_same_period_churncount'] # 除數不能為零 df.loc[df['cum_same_period_newcount']!=0,'cum_newcount_rat'] = (df['cum_newcount']-df['cum_same_period_newcount'])/df['cum_same_period_newcount'] # 除數不能為零 df[['yearmonth','cum_churncount','cum_newcount','cum_same_period_churncount','cum_same_period_newcount','cum_churncount_rat','cum_newcount_rat']]

5. 環(huán)比(增長率)
# 計算環(huán)比 df.loc[df['last_month_churncount']!=0,'churncount_rat'] = (df['churncount']-df['last_month_churncount'])/df['last_month_churncount'] # 除數不能為零 df.loc[df['last_month_newcount']!=0,'newcount_rat'] = (df['newcount']-df['last_month_newcount'])/df['last_month_newcount'] # 除數不能為零 df[['yearmonth','churncount','newcount','last_month_churncount','last_month_newcount','churncount_rat','newcount_rat']]

6. 總結
pandas做統(tǒng)計計算功能方法比較多,這里總結用到的技術有累計cumsum()函數、移動數據shift()函數、表合并關聯merge()函數,以及通過loc條件修改數據。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python3中利用filter函數輸出小于某個數的所有回文數實例
今天小編就為大家分享一篇 python3中利用filter函數輸出小于某個數的所有回文數實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
如何在Python3中使用telnetlib模塊連接網絡設備
這篇文章主要介紹了如何在Python3中使用telnetlib模塊連接網絡設備,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09
python使用__slots__讓你的代碼更加節(jié)省內存
如果要限制添加的屬性,例如,Student類只允許添加 name、gender和score 這3個屬性,就可以利用Python的一個特殊的slots來實現。這篇文章主要給大家介紹了關于python如何使用__slots__讓你的代碼更加節(jié)省內存的相關資料,需要的朋友可以參考下2018-09-09
python用WxPython庫實現無邊框窗體和透明窗體實現方法詳解
這篇文章主要介紹了python用WxPython庫實現無邊框窗體和透明窗體實現方法詳解,需要的朋友可以參考下2020-02-02

