数据挖掘零基础入门
數據挖掘基礎day01
- 1.jupyter notebook的使用
- 兩種模式下的通用快捷鍵
- 命令模式
- 編輯模式
- 2. Matplotlib
- 2.1實現一個簡單的畫圖
- 2.2Matplotlib三層結構
- 2.3折線圖繪制
- 2.3.1Matplotlib.pyplot模塊
- 2.3.2設置畫布屬性與圖片保存
- 2.3.2.1圖片保存
- 2.3.3修改x,y刻度
- Matplotlib不顯示中文解決辦法
- Matplotlib不顯示負號解決辦法
- 2.3.4添加網格顯示
- 2.3.5添加描述信息
- 2.3.6多個圖像繪制
- 2.3.7多個坐標系顯示圖像
- 2.3.8折線圖應用場景
- 2.4散點圖
- 2.5柱狀圖
- 2.5.1如何實現首日數據和首周數據的顯示
- 2.6直方圖
- 注意點
- 2.7餅圖
- 3numpy
- ndarray
- 屬性
- 形狀
- 方法
- 生成數組的方法
- 生成0和1的數組
- 從現有數組中生成
- 生成固定范圍的數組
- 生成隨機數組
- ndarray運算
- 邏輯運算
- 統計運算
- 數組間運算
- 矩陣運算
- 數組的合并
- 數組的分割
- IO操作與數據處理
- Pandas
- 核心數據結構
- DataFrame
- DataFrame屬性
- 方法
- DataFrame索引的設置
- MultiIndex與Panel
- series
- 屬性
- 基本數據操作
- DataFrame運算
- Pandas畫圖
- 文件的讀取與存儲
- CSV
- HDF5
- JSON
- Pandas高級処理
- 缺失值處理
- 數據離散化
- 合并
- 交叉表和透視表
- 分組與聚合
1.jupyter notebook的使用
兩種模式下的通用快捷鍵
Shift+Enter ,執行本單元代碼,并自動跳轉到下一個cell
Ctrl+Enter,執行本單元代碼,并留在本cell中
cell行號前面的*號,代表本cell正在運行
命令模式
按Esc進入命令模式
Y,切換到代碼模式
M,切換到Markdown模式
A,在本cell前添加一個單元格
B,在本cell后添加一個單元格
雙擊D,刪除本單元格
Z,回退
編輯模式
按Enter進入編輯模式
多光標操作:ctrl鍵點擊鼠標
回退:ctrl+z
補全代碼:Tab
注釋:ctrl+/
屏蔽輸出結果:在輸出結果前雙擊
2. Matplotlib
專門用于2D畫圖
能將數據進行可視化,幫助理解數據。
2.1實現一個簡單的畫圖
import matplotlib.pyplot as plt %matplotlib inlineplt.figure() plt.plot([1, 0, 9], [4, 5, 6]) plt.show()2.2Matplotlib三層結構
1)容器層
畫板層Canvas
畫布層Figure
繪圖區/坐標系 x、y軸區域
2)輔助顯示層 輔助信息顯示,如網格線等
3)圖像層 畫不同類型的圖,如柱狀圖,折線圖等
2.3折線圖繪制
2.3.1Matplotlib.pyplot模塊
#畫圖三步走# 創建畫布 plt.figure() # 繪制圖像 plt.plot([1,2,3,4,5,6,7], [17,17,18,15,11,11,13]) # 顯示圖像 plt.show()2.3.2設置畫布屬性與圖片保存
plt.figure(figsize=(),dpi=)
figsize:指定圖的長寬
dpi:圖像的清晰度
返回fig對象
2.3.2.1圖片保存
plt.savefig(路徑)注意:要在plt.show前使用,因為plt.show會釋放figure資源
2.3.3修改x,y刻度
Matplotlib不顯示中文解決辦法
只需要加入兩行代碼即可
import matplotlib matplotlib.rc('font', family='FangSong')Matplotlib不顯示負號解決辦法
plt.rcParams['axes.unicode_minus'] = False # 需求:畫出某城市11點到12點的溫度變化 import random #準備數據 x = range(60) y_shanghai = [random.uniform(15,18) for i in x] #創建畫布 plt.figure(figsize=(20,8),dpi = 80) #繪制圖像 plt.plot(x,y_shanghai)#添加x、y刻度 # 準備x的刻度說明 x_lable = ["11點{}分".format(i) for i in x] plt.xticks(range(0,60,5),x_lable[::5]) plt.yticks(range(0,40,5)) #顯示圖像 plt.show()2.3.4添加網格顯示
plt.grid(True,linestyle=’–’,alpha=0.5)
True:是否添加網格 默認為True
linestyle:網格風格
alpha:透明度
2.3.5添加描述信息
#添加描述徐信息 plt.xlabel("時間變化") plt.ylabel("溫度變化") plt.title("某城市11點-12點溫度變化")2.3.6多個圖像繪制
# 需求:畫出某城市11點到12點的溫度變化 import random #準備數據 x = range(60) y_shanghai = [random.uniform(15,18) for i in x] y_beijing=[random.uniform(1,3) for i in x] #創建畫布 plt.figure(figsize=(20,8),dpi = 80) #繪制圖像 plt.plot(x,y_shanghai,color='r',linestyle='-.',label='上海') plt.plot(x,y_beijing,color='b',label="北京")#顯示圖例 plt.legend() *也可以使用loc參數改變圖例的位置 #添加x、y刻度 # 準備x的刻度說明 #添加網格顯示 plt.grid(True,linestyle='--',alpha=0.5)#添加描述徐信息 plt.xlabel("時間變化") plt.ylabel("溫度變化") plt.title("上海、北京11點-12點溫度變化") plt.xticks(range(0,60,5)) plt.yticks(range(0,40,5)) #顯示圖像 plt.show()2.3.7多個坐標系顯示圖像
fragure,axes = plt.subplots(nows=1,ncols=1,**frags)
nows:幾行
ncols:幾列
會返回畫布和畫圖區對象
axes[0]代表第一個圖像 使用axes.方法名 使用
axes[1]代表第二個圖像
以此類推
2.3.8折線圖應用場景
某事物或某指標隨時間的變化狀況
還可以畫各種數學函數圖像
# 繪制數學函數圖像 # 準備數據 import numpy as npx = np.linspace(-10,10,1000) y = 2 * x * xplt.figure(figsize=(20,8),dpi = 80) plt.grid(linestyle='-.',alpha=0.5) plt.plot(x,y) plt.show()2.4散點圖
import matplotlib.pyplot as plt #散點圖 #準備數據 x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64,163.56, 120.06, 207.83, 342.75, 147.9 , 53.06, 224.72, 29.51,21.61, 483.21, 245.25, 399.25, 343.35]y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 , 239.34,140.32, 104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1 ,30.74, 400.02, 205.35, 330.64, 283.45] #創建畫布 plt.figure(figsize=(20,8),dpi = 80) #繪制圖像 plt.scatter(x,y) #顯示圖像 plt.show()2.5柱狀圖
#繪制票房分布直方圖 #準備數據 movie_names = ['雷神3:諸神黃昏','正義聯盟','東方快車謀殺案','尋夢環游記','全球風暴', '降魔傳','追捕','七十七天','密戰','狂獸','其它'] tickets = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]#窗間畫布 plt.figure(figsize=(20,8),dpi = 80) #繪制圖像 plt.bar(range(len(movie_names)),tickets,color=['b','r','g','y','c','m','y','k','c','g','b']) # 一定要先寫x,y坐標再寫color等其他信息 #修改x刻度 plt.xticks(range(len(movie_names)),movie_names) plt.title('票房數據') plt.grid(linestyle="-",alpha=0.5) #顯示圖像 plt.show()2.5.1如何實現首日數據和首周數據的顯示
# 準備數據 movie_name = ['雷神3:諸神黃昏','正義聯盟','尋夢環游記']first_day = [10587.6,10062.5,1275.7] first_weekend=[36224.9,34479.6,11830]#創建畫布 plt.figure(figsize=(20,8),dpi = 80) #繪制圖像 plt.bar(range(3),first_day,width=0.2,label='首日票房') plt.bar([0.2,1.2,2.2],first_weekend,width=0.2,label="首周票房") #width 控制柱子的寬度 #修改x刻度 plt.xticks([0.1,1.1,2.1],movie_name) plt.legend() #要配合繪制圖像中的label使用#顯示圖像 plt.show()2.6直方圖
# 需求:電影時長分布狀況 # 1、準備數據 time = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]#創建畫布 plt.figure(figsize=(20,8),dpi = 80) #繪制直方圖 plt.hist(time,(max(time)-min(time))//2) #組數等于極差/組距 plt.xticks(range(min(time),max(time)+2,2)) plt.grid(linestyle='-',alpha=0.5) #顯示圖像 plt.show()注意點
畫圖的時候注意組距的設置
2.7餅圖
movie_name = ['雷神3:諸神黃昏','正義聯盟','東方快車謀殺案','尋夢環游記','全球風暴','降魔傳','追捕','七十七天','密戰','狂獸','其它']place_count = [60605,54546,45819,28243,13270,9945,7679,6799,6101,4621,20105]plt.figure(figsize=(20,8),dpi = 80)plt.pie(place_count,labels=movie_name,colors=['b','r','g','y','c','m','y','k','c','g','y'], autopct="%.2f%%") #在pie的api中plt.pie(x,labels=,colors,autopct=) x:填入數字即可,pie會自動計算百分比plt.axis('equal') #設置圖形好像 圓圓的且居中 plt.legend()plt.show()3numpy
高效的運算工具
Numpy提供了一個N維數組類型ndarray,他描述了相同類型的“items”的集合。
ndarray
屬性
shape
ndim
size
dtype
itemsize
形狀
方法
生成數組的方法
生成0和1的數組
np.zeros(shape)
np.ones(shape)
從現有數組中生成
np.array()
np.asarray()深拷貝
np.copy()淺拷貝
生成固定范圍的數組
np.linspace(0,10,1000) 生成[0,10]之間1000個元素,且等距離
np.arange(0,10,1) 生成[0,10)步長為1 的數組
生成隨機數組
均勻分布:每組的可能性相同
np.random.uniform(low=-1,high=1,size=1000000)
正態分布:
np.random.normal(loc=1.75,scale=0.1,size=10000) loc:均值,scale:方差,size:大小
數組的索引和切片
[0,:3] :3代表從0-3的數據
形狀修改
ndarray.reshape(shape) 返回新的ndarray, 原始數據沒有改變,且reshape并沒有把行列互換,只是把原有數據重新切割,分成shape形狀
ndarray.resize() 沒有返回值, 對原始的ndarray進行了修改,且reshape并沒有把行列互換,只是把原有數據重新切割,分成shape形狀
ndarray.T 轉置 行變成列,列變成行 返回一個ndarray,原數據未改變
類型修改
ndarray.astype(type)
ndarray序列化到本地
ndarray.tostring()
數組去重
ndarray.unique()
ndarray運算
邏輯運算
布爾索引
通用判斷函數
np.all(布爾值) 只要有一個FALSE就返回FALSE,只有全是True才返回True
np.any(布爾值)只要有一個True就為True,只有全是FALSE才返回FALSE
三元運算符
np.where(三元運算符)
np.where(布爾值,True的值,False的值)
涉及符合邏輯需要額外的函數logical_and/or
大于0.5且小于1
np.where(np.logical_and(temp > 0.5, temp < 1), 1, 0)
大于0.5或小于-0.5
np.where(np.logical_or(temp > 0.5, temp < -0.5), 11, 3)
統計運算
統計指標函數
min,max,mean,median,var,std
np.函數名()
ndarray.方法名()
返回最大值最小值位置
np.argmax(tem,axis=0)
np.argmin(tem,axis=0)
數組間運算
ndarray數組與數的運算
正常的運算即可 加減乘除等
數組與數組的運算
數組與數組行列不同時,直接運算會出錯
廣播機制
執行broadcast的前提在于,兩個nadarray執行的是element-wise的運算,Broadcast機制的功能是為了方便不同形狀的ndarray(numpy庫的核心數據結構)進行數學運算。
當操作兩個數組時,numpy會逐個比較它們的shape(構成的元組tuple),只有在下述情況下,兩個數組才能夠進行數組與數組的運算。
- 維度相等
- shape(其中相對應的一個地方為1)
在根據廣播機制修改后,便可以運算了
矩陣運算
兩種方法存儲矩陣:
- np.ndarray()
- np.mat()
矩陣乘法:
如果矩陣使用ndarray存儲的話,可以用:
- np.matmul()
- np.dot()
如果矩陣用mat存儲,可以直接用運算符“*”來進行運算
如果ndarray想用“*”來進行運算,用@符號即可 eg:a @ b得到的結果便是a矩陣和b矩陣相乘的結果
數組的合并
np.hstack() 水平拼接
np.vstack() 豎直拼接
np.concatenate((a,b,c,…),axis=0/1) 若axis為0,豎直拼接,axis=1為水平拼接
數組的分割
np.split()
IO操作與數據處理
會遇到有缺失值的情況,有兩種處理情況:
- 把含有缺失值得數據刪除掉
- 若數據量少,可以使用插補法,求某一列平均值或中位數等
但是在numpy中處理很麻煩,所以使用pandas
Pandas
優勢:
便捷的數據處理能力
讀取文件方便
封裝了Matplotlib和numpy
核心數據結構
DataFrame
既有行索引,又有列索引的二維數組。
創建索引,并修改行索引index和列索引columns
DataFrame屬性
shape:形狀
index:行索引列表
columns:列索引列表
values:得到原始的ndarray數據
T:轉置
方法
head():默認顯示前五行,但也可以指定前幾行
tail():顯示數據的最后五行
DataFrame索引的設置
-
修改行列索引值
不可以單獨修改,必須整體修改
-
重設索引
-
設置新索引
MultiIndex與Panel
multiindex屬性:
Panel:存儲三維結構的容器
pandas.Panel(data=None,items=None,major_axis=None,minor_axis=None,copy=False,dtype=None)
items - axis 0,每個項目對應于內部包含的數據幀(DataFrame)。
major_axis - axis 1,它是每個數據幀(DataFrame)的索引(行)。
minor_axis - axis 2,它是每個數據幀(DataFrame)的列。
Pandas從版本0.20.0開始棄用,推薦的用于表示3D數據的方法是DataFrame上的MultiIndex方法
series
帶索引的一維數組
屬性
index
values
總結:DataFrame 是series的容器,Panel是DataFrame的容器
基本數據操作
索引操作
-
直接索引
-
按名字索引
-
按數字索引
-
組合索引
數字和名字混用
賦值操作
排序操作
- 對內容進行排序
dataframe
series
- 對索引進行排序
dataframe
series
DataFrame運算
算術運算
邏輯運算
邏輯運算符
邏輯運算函數
query()
isin()
統計運算
describe()
將返回關于列的最值,均值,方差等多種信息
累計統計函數
cumsum 計算前1/2/3/…/n個數的和
cummax 計算前1/2/3/…/n個數的最大值
cummin 計算前1/2/3/…/n個數的最小值
cumprod 計算前1/2/3/…/n個數的積
自定義運算
apply(func, axis=0)
? func: 自定義函數
? axis=0: 默認按列運算,axis=1按行運算
Pandas畫圖
pandas.DataFrame.plot
DataFrame.plot(x=None, y=None, kind=‘line’)
x: label or position, default None
y: label, position or list of label, positions, default None
Allows plotting of one column versus another
kind: str
‘line’: line plot(default)
''bar": vertical bar plot
“barh”: horizontal bar plot
“hist”: histogram
“pie”: pie plot
“scatter”: scatter plot
文件的讀取與存儲
CSV
讀取 CSV
pd.read_csv(path,usecols,names)
存儲CSV
DataFrame.to_csv()
path_or_buf :string or file handle , default None
sep : character, default ‘,’(分隔符)
columns :sequence,optional 一般填入列表
mode:'w‘:重寫,'a’追加
index:是否寫入 行索引
header:boolean or list of string,default True,是否寫進列索引值
HDF5
hdf5可以存儲三維數據
HDF5文件的讀取和存儲需要指定一個鍵,值為要存儲的DataFrame,也就是說hdf5存儲的是panel這種三維類型,一個key對應一個dataframe
pandas.read_hdf(path_or_buf, key=None, kwargs)
從h5文件當中讀取數據
path_or_buffer: 文件路徑
key: 讀取的鍵
mode: 打開文件的模式
reurn: The Selected object
DataFrame.to_hdf(path_or_buf, key, kwargs)
注:如果一個文件有兩個key,在讀取的時候要指定鍵,否則會報錯
JSON
pandas.read_json(path_or_buf=None,orient=None,typ=“frame”,lines=False)
將JSON格式轉換成默認的Pandas DataFrame格式
- orient: string,Indication of expected JSON string format.
‘split’: dict like {index -> [index], columns -> [columns], data -> [values]}
‘records’: list like [{column -> value}, …, {column -> value}] 一般都用這個
‘index’: dict like {index -> {column -> value}}
‘columns’: dict like {column -> {index -> value}}, 默認該格式
‘values’: just the values array
- lines: boolean, default False 作用:是否按行讀取文件
按照每行讀取json對象
- typ: default ‘frame’,指定轉換成的對象類型series或者dataframe
dataframe.to_json("./test.json",orient=“records”,lines=True)
Pandas高級処理
缺失值處理
如何進行缺失值處理?
- 刪除含有缺失值的樣本
- 替換/插補數據
如何處理NaN?
第一步:判斷數據中是否存在NaN
pd.isnull(df)
pd.notnull(df)
第二步:刪除含有缺失值的樣本
df.dropna(inplace=True/False) 默認按行刪除
替換插補
df.fillna(value,inplace=True/False)
inplace如果想原位置修改的話就是True,如果想返回一個新的df就用False,默認為False
如何處理不是NaN缺失值的?
讀取數據
path = “wisconsin.data”->參數可以直接是一個網址
name = [“Sample code number”, “Normal Nucleoli”,“Mitoses”, “Class”]
data = pd.read_csv(path, names=name)
#這里的非nan標記值缺失值就是利用“?”表示的,因此利用參數to_replace,value=np.nan,將默認標記值替換為nan值,然后再利用前面方法處理nan缺失值
替換
data_new = data.replace(to_replace="?", value=np.nan)
數據離散化
one-hot編碼(啞變量)
分組
自動分組 pd.qcut(data,bins)
自定義分組 pd.cut(data,[])
分好組以后 返回series
轉換為one-hot編碼
pd.get_dunmmies(sr,prefix=)
合并
按方向拼接
pd.concat([data1,data2],axis = )
按索引進行拼接(與數據庫中的內外連接,左連接,右連接一起學習)
pd.merge(left,right,how=“inner”,on=[索引]) how可以選擇left,right,inner,outer
交叉表和透視表
交叉表
data = pd.crosstab(stock[“week”], stock[“pona”])
探索兩個變量之間的關系
透視表
stock.pivot_table([“pona”], index=[“week”])相對于交叉表操作簡單些
分組與聚合
分組與聚合(聚合一般是統計函數)通常是分析數據的一種方式,通常與一些統計函數一起使用,查看數據的分組情況
- dataframe
- series
總結
- 上一篇: 超声波测距仪编程_51单片机控制的超声波
- 下一篇: 通过ua区分QQ内置浏览器与QQ浏览器