1. 程式人生 > 實用技巧 >pandas模組篇(終章)及初識mataplotlib

pandas模組篇(終章)及初識mataplotlib

今日內容概要

  • 時間序列
  • 針對表格資料的分組與聚合操作
  • 其他函式補充(apply)
  • 練習題(為了加深對DataFrame操作的印象)
  • mataplotlib畫圖模組

今日內容詳細

時間序列處理

時間序列型別
1.時間戳
2.具體日期
3.時間間隔

# 靈活處理時間物件dateutil包
import dateutil
dateutil.parser.parse("2020 May 2nd") # 這中間的時間格式一定要是英文格式
執行結果:
datetime.datetime(2020, 5, 2, 0, 0)

# 日期批處理
pd.to_datetime(['2020-05-01','2020 May 6'])
執行結果:
DatetimeIndex(['2020-05-01', '2020-05-06'], dtype='datetime64[ns]', freq=None) # 產生一個DatetimeIndex物件

# 轉時間索引

res = pd.to_datetime(['2019-04-01','2017 May 09'])
x1= pd.Series([1,2],index=res)
x1
執行結果:
2019-04-01    1
2017-05-09    2
dtype: int64
    
# 轉換為array陣列
pd.to_datetime(['2018-05-20','2020 Feb 18']).to_pydatetime()
執行結果:
array([datetime.datetime(2018, 5, 20, 0, 0),
       datetime.datetime(2020, 2, 18, 0, 0)], dtype=object)

# 產生時間物件陣列:date_range
pd.date_range("2020-1-1","2020-2-1")
執行結果:
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
               '2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08',
               '2020-01-09', '2020-01-10', '2020-01-11', '2020-01-12',
               '2020-01-13', '2020-01-14', '2020-01-15', '2020-01-16',
               '2020-01-17', '2020-01-18', '2020-01-19', '2020-01-20',
               '2020-01-21', '2020-01-22', '2020-01-23', '2020-01-24',
               '2020-01-25', '2020-01-26', '2020-01-27', '2020-01-28',
               '2020-01-29', '2020-01-30', '2020-01-31', '2020-02-01'],
              dtype='datetime64[ns]', freq='D')

# 時間序列
以時間物件作為索引的Series或DataFrame
# 轉換時間索引
res1 = pd.date_range("2020-01-01","2020-02-01")
b = pd.DataFrame({"num":pd.Series(random.randint(-100,100)for _ in range(32)),"date":res1})
b
執行結果:
num	date
0	13	2020-01-01
1	76	2020-01-02
2	-93	2020-01-03
3	87	2020-01-04
4	-16	2020-01-05
5	67	2020-01-06
6	-79	2020-01-07
7	-10	2020-01-08
8	5	2020-01-09
9	-93	2020-01-10
10	9	2020-01-11
11	24	2020-01-12
12	61	2020-01-13
13	82	2020-01-14
14	-52	2020-01-15
15	-49	2020-01-16
16	-65	2020-01-17
17	4	2020-01-18
18	84	2020-01-19
19	44	2020-01-20
20	-69	2020-01-21
21	-3	2020-01-22
22	96	2020-01-23
23	13	2020-01-24
24	80	2020-01-25
25	-3	2020-01-26
26	-73	2020-01-27
27	-51	2020-01-28
28	35	2020-01-29
29	40	2020-01-30
30	24	2020-01-31
31	-56	2020-02-01

# 先生成一個帶有時間資料的DataFrame陣列
b.index = pd.to_datetime(b["date"])
b
執行結果:
num	date
date		
2020-01-01	13	2020-01-01
2020-01-02	76	2020-01-02
2020-01-03	-93	2020-01-03
2020-01-04	87	2020-01-04
2020-01-05	-16	2020-01-05
2020-01-06	67	2020-01-06
2020-01-07	-79	2020-01-07
2020-01-08	-10	2020-01-08
2020-01-09	5	2020-01-09
2020-01-10	-93	2020-01-10
2020-01-11	9	2020-01-11
2020-01-12	24	2020-01-12
2020-01-13	61	2020-01-13
2020-01-14	82	2020-01-14
2020-01-15	-52	2020-01-15
2020-01-16	-49	2020-01-16
2020-01-17	-65	2020-01-17
2020-01-18	4	2020-01-18
2020-01-19	84	2020-01-19
2020-01-20	44	2020-01-20
2020-01-21	-69	2020-01-21
2020-01-22	-3	2020-01-22
2020-01-23	96	2020-01-23
2020-01-24	13	2020-01-24
2020-01-25	80	2020-01-25
2020-01-26	-3	2020-01-26
2020-01-27	-73	2020-01-27
2020-01-28	-51	2020-01-28
2020-01-29	35	2020-01-29
2020-01-30	40	2020-01-30
2020-01-31	24	2020-01-31
2020-02-01	-56	2020-02-01

# 再通過index修改索引

'''
補充
1.傳入年或者年月作為切片方式
2.傳入日期範圍作為切片方式
3.豐富的函式支援:resample(),strftime(),…
4.批量轉換為Datetime物件:to_pydatetime()
a.resample("3D").mean()  # 計算每三天的均值
a.resample("3D"),sum()   # 計算每三天的和

'''

資料分組與聚合

x2 = pd.DataFrame({'key1':['x','x','y','y','x'],'key2':['one','two','one','two','one'],'data1':np.random.randn(5),'data2':np.random.randn(5)})
x2
執行結果:
key1	key2	data1	data2
0	x	one	-1.035376	-0.771586
1	x	two	-0.431538	-0.417636
2	y	one	0.961583	1.500525
3	y	two	-0.969363	-1.919455
4	x	one	1.080788	0.720058

n1 = x2['data1'].groupby(x2['key1'])
n1.mean()  # 呼叫mean函式求出平均值
n2 = x2['data1'].groupby([x2['key1'],x2['key2']])
n2.mean() 
執行結果:
key1  key2
x     one     0.022706
      two    -0.431538
y     one     0.961583
      two    -0.969363
Name: data1, dtype: float64
        
n2.mean().unstack()
執行結果:
key2	one	two
key1		
x	0.022706	-0.431538
y	0.961583	-0.969363
# 通過unstack方法就可以讓索引不堆疊在一起了

# 以上面的n2測試
n2.size()
key1  key2
x     one     2
      two     1
y     one     1
      two     1
Name: data1, dtype: int64

聚合函式的自定義

# 使用自定義的聚合函式,需要將其傳入aggregate或者agg方法當中
def peak_to_peak(arr):
    return arr.max() - arr.min()
n1.aggregate(peak_to_peak)
執行結果:
key1
x    2.116164
y    1.930947
Name: data1, dtype: float64

多個聚合函式聯合

n1.agg(['mean','std'])
執行結果:
mean	std
key1		
x	-0.128708	1.090099
y	-0.003890	1.365385

n2.agg(['mean','std','sum']).unstack()
執行結果:
mean	std	sum
key2	one	two	one	two	one	two
key1						
x	0.022706	-0.431538	1.496354	NaN	0.045412	-0.431538
y	0.961583	-0.969363	NaN	NaN	0.961583	-0.969363

"""
總結
   聚合函式的時候 單個情況下可以直接點選函式名
   df.sum()
   如果想要執行多個聚合函式
   df.agg(['mean','sum']) 多個
   df.agg(['mean'])  單個
"""

apply

支援你自定義各種對資料的操作方式

資料分析的資料來源

  • 公司內部

  • 從外購買的

  • 爬蟲爬取

    '''
    HTML:超文字標記語言
    HTML頁面:就是由一系列html標籤組成的瀏覽器能夠直接檢視的介面
    '''
    
    # 1.分析NBA各球隊冠軍次數及球員FMVP次數
    import numpy as np
    import pandas as pd
    ses1=pd.read_html(r"https://baike.baidu.com/item/NBA%E6%80%BB%E5%86%A0%E5%86%9B/2173192") #切記 如果報錯記得在網址前加r
    # 返回的是一個列表 列表中是當前頁面的所有表格資料
    ses1
    執行結果:
    [       0          1          2    3        4         5
     0     年份       比賽日期         冠軍  總比分       亞軍      FMVP
     1   1947  4.16-4.22      費城勇士隊  4-1   芝加哥牡鹿隊         無
     2   1948  4.10-4.21    巴爾的摩子彈隊  4-2    費城勇士隊         無
     3   1949   4.4-4.13  明尼阿波利斯湖人隊  4-2   華盛頓國會隊         無
     4   1950   4.8-4.23  明尼阿波利斯湖人隊  4-2  塞拉庫斯民族隊         無
     ..   ...        ...        ...  ...      ...       ...
     69  2015   6.5-6.17      金州勇士隊  4-2  克里夫蘭騎士隊  安德烈·伊戈達拉
     70  2016   6.3-6.20    克里夫蘭騎士隊  4-3    金州勇士隊   勒布朗·詹姆斯
     71  2017   6.2-6.13      金州勇士隊  4-1  克利夫蘭騎士隊    凱文·杜蘭特
     72  2018    6.1-6.9      金州勇士隊  4-0  克利夫蘭騎士隊    凱文·杜蘭特
     73  2019  5.31-6.14     多倫多猛龍隊  4-2    金州勇士隊    科懷·倫納德
     
     [74 rows x 6 columns],
            0    1                  2     3  \
     0     聯盟   賽區                 球隊  奪冠次數   
     1   東部聯盟  大西洋           波士頓凱爾特人隊    17   
     2   西部聯盟  太平洋             洛杉磯湖人隊    16   
     3   西部聯盟  太平洋          金州勇士隊 [1]     6   
     4   東部聯盟   中部             芝加哥公牛隊     6   
     5   西部聯盟   西南           聖安東尼奧馬刺隊     5   
     6   東部聯盟  大西洋             費城76人隊     3   
     7   東部聯盟   中部             底特律活塞隊     3   
     8   東部聯盟   東南             邁阿密熱火隊     3   
     9   東部聯盟  大西洋             紐約尼克斯隊     2   
     10  西部聯盟   西南             休斯敦火箭隊     2   
     11  西部聯盟  太平洋           薩克拉門託國王隊     1   
     12  東部聯盟   東南            亞特蘭大老鷹隊     1   
     13  東部聯盟   中部            密爾沃基雄鹿隊     1   
     14  西部聯盟   西北            波特蘭開拓者隊     1   
     15  東部聯盟   東南             華盛頓奇才隊     1   
     16  西部聯盟   西北  俄克拉荷馬城雷霆隊(西雅圖超音速)     1   
     17  西部聯盟   西南             達拉斯小牛隊     1   
     18  東部聯盟   中部            克里夫蘭騎士隊     1   
     19  東部聯盟  大西洋             多倫多猛龍隊     1   
     20  東部聯盟  大西洋            布魯克林籃網隊     0   
     21  東部聯盟   中部           印第安納步行者隊     0   
     22  東部聯盟   東南             夏洛特黃蜂隊     0   
     23  東部聯盟   東南             奧蘭多魔術隊     0   
     24  西部聯盟  太平洋             洛杉磯快船隊     0   
     25  西部聯盟  太平洋            菲尼克斯太陽隊     0   
     26  西部聯盟   西北              丹佛掘金隊     0   
     27  西部聯盟   西北           明尼蘇達森林狼隊     0   
     28  西部聯盟   西北              猶他爵士隊     0   
     29  西部聯盟   西南             孟菲斯灰熊隊     0   
     30  西部聯盟   西南            新奧爾良鵜鶘隊     0   
     31   已撤銷  已撤銷             巴爾的摩子彈     1   
     
                                                         4  
     0                                                奪冠年份  
     1   1957、1959-1966、1968-1969、1974、 1976、1981、1984、...  
     2   1949-1950、1952-1954、1972、1980、1982、 1985、1987-...  
     3                       1947、1956、1975、2015、2017-2018  
     4                                 1991-1993、1996-1998  
     5                            1999、2003、2005、2007、2014  
     6                                      1955、1967、1983  
     7                                      1989-1990、2004  
     8                                      2006、2012、2013  
     9                                           1970、1973  
     10                                          1994-1995  
     11                                               1951  
     12                                               1958  
     13                                               1971  
     14                                               1977  
     15                                               1978  
     16                                               1979  
     17                                               2011  
     18                                               2016  
     19                                               2019  
     20                                                NaN  
     21                                                NaN  
     22                                                NaN  
     23                                                NaN  
     24                                                NaN  
     25                                                NaN  
     26                                                NaN  
     27                                                NaN  
     28                                                NaN  
     29                                                NaN  
     30                                                NaN  
     31                                   1948(該隊並非現奇才隊前身)  ]
    
    # 獲取有效資料
    cv = ses1[0]
    cv
    執行結果:
    0	1	2	3	4	5
    0	年份	比賽日期	冠軍	總比分	亞軍	FMVP
    1	1947	4.16-4.22	費城勇士隊	4-1	芝加哥牡鹿隊	無
    2	1948	4.10-4.21	巴爾的摩子彈隊	4-2	費城勇士隊	無
    3	1949	4.4-4.13	明尼阿波利斯湖人隊	4-2	華盛頓國會隊	無
    4	1950	4.8-4.23	明尼阿波利斯湖人隊	4-2	塞拉庫斯民族隊	無
    ...	...	...	...	...	...	...
    69	2015	6.5-6.17	金州勇士隊	4-2	克里夫蘭騎士隊	安德烈·伊戈達拉
    70	2016	6.3-6.20	克里夫蘭騎士隊	4-3	金州勇士隊	勒布朗·詹姆斯
    71	2017	6.2-6.13	金州勇士隊	4-1	克利夫蘭騎士隊	凱文·杜蘭特
    72	2018	6.1-6.9	金州勇士隊	4-0	克利夫蘭騎士隊	凱文·杜蘭特
    73	2019	5.31-6.14	多倫多猛龍隊	4-2	金州勇士隊	科懷·倫納德
    74 rows × 6 columns
    
    # 1.將第一行變成列名稱(原來的行資料還在)
    cv.columns = cv.lioc[0]
    cv
    # 2.將第二行資料刪除 del drop
    cv.drop([0],inplace = True) # 預設不是修改的原資料 可以加inplace引數
    cv
    執行結果:
    年份	比賽日期	冠軍	總比分	亞軍	FMVP
    1	1947	4.16-4.22	費城勇士隊	4-1	芝加哥牡鹿隊	無
    2	1948	4.10-4.21	巴爾的摩子彈隊	4-2	費城勇士隊	無
    3	1949	4.4-4.13	明尼阿波利斯湖人隊	4-2	華盛頓國會隊	無
    4	1950	4.8-4.23	明尼阿波利斯湖人隊	4-2	塞拉庫斯民族隊	無
    5	1951	4.7-4.21	羅切斯特皇家隊	4-3	紐約尼克斯隊	無
    ...	...	...	...	...	...	...
    69	2015	6.5-6.17	金州勇士隊	4-2	克里夫蘭騎士隊	安德烈·伊戈達拉
    70	2016	6.3-6.20	克里夫蘭騎士隊	4-3	金州勇士隊	勒布朗·詹姆斯
    71	2017	6.2-6.13	金州勇士隊	4-1	克利夫蘭騎士隊	凱文·杜蘭特
    72	2018	6.1-6.9	金州勇士隊	4-0	克利夫蘭騎士隊	凱文·杜蘭特
    73	2019	5.31-6.14	多倫多猛龍隊	4-2	金州勇士隊	科懷·倫納德
    73 rows × 6 columns
    
    # 針對冠軍欄位分組
    cv.groupby('冠軍').groups
    執行結果:
    {'休斯頓火箭隊': [48, 49], '克里夫蘭騎士隊': [70], '華盛頓子彈隊': [32], '聖安東尼奧馬刺隊': [53, 57, 59, 61, 68], '聖路易斯老鷹隊': [12], '塞拉庫斯民族隊': [9], '多倫多猛龍隊': [73], '密爾沃基雄鹿隊': [25], '巴爾的摩子彈隊': [2], '底特律活塞隊': [43, 44, 58], '明尼阿波利斯湖人隊': [3, 4, 6, 7, 8], '波士頓凱爾特人隊': [11, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 28, 30, 35, 38, 40, 62], '波特蘭開拓者隊': [31], '洛杉磯湖人隊': [26, 34, 36, 39, 41, 42, 54, 55, 56, 63, 64], '紐約尼克斯隊': [24, 27], '羅切斯特皇家隊': [5], '芝加哥公牛隊': [45, 46, 47, 50, 51, 52], '西雅圖超音速隊': [33], '費城76人隊': [21, 37], '費城勇士隊': [1, 10], '達拉斯小牛隊': [65], '邁阿密熱火隊': [60, 66, 67], '金州勇士隊': [29, 69, 71, 72]}
    
    # 獲取分組之後的各分組大小
    cv.groupby('冠軍').size()
    執行結果:
    冠軍
    休斯頓火箭隊        2
    克里夫蘭騎士隊       1
    華盛頓子彈隊        1
    聖安東尼奧馬刺隊      5
    聖路易斯老鷹隊       1
    塞拉庫斯民族隊       1
    多倫多猛龍隊        1
    密爾沃基雄鹿隊       1
    巴爾的摩子彈隊       1
    底特律活塞隊        3
    明尼阿波利斯湖人隊     5
    波士頓凱爾特人隊     17
    波特蘭開拓者隊       1
    洛杉磯湖人隊       11
    紐約尼克斯隊        2
    羅切斯特皇家隊       1
    芝加哥公牛隊        6
    西雅圖超音速隊       1
    費城76人隊        2
    費城勇士隊         2
    達拉斯小牛隊        1
    邁阿密熱火隊        3
    金州勇士隊         4
    dtype: int64
        
    # 獲取各組冠軍次數
    cv.groupby('冠軍').size().sort_values(ascending=False) # 升序
    執行結果:
    冠軍
    波士頓凱爾特人隊     17
    洛杉磯湖人隊       11
    芝加哥公牛隊        6
    聖安東尼奧馬刺隊      5
    明尼阿波利斯湖人隊     5
    金州勇士隊         4
    邁阿密熱火隊        3
    底特律活塞隊        3
    休斯頓火箭隊        2
    紐約尼克斯隊        2
    費城76人隊        2
    費城勇士隊         2
    塞拉庫斯民族隊       1
    克里夫蘭騎士隊       1
    華盛頓子彈隊        1
    達拉斯小牛隊        1
    聖路易斯老鷹隊       1
    西雅圖超音速隊       1
    多倫多猛龍隊        1
    密爾沃基雄鹿隊       1
    羅切斯特皇家隊       1
    波特蘭開拓者隊       1
    巴爾的摩子彈隊       1
    dtype: int64
        
    # 分組欄位可以一次性取多個
    cv.groupby(['冠軍','FMVP']).size()
    執行結果:
    冠軍         FMVP      
    休斯頓火箭隊     哈基姆·奧拉朱旺       2
    克里夫蘭騎士隊    勒布朗·詹姆斯        1
    華盛頓子彈隊     韋斯·昂塞爾德        1
    聖安東尼奧馬刺隊   託尼·帕克          1
               科懷·倫納德         1
               蒂姆·鄧肯          3
    聖路易斯老鷹隊    無              1
    塞拉庫斯民族隊    無              1
    多倫多猛龍隊     科懷·倫納德         1
    密爾沃基雄鹿隊    賈巴爾            1
    巴爾的摩子彈隊    無              1
    底特律活塞隊     喬·杜馬斯          1
               伊塞亞·托馬斯        1
               昌西·比盧普斯        1
    明尼阿波利斯湖人隊  無              5
    波士頓凱爾特人隊   喬·喬·懷特         1
               保羅·皮爾斯         1
               塞德里克·麥克斯維爾     1
               拉里·伯德          2
               無             10
               傑裡·韋斯特         1
               約翰·哈夫利切克       1
    波特蘭開拓者隊    比爾·沃頓          1
    洛杉磯湖人隊     埃爾文·約翰遜        3
               張伯倫            1
               沙奎爾·奧尼爾        3
               科比·布萊恩特        2
               詹姆斯·沃西         1
               賈巴爾            1
    紐約尼克斯隊     威利斯·裡德         2
    羅切斯特皇家隊    無              1
    芝加哥公牛隊     邁克爾·喬丹         6
    西雅圖超音速隊    丹尼斯·約翰遜        1
    費城76人隊     摩西·馬龍          1
               無              1
    費城勇士隊      無              2
    達拉斯小牛隊     德克·諾維茨基        1
    邁阿密熱火隊     勒布朗·詹姆斯        2
               德懷恩·韋德         1
    金州勇士隊      凱文·杜蘭特         2
               安德烈·伊戈達拉       1
               裡克·巴里          1
    dtype: int64
    
    # 歐洲盃
    # 分析歐洲盃和歐洲冠軍聯賽決賽名單
    url="https://en.wikipedia.org/wiki/List_of_European_Cup_and_UEFA_Champions_League_finals"
    eu_champions=pd.read_html(url)  # 獲取資料
    
    b1 = eu_champions[2]    # 取出決賽名單
    
    
    b1.columns = b1.loc[0]  # 使用第一行的資料替換預設的橫向索引
    
    
    b1.drop(0,inplace=True)  # 將第一行的資料刪除
    b1.drop('#',axis=1,inplace=True)  # 將以#為列名的那一列刪除
    
    b1.columns=['Season', 'Nation', 'Winners', 'Score', 'Runners_up', 'Runners_up_Nation', 'Venue','Attendance']  # 設定列名
    
    b1.tail()  # 檢視後五行資料
    b1.drop([64,65],inplace=True)  # 刪除其中的缺失行以及無用行
    b1
    

    Matplotlib模組

可以將numpy pandas裡面的資料用圖形化的展示出來

是一個強大的python繪圖和資料視覺化工具包,資料視覺化也是我們資料分析重要環節之一,可以幫助我們分析出很多價值資訊,也是資料分析的最後一個視覺化階段

匯入語句

# 下載
pip3 install matplotlib

# 推薦語法
import matplotlib.pyplot as plt