pandas模組篇(終章)及初識mataplotlib
阿新 • • 發佈:2020-09-08
今日內容概要
- 時間序列
- 針對表格資料的分組與聚合操作
- 其他函式補充(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