1. Python資料分析介紹及環境搭建
1.1python資料分析簡介【了解】
1.1.1 python做資料分析的優勢
- 可以獨立完成資料分析的各種任務
- 功能強大,有海量的開源包(pandas,numpy...)
- 處理海量資料效率高
- 開源免費
1.1.2 常用python資料分析開源庫
- numpy:用于數組計算
- pandas:分析結構化資料的工具集
- series:類似一維數組的對象(一行資料或者一列資料)
- dataframe:表格型資料結構(有行有列的資料)
- matplotlib,seaborn:可視化開源庫
- scikit-learn:基于python語言的機器學習開源庫
- jupyter notebook:不是開源庫,是資料分析的首選開發環境,類似于pycharm
1.2 python資料分析環境搭建
1.2.1 anaconda簡介【了解】
- 是資料分析平台
- 可以管理安裝包和虛拟環境
1.2.2 anaconda的虛拟環境管理
- 概念:是一個包含了特定 Python 解析器以及一些軟體包的自包含目錄【了解】
- 作用【知道】
- 隔離不同python版本或者相同開源庫的不同版本
- 能夠讓不同版本的代碼在不同的虛拟環境中運作
- 虛拟環境常用終端行指令【掌握】
# 建立虛拟環境 python=3.8 指定python版 conda create -n 虛拟環境名稱 python=3.8 # 進入虛拟環境 conda activate 虛拟環境名稱 # 退出虛拟環境 conda deactivate # 删除虛拟環境 conda remove -n 虛拟環境名稱 --all # 檢視已建立的虛拟環境 conda env list
1.2.3 anaconda的包管理功能
# 安裝python的第三方包
pip install 包名
# 解除安裝python的第三方包
pip uninstall 包名
# 安裝其他包速度慢可以指定國内鏡像
# 阿裡雲:https://mirrors.aliyun.com/pypi/simple/
# 豆瓣:https://pypi.douban.com/simple/
# 清華大學:https://pypi.tuna.tsinghua.edu.cn/simple/
# 中國科學技術大學 http://pypi.mirrors.ustc.edu.cn/simple/
pip install 包名 -i https://mirrors.aliyun.com/pypi/simple/ #通過阿裡雲鏡像安裝
1.2.4 jupyter notebook的使用
-
終端啟動
這種方式先啟動cmd,通過切換虛拟環境和磁盤位置,再啟動Jupyter notebook
# 可選操作,切換虛拟環境,使用不同的python解釋器和包,預設使用base環境
conda activate 虛拟環境名字
# 切換磁盤位置,到指定目錄下啟動
cd d:/test
# 啟動jupyter notebook
jupyter notebook
# 将終端網址複制到浏覽器
# http://127.0.0.1:8888/?token=b37f5e4da9892205efd9d87db55260054232ddc0ebb25e78
- 常用快捷鍵【知道】
- Jupyter Notebook中分為兩種模式:指令模式和編輯模式
- 兩種模式通用快捷鍵
-
,執行本單元代碼,并跳轉到下一單元Shift+Enter
-
,執行本單元代碼,留在本單元Ctrl+Enter
-
- 按ESC進入指令模式
-
,cell切換到Code模式Y
-
,cell切換到Markdown模式M
-
,在目前cell的上面添加cellA
-
,在目前cell的下面添加cellB
-
:删除目前cell輕按兩下D
-
- 編輯模式:按Enter進入,或滑鼠點選代碼編輯框體的輸入區域
- 回退:
(Mac:CMD+Z)Ctrl+Z
- 補全代碼:變量、方法後跟
Tab鍵
- 為一行或多行代碼添加/取消注釋:
(Mac:CMD+/)Ctrl+/
- 回退:
- 使用markdown
- 在指令模式(ESC)中,按M即可進入到Markdown編輯模式
- markdown基本文法:标題和縮進
# 一級标題 ## 二級标題 ### 三級标題 - 一級縮進 - 二級縮進 - 三級縮進
1.3 pandas dataframe入門
1.3.1導包并加載資料【知道】
import pandas as pd
df = pd.read_csv('.../xxx.csv')
df = pd.read_csv('.../xxx.tsv',sep='\t')
...
- csv和tsv檔案的差別
- csv是以逗号作為行内資料的分隔符
- tsv是以\t(table)作為行内資料的分隔符
- 二者都是以換行符\n為行與行之間的分割
- Pandas導出導入資料
-
讀取(導入)資料注意是pandas.read_xxxpd.read_xxx()
-
儲存(導出)資料注意是dataframe.to_xxxdf.to_xxx('.../xxx.xxx')
-
1.3.2 檢視部分資料【重要】
- 加載列資料
# 加載一列資料 df['列名'] # 加載多列資料 df[['列名1','列名2','列名3'...]]
- 加載行資料或者行列部分資料
# 通過行索引序号加載前五條資料,head(n=),預設n=5,可以手動傳入想檢視的行數 df.head() # # 通過行索引序号加載後五條資料,tail(n=),預設n=5,可以手動傳入想檢視的行數 df.tail()
- loc:根據行索引标簽/值加載行資料,還可以通過切片方法擷取資料,左閉右閉
# 加載一行資料 df.loc['行索引值'] # 加載多行資料 df.loc[['行索引值1','行索引值2','行索引值3'...]] df.loc['行索引值1':'行索引值2'] # 加載某行某列資料 df.loc[['行索引值'],['列索引值']] # 加載多行多列 df.loc[['行索引值1','行索引值2'...],['列索引值1','列索引值2'...]] df.loc['行索引值1':'行索引值2','列索引值1':'列索引值2']
- iloc:根據行索引序号加載行資料,還可以通過切片方法擷取資料,左閉右開
# 加載一行資料 df.iloc['行索引序号'] # 加載多行資料 df.iloc[['行索引序号1','行索引序号2','行索引序号3'...]] df.iloc['行索引序号1':'行索引序号2'] # 加載某行某列資料 df.iloc[['行索引序号'],['列索引序号']] # 加載多行多列 df.iloc[['行索引序号1','行索引序号2'...],['列索引序号1','列索引序号2'...]] df.iloc['行索引序号1':'行索引序号2','列索引序号1':'列索引序号2']
1.3.3 分組聚合【重要】
- 分組聚合表達式
# 對一列分組一列聚合
df.groupby('分組的列名')['聚合的列名'].聚合函數()
# 對多列分組多列聚合 注意多列分組聚合時,聚合部分為兩個清單,否則報錯
df.groupby(['分組的列名1','分組的列名2'...])[['聚合的列名1','聚合的列名2'...]].聚合函數()
- 常用的聚合函數
sum() # 求和
mean() # 求平均
std() # 标準差
max() # 最大值
min() # 最小值
count() # 非空值個數
nunique() # 唯一值個數
1.4 pandas資料結構
1.4.1 Series常用操作【知道】
- Series建立:傳入一個Python清單
- 如果傳入的資料類型是統一的數字,那麼最終的dtype類型是int64
- 如果傳入的資料類型是統一的字元串,那麼最終的dtype類型是object
- 如果傳入的資料類型是多種類型,那麼最終的dtype類型也是object
# data=,傳入要python清單;index=指定行索引,不傳的話行索引預設為0,1,2...
pd.Series(data=,index=)
# 例子1
s = pd.Series(['banana', 42])
# 輸出結果如下
0 banana
1 42
dtype: object
#例子2
s = pd.Series(['Wes McKinney','Male'],index = ['Name','Gender'])
# 輸出結果如下
Name Wes McKinney
Gender Male
dtype: object
- Series常用屬性
s.index # 擷取行索引,屬性
s.keys() # 擷取行索引,方法
# 屬性後面不加(),方法後面加()
s.values # 擷取值
- Series常用方法
s.mean() # 平均值
s.max() # 最大值
s.min() # 最小值
s.std() # 标準差
s.value_counts() # 不同值(不同類别)的條目數量
s.count() # 非空值個數
s.describe()
# 輸出數值列統計描述:①count非空值個數,②mean平均值,③std标準差,④max最小值,⑤25%四分之一分位值,⑥50%二分之一分位值,⑦75%四分之三分位值,⑧最大值
# 輸出非數值列統計描述:①count非空值個數,②unique唯一值個數,③top出現次數最多的值,④freq出現最多值的次數
- 通過布爾值清單擷取Series部分資料
s[[True,False,True,False]]
# 傳回為True的值,最後傳回兩個值
- Series運算
- series和數值型變量計算
- 變量和series中的每個元素逐一進行計算
- 兩個Series之間計算
- 根據索引比對規則進行計算,相同的索引進行計算,不同的索引無法計算,用NaN填充
- series和數值型變量計算
1.4.2 DataFrame常用操作【重要】
- 常用屬性和方法
df.shape # 檢視行數,列數
df.size # 檢視資料個數
len(df) # 檢視資料行數
df.count() # 檢視各列非空值個數
df.max() # 檢視各列最大值,數值列傳回最大值,非數值列傳回出現次數最多的值
df.min()
df.describe() # 傳回數值列統計描述
- DataFrame的布爾索引
- 同Series一樣,DataFrame也可以使用布爾索引擷取資料子集
# 擷取前5行資料中的第1、2、4個
movie.head()[[True,True,False,True,False]]
- dataframe的運算
- 當DataFrame和數值進行運算時,DataFrame中的每一個元素會分别和數值進行運算
- 兩個DataFrame之間進行計算,和series一樣會根據索引的值進行對應計算
- 當兩個DataFrame索引值不能對應時,不比對的會傳回NaN
- DataFrame中如果有非數值列,隻能進行相加或者相乘的操作,對非數值列進行複制,其他計算會發生報錯
- 指定某列為DataFrame索引
df.set_index('列名') # 括号裡列為指定索引列
pd.read_csv('path',index_col='列名') # 加載資料時通過index_col指定某列為df的索引
df.reset_index() # 重置索引,變為0,1,2,3...
- 修改行名列名
# 方法一
df.rename(index={'原行名1':'新行名1','原行名2':'新行名2'...},columns={'原列名1':'新列名1','原列名2':'新列名2'...},inplace=True)
# index=,columns= 後跟要修改的行列名字典
# inplace=True 在源資料上修改,預設False,在記憶體或者副本上修改,源資料并沒有修改
# 涉及到df修改删除操作,不指定inplace=True,預設源資料不會進行修改,或者将修改的資料重新儲存為一個變量名
# 方法二
将df.index 和 df.columns屬性提取出來,修改之後,再指派回去
- 添加删除插入
- 通過
添加新列,添加至最後dataframe['列名']
df['新列名'] = 常數 df['新列名'] = df['列名1'] + df['列名2'] # 數值列加減乘除都可以,一行一行計算
- 删除列
df.drop('列名',axis='columns',inplace=True) # inplace=True源資料上删除,axis='columns',預設按行删除,axis='index'
- 插入列
df.insert(loc=列下标數字, column='列名', value=該列所有的值) # loc= 插入列的位置,按列索引序号 # column= 新插入列的名字 # value= 新插入列的值,可以是常用,也可以是計算完的結果
- 通過
1.4.3 導出導入資料【重要】
- 導入加載資料
pd.read_xxx('檔案路徑') # 常用方法 read_csv(),read_excel() # 加載mysql資料庫資料 # 方法一:用DBAPI建構資料庫連結engine import pandas as pd import pymysql conn = pymysql.connect(host='localhost', user='root', password='', database='database_name') df = pd.read_sql("select * from table_name",con=conn) # 方法二:用sqlalchemy建構資料庫連結engine import sqlalchemy from sqlalchemy import create_engine #connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE) connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}'.format('root', '', 'localhost', 3306, 'nowcoderdb') engine=create_engine(connect_info) df=pd.read_sql("select * from table_name",con=engine)
- 導出資料
pd.to_xxx('檔案路徑') # 常用方法 to_csv(),to_excel() # 導出資料到msyql資料庫 import sqlalchemy from sqlalchemy import create_engine #connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE) connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}'.format('root', '', 'localhost', 3306, 'nowcoderdb') engine=create_engine(connect_info) df.to_sql('表名',engine,if_exists='') # if_exists='',replace:删除表,重新建立儲存資料(覆寫資料),append:向表中追加資料
1.5 Pandas資料分析入門
- describe() 【知道】
- 預設列印資料值列統計描述
- 列印非數值列統計描述
import numpy as np df.describe(include=[np.object, pd.Categorical]) # np.object 字元串類型 # pd.Categorical dataframe特有的類别類型
- info() 【知道】
- 傳回所有字段的條目數量、資料類型、是否缺失,及目前資料集整體的記憶體占用情況
- 常用排序方法
- nlargest() 【知道】
df.nlargest(n,columns) # 根據指定列的值由大到小排列,傳回n行資料
- nsmallest() 【知道】
df.nsmallest(n,columns) # 根據指定列的值由小到大排列,傳回n行資料
- sort_values() 【重要】
# 對一列進行排序 ascending預設升序True,False為降序 df.sort_values(by='列名',ascending='') # 對多列進行排序 # 多列排序時,ascending 參數傳入一個清單,排序參數也是一個清單,并且一一對應 df.sort_values(by=['列名1','列名2'...],ascending='') df.sort_values(by=['列名1','列名2'...],ascending=[True,False...])
- nlargest() 【知道】
- 去重 【重要】
# 删除列名1,列名2...相同的資料,預設保留第一條資料 df.drop_duplicates(subset=['列名1','列名2'...])