Python如何計(jì)算環(huán)比增長(zhǎng)率
認(rèn)識(shí)環(huán)比增長(zhǎng)率
很多企業(yè)比較注重自己的業(yè)務(wù)增長(zhǎng)情況,時(shí)常會(huì)需要計(jì)算同比增長(zhǎng)率和環(huán)比增長(zhǎng)率。從上學(xué)的時(shí)候就有很多小伙伴搞不清楚這兩個(gè)增長(zhǎng)率之間的區(qū)別,這里簡(jiǎn)單直白的解釋一下:
同比增長(zhǎng)率從名字上就比較容易理解,指的是同期相比增長(zhǎng)情況如何,比如今年一季度和去年一季度相比業(yè)務(wù)增長(zhǎng)情況就可以用同比增長(zhǎng)率來(lái)衡量,具體的計(jì)算公式為(今年一季度數(shù)據(jù) - 去年一季度數(shù)據(jù))/去年一季度數(shù)據(jù)。這里的季度只是舉例用的,月份,周甚至天都可以作周期;
環(huán)比增長(zhǎng)率的名字可能沒(méi)有那么直觀,它指的是這一個(gè)周期與上一個(gè)周期相比增長(zhǎng)情況如何,比如第三季度和第二季度相比,業(yè)務(wù)增長(zhǎng)情況就可以用環(huán)比增長(zhǎng)率來(lái)衡量,具體計(jì)算公式為(第二季度數(shù)據(jù) - 第一季度數(shù)據(jù))/第一季度數(shù)據(jù)。當(dāng)然這里的季度也只是舉例用的,月份,周甚至天也都可以作周期。
根據(jù)具體表格情況計(jì)算環(huán)比增長(zhǎng)率
我們不能確保每次拿到的數(shù)據(jù)都是類似的格式,對(duì)不同格式的數(shù)據(jù)在計(jì)算環(huán)比增長(zhǎng)率的時(shí)候,會(huì)有一些小差別。
計(jì)算環(huán)比增長(zhǎng)率情況一
首先看一下數(shù)據(jù)集長(zhǎng)什么樣子:

這是一種形式的表格,不同的年份,不同產(chǎn)品的銷售額,對(duì)這樣一種形式的數(shù)據(jù)計(jì)算環(huán)比增長(zhǎng)率,是比較簡(jiǎn)單的一種形式,不需要提前對(duì)數(shù)據(jù)做過(guò)多的整理。
這里需要注意的是,我們希望能夠保留年份信息,而用來(lái)計(jì)算的函數(shù)會(huì)把表格中所有數(shù)值型數(shù)據(jù)都進(jìn)行環(huán)比運(yùn)算,所以需要提前將年份信息轉(zhuǎn)化成索引:
df1 = df.set_index("year") #為了不改變?cè)瓟?shù)據(jù),將充值索引后的數(shù)據(jù)賦值給df1df1 #查看修改索引后的數(shù)據(jù)集

修改索引后的表可以直接進(jìn)行計(jì)算了:
df1.pct_change() #pct_change()方法計(jì)算當(dāng)前元素與先前元素之間的百分比變化
輸出結(jié)果:

這樣計(jì)算的就是每一年和前一年相比的一個(gè)環(huán)比增長(zhǎng)率,當(dāng)然實(shí)際工作中一般不會(huì)保留這么多位小數(shù),需要處理一下:
round(df1.pct_change(),4) #保留四位小數(shù),由于增長(zhǎng)率一般是百分?jǐn)?shù),所以這里保留4位小數(shù)
輸出結(jié)果:

這樣基本就是常見的環(huán)比增長(zhǎng)率了。
計(jì)算環(huán)比增長(zhǎng)率情況二
來(lái)看另一種樣子的數(shù)據(jù)集:

這一種數(shù)據(jù)集明顯比上一個(gè)數(shù)據(jù)集復(fù)雜了一點(diǎn),而且這是整個(gè)數(shù)據(jù)集的前十行,下邊我們簡(jiǎn)單探索下這個(gè)數(shù)據(jù)集:
首先一目了然,一共有三列,分別是產(chǎn)品ID,年份,銷售金額;
然后需要探索一共有多少個(gè)產(chǎn)品ID,即一共有幾種產(chǎn)品,還有一共是幾年的數(shù)據(jù):
data.ID.unique() #產(chǎn)看有幾種產(chǎn)品ID
輸出結(jié)果:
array(['001', '002', '003', '004', '005', '006'], dtype=object)
一共有6種產(chǎn)品
data.year.unique() #查看一共有幾年數(shù)據(jù)
輸出結(jié)果:
array(['2016', '2017', '2018', '2019'], dtype=object)
一共有4年的數(shù)據(jù)。
那么這種數(shù)據(jù)要怎樣計(jì)算環(huán)比增長(zhǎng)率呢?
有兩種方法,一種是將原數(shù)據(jù)集轉(zhuǎn)化成第一種數(shù)據(jù)集情況的樣子,第二種是不改變?cè)瓟?shù)據(jù)集計(jì)算環(huán)比增長(zhǎng)率
先看方法一
通過(guò)數(shù)據(jù)透視的方法,將原數(shù)據(jù)進(jìn)行加工:
data1 = data.pivot(index = "ID",columns="year",values="amount" )data1 #為了不改變?cè)瓟?shù)據(jù),將數(shù)據(jù)透視后的結(jié)果賦值給data1
輸出結(jié)果:

這里的行索引和列名可以進(jìn)行互換,在data.pivot()的參數(shù)中進(jìn)行設(shè)置就可以,雖然和第一種情況類似,但是仔細(xì)觀察又發(fā)現(xiàn)了不同,第一種情況數(shù)據(jù)集的行索引是年份,這份數(shù)據(jù)中行索引是產(chǎn)品ID,其實(shí)這個(gè)是沒(méi)有影響的,計(jì)算環(huán)比增長(zhǎng)率的方法中有參數(shù)可以解決這種情況:
data1.pct_change(axis='columns') #只需要設(shè)置一下軸信息就可以改變運(yùn)算方向
輸出結(jié)果:

橫向排列的就是每一個(gè)產(chǎn)品每一年的環(huán)比增長(zhǎng)率,接下來(lái),看另一種不對(duì)數(shù)據(jù)進(jìn)行處理的方法。
再看方法二
由于一共是四年數(shù)據(jù),規(guī)律明顯,所以運(yùn)用循環(huán)的方法計(jì)算環(huán)比增長(zhǎng)率:
s = pd.Series() #新建一個(gè)空series用來(lái)放置計(jì)算結(jié)果for i in data["ID"].unique(): #行索引是產(chǎn)品ID,所以有多少種商品,就循環(huán)多少次 data_new = data[data["ID"]==i] #將相同產(chǎn)品的數(shù)據(jù)提取出來(lái) s = pd.concat([s,data_new["amount"].pct_change()]) #計(jì)算一種產(chǎn)品的環(huán)比增長(zhǎng)率,并價(jià)格計(jì)算出的記過(guò)拼接到series中s #查看最終結(jié)果
輸出結(jié)果:
0 NaN1 -0.4793802 2.4026893 -0.2839624 NaN5 0.3867616 -0.1659267 -0.6011668 NaN9 0.09165510 -0.77360811 0.72302812 NaN13 -0.24101814 0.53450415 0.20014516 NaN17 0.03589918 -0.09147119 0.32854320 NaN21 -0.26149122 0.32679423 -0.903687dtype: float64
得出這個(gè)結(jié)果后,可以把結(jié)果作為一個(gè)新列添加到原表當(dāng)中,方便對(duì)比查看:
data["growth rate"]=round(s,4)data.head(10) #由于數(shù)據(jù)集比較長(zhǎng),只查看前十行
輸出結(jié)果:

另一個(gè)常用參數(shù)periods
官方文檔中對(duì)這個(gè)參數(shù)的解釋是這樣的:形成百分比變化所需的時(shí)間。用直白的話解釋就是進(jìn)行環(huán)比運(yùn)算的周期,比如上邊所有的計(jì)算都是下一個(gè)周期和上一個(gè)周期進(jìn)行的環(huán)比增長(zhǎng),也可計(jì)算諸如第三期與第一期相比的環(huán)比增長(zhǎng),只需要設(shè)置periods=2,就可以實(shí)現(xiàn)這樣的需求:
df1.pct_change(periods=2)#用第一個(gè)數(shù)據(jù)集為例,查看這個(gè)參數(shù)的效果
輸出結(jié)果:

關(guān)于上述計(jì)算的所有結(jié)果,感興趣的童鞋可以按照文章開頭的公式手工計(jì)算一下,看下和pct_change()計(jì)算的結(jié)果都是一樣的哦。
如何計(jì)算環(huán)比增長(zhǎng)率是不是已經(jīng)沒(méi)有什么問(wèn)題啦,YEAH!