Pandas常用累計(jì)、同比、環(huán)比等統(tǒng)計(jì)方法實(shí)踐過程
統(tǒng)計(jì)表中常常以本年累計(jì)、上年同期(累計(jì))、當(dāng)期(例如當(dāng)月)完成、上月完成為統(tǒng)計(jì)數(shù)據(jù),并進(jìn)行同比、環(huán)比分析。
如下月報統(tǒng)計(jì)表所示樣例,本文將使用Python Pandas工具進(jìn)行統(tǒng)計(jì)。
其中:
- (本年)累計(jì):是指本年1月到截止月份的合計(jì)數(shù)
- (上年)同期(累計(jì)):是指去年1月到與本年累計(jì)所對應(yīng)截止月份的合計(jì)數(shù)
- 同比(增長率)=(本期數(shù)-同期數(shù))/同期數(shù)*100%
- 環(huán)比(增長率)=(本期數(shù)-上期數(shù))/上期數(shù)*100%
注:這里的本期是指本月完成或當(dāng)月完成,上期數(shù)是指上月完成。
示例數(shù)據(jù):
注:為了演示方便,本案例數(shù)據(jù)源僅使用2年,且每年5個月的數(shù)據(jù)。
1.(本年)累計(jì)
在做統(tǒng)計(jì)分析開發(fā)中,按年度、按月累計(jì)某些統(tǒng)計(jì)數(shù)據(jù),是比較常見的需求。對于數(shù)據(jù)來說,就是按規(guī)則逐行累加數(shù)據(jù)。
Pandas中的cumsum()函數(shù)可以實(shí)現(xiàn)按某時間維度累計(jì)需求。
# 取本年累計(jì)值 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’是指年度時間維度累計(jì)。
計(jì)算結(jié)果如下:
2.(上年)同期累計(jì)
對于(上年)同期累計(jì),將直接取上一年度累計(jì)值的同月份數(shù)據(jù)。pandas DataFrame.shift()函數(shù)可以把數(shù)據(jù)移動指定的行數(shù)。
接續(xù)上列,讀取同期數(shù)據(jù)。首先是把‘yearmonth’上移五行,如上圖所示得到新的DataFrame,通過‘yearmonth’進(jìn)行兩表數(shù)據(jù)關(guān)聯(lián)(左關(guān)聯(lián):左側(cè)為原表,右側(cè)為移動后的新表),實(shí)現(xiàn)去同期數(shù)據(jù)效果。
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個月數(shù)據(jù)的原因 df = pd.merge(left=df,right=df_cum_same_period,on='yearmonth',how='left')
3. 上月(完成)
取上月的數(shù)據(jù),使用pandas DataFrame.shift()函數(shù)把數(shù)據(jù)移動指定的行數(shù)。
接續(xù)上列,讀取上期數(shù)據(jù)。(與取同期原理一樣,略)
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. 同比(增長率)
計(jì)算同比涉及到除法,需要剔除除數(shù)為零的數(shù)據(jù)。
df.fillna(0,inplace=True) # 空值填充為0 # 計(jì)算同比 df.loc[df['cum_same_period_churncount']!=0,'cum_churncount_rat'] = (df['cum_churncount']-df['cum_same_period_churncount'])/df['cum_same_period_churncount'] # 除數(shù)不能為零 df.loc[df['cum_same_period_newcount']!=0,'cum_newcount_rat'] = (df['cum_newcount']-df['cum_same_period_newcount'])/df['cum_same_period_newcount'] # 除數(shù)不能為零 df[['yearmonth','cum_churncount','cum_newcount','cum_same_period_churncount','cum_same_period_newcount','cum_churncount_rat','cum_newcount_rat']]
5. 環(huán)比(增長率)
# 計(jì)算環(huán)比 df.loc[df['last_month_churncount']!=0,'churncount_rat'] = (df['churncount']-df['last_month_churncount'])/df['last_month_churncount'] # 除數(shù)不能為零 df.loc[df['last_month_newcount']!=0,'newcount_rat'] = (df['newcount']-df['last_month_newcount'])/df['last_month_newcount'] # 除數(shù)不能為零 df[['yearmonth','churncount','newcount','last_month_churncount','last_month_newcount','churncount_rat','newcount_rat']]
6. 總結(jié)
pandas做統(tǒng)計(jì)計(jì)算功能方法比較多,這里總結(jié)用到的技術(shù)有累計(jì)cumsum()函數(shù)、移動數(shù)據(jù)shift()函數(shù)、表合并關(guān)聯(lián)merge()函數(shù),以及通過loc條件修改數(shù)據(jù)。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python 普通最小二乘法(OLS)進(jìn)行多項(xiàng)式擬合的方法
今天小編就為大家分享一篇Python 普通最小二乘法(OLS)進(jìn)行多項(xiàng)式擬合的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12python3中利用filter函數(shù)輸出小于某個數(shù)的所有回文數(shù)實(shí)例
今天小編就為大家分享一篇 python3中利用filter函數(shù)輸出小于某個數(shù)的所有回文數(shù)實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11如何在Python3中使用telnetlib模塊連接網(wǎng)絡(luò)設(shè)備
這篇文章主要介紹了如何在Python3中使用telnetlib模塊連接網(wǎng)絡(luò)設(shè)備,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09python實(shí)現(xiàn)大戰(zhàn)外星人小游戲?qū)嵗a
這篇文章主要介紹了python實(shí)現(xiàn)大戰(zhàn)外星人小游戲,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12python使用__slots__讓你的代碼更加節(jié)省內(nèi)存
如果要限制添加的屬性,例如,Student類只允許添加 name、gender和score 這3個屬性,就可以利用Python的一個特殊的slots來實(shí)現(xiàn)。這篇文章主要給大家介紹了關(guān)于python如何使用__slots__讓你的代碼更加節(jié)省內(nèi)存的相關(guān)資料,需要的朋友可以參考下2018-09-09python用WxPython庫實(shí)現(xiàn)無邊框窗體和透明窗體實(shí)現(xiàn)方法詳解
這篇文章主要介紹了python用WxPython庫實(shí)現(xiàn)無邊框窗體和透明窗體實(shí)現(xiàn)方法詳解,需要的朋友可以參考下2020-02-02