Pandas系列(七)-計算工具介紹

內容目錄python

  • 1. 統計函數
  • 2. 窗口函數
  • 3. 加深增強

  數據準備

# 導入相關庫
import numpy as np
import pandas as pd
#Pandas 中包含了很是豐富的計算工具,如一些統計函數、窗口函數、聚合等計算工具。
index = pd.Index(data=["Tom", "Bob", "Mary", "James", "Andy", "Alice"], name="name")
data = {
    "age": [18, 40, 28, 20, 30, 35],
    "income": [1000, 4500 , 1800, 1800, 3000, np.nan],
}
df = pd.DataFrame(data=data, index=index)
df
Out[43]: 
       age  income
name              
Tom     18  1000.0
Bob     40  4500.0
Mary    28  1800.0
James   20  1800.0
Andy    30  3000.0
Alice   35     NaN

1.統計函數

  最多見的計算工具莫過於一些統計函數了。app

  這裏咱們首先構建一個包含了用戶年齡與收入的 DataFrame。咱們能夠經過 cov 函數來求出年齡與收入之間的協方差,計算的時候會丟棄缺失值。除了協方差以外,咱們還能夠經過 corr 函數來計算下它們之間的相關性,計算的時候會丟棄缺失值。默認狀況下 corr 計算相關性時用到的方法是 pearson,固然了你也能夠指定 kendall 或 spearman。除了相關性的計算外,還能夠經過 rank 函數求出數據的排名順序。若是有相同的數,默認取其排名的平均值做爲值。咱們能夠設置參數來獲得不一樣的結果。能夠設置的參數有:min、max、first、dense。函數

#協方差
df.age.cov(df.income)
#相關係數
df.age.corr(df.income)
df.age.corr(df.income,method="kendall")
df.age.corr(df.income,method="spearman")
#排名
df.income.rank()
df.income.rank(method="first")  

2.窗口函數

  有的時候,咱們須要對不一樣窗口的中數據進行一個統計,常見的窗口類型爲時間窗口。
  例如,下面是某個餐廳 7 天的營業額,咱們想要計算每兩天的收入總額,如何計算呢?
經過 rolling 咱們能夠實現,設置 window=2 來保證窗口長度爲 2,設置 on="date" 來保證根據日期這一列來滑動窗口(默認不設置,表示根據索引來歡動)工具

data = {
    "turnover": [12000, 18000, np.nan, 12000, 9000, 16000, 18000],
    "date": pd.date_range("2018-07-01", periods=7)
}
df2 = pd.DataFrame(data=data)
df2
Out[44]: 
   turnover       date
0   12000.0 2018-07-01
1   18000.0 2018-07-02
2       NaN 2018-07-03
3   12000.0 2018-07-04
4    9000.0 2018-07-05
5   16000.0 2018-07-06
6   18000.0 2018-07-07
df2.rolling(window=2, on="date").sum()
Out[45]: 
   turnover       date
0       NaN 2018-07-01
1   30000.0 2018-07-02
2       NaN 2018-07-03
3       NaN 2018-07-04
4   21000.0 2018-07-05
5   25000.0 2018-07-06
6   34000.0 2018-07-07
#是否是發現,有不少結果是缺失值,致使這個結果的緣由是由於在計算時,窗口中默認須要的最小數據個數與窗口長度一致,這裏能夠設置 min_periods=1 來修改下。
df2.rolling(window=2, on="date", min_periods=1).sum()
Out[46]: 
   turnover       date
0   12000.0 2018-07-01
1   30000.0 2018-07-02
2   18000.0 2018-07-03
3   12000.0 2018-07-04
4   21000.0 2018-07-05
5   25000.0 2018-07-06
6   34000.0 2018-07-07
#有時候,我想要計算每段時間的累加和,如何實現呢?先來看看第一種方式吧。
df2.rolling(window=len(df2), on="date", min_periods=1).sum()
Out[47]: 
   turnover       date
0   12000.0 2018-07-01
1   30000.0 2018-07-02
2   30000.0 2018-07-03
3   42000.0 2018-07-04
4   51000.0 2018-07-05
5   67000.0 2018-07-06
6   85000.0 2018-07-07
#還有另一種方式,直接使用 expanding 來生成窗口。
df2.expanding(min_periods=1)["turnover"].sum()
Out[48]: 
0    12000.0
1    30000.0
2    30000.0
3    42000.0
4    51000.0
5    67000.0
6    85000.0
Name: turnover, dtype: float64

 三、加深增強

除了可使用 sum 函數外,還有不少其餘的函數可使用,如:count、mean、median、min、max、std、var、quantile、apply、cov、corr等等。
方法	描述
count()	非空觀測值數量
sum()	值的總和
mean()	價值的平均值
median()	值的算術中值
min()	最小值
max()	最大
std()	貝塞爾修正樣本標準差
var()	無偏方差
skew()	樣品偏斜度(三階矩)
kurt()	樣品峯度(四階矩)
quantile()	樣本分位數(百分位上的值)
apply()	通用適用
cov()	無偏協方差(二元)
corr()	相關(二進制)
不過上面的方式只能生成一個結果,有時候想要同時求出多個結果(如求和和均值),如何實現呢?
藉助 agg 函數能夠快速實現
df2.rolling(window=2, min_periods=1)["turnover"].agg([np.sum, np.mean])
Out[52]: 
       sum     mean
0  12000.0  12000.0
1  30000.0  15000.0
2  18000.0  18000.0
3  12000.0  12000.0
4  21000.0  10500.0
5  25000.0  12500.0
6  34000.0  17000.0
#若是傳入一個字典,能夠爲生成的統計結果重命名。
df2.rolling(window=2, min_periods=1)["turnover"].agg({"tur_sum": np.sum, "tur_mean": np.mean})
Out[53]: 
   tur_sum  tur_mean
0  12000.0   12000.0
1  30000.0   15000.0
2  18000.0   18000.0
3  12000.0   12000.0
4  21000.0   10500.0
5  25000.0   12500.0
6  34000.0   17000.0
相關文章
相關標籤/搜索