0 數據分析之前奏
課程主要內容:常用IDE:
本課程主要使用:Anaconda
Anaconda:一個集合,包括conda、某版本Python、一批第三方庫等
-支持近800個第三方庫
-適合科學計算領域
-包含多個主流工具
-開源免費
-跨平台
本身不是個ide 是將多個工具集成在一起的
conda
-一個工具,用於包管理和環境管理
-包管理與pip類似,管理Python第三方庫
-環境管理能夠允許用戶使用不同版本的Python,並能靈活切換
conda將工具、第三方庫、Python版本、conda都當作包,同等對待
conda有命令行工具
C:\Users\king\Anaconda3\Scripts\conda.exe –version 可以查看conda版本
conda update conda 升級conda
剛開始的是命令行,現在也集成為GUI,anaconda默認生成root的環境空間編程工具:spyder
默認不舒服 改下
交互式編程環境:IPython
-是一個功能強大的交互式shell
-適合進行交互式數據可視化和GUI相關應用
IPython幾個技巧
?:可以在變量或者函數前面加?獲得通用信息
%run :可以執行.py程序 注意:%run在一個空的命名空間執行%
trouble shooting:
在ubuntu18中安裝了anaconda3,啟動spyder報錯Segmentation fault (core dumped)
安裝conda install pyopengl 然后再啟動 卡住半天沒了 出現killed報錯 我日 然后升級了下anaconda3到最新才好了
1. 數據分析之表示
1.1 NumPy庫入門
數據的維度
一維數據 列表、集合
二維數據 表格是經典的二維數據 用列表表示
多維數據 二維數據在更多維度上展開 比如時間維度 用列表表示
高維數據 僅使用最基本的二元關系展示復雜關系 key-value形式組織數據 用字典類型或者其他json、xmal、yaml等
NumPy的數組對象:ndarray
NumPy是一個開源的Python科學計算基礎庫
-一個強大的N維數組對象ndarray
-廣播函數功能
-整合c/c++/fortran代碼的工具
-線性代數、傅里葉變換、隨機數生成等功能
NumPy是SciPy、Pandas等數據處理或科學計算庫的基礎
使用 import numpy as np
ndarray是一個多維數組,由兩部分組成,要求數組元素類型相同,數組下標從0開始
-元數據(數據維度,數據類型等)
-實際數據
np.array() –ndarray別名是array
軸(axis):保存數據的維度
秩(rank):軸的數量例子:
里面的int32不是Python基礎類型,是NumPy定義的類型,更多類型如下:
為啥要這么多數據類型?
-科學計算涉及大量數據,對性能和存儲都有較高要求
-對元素類型精細定義,有助於numpy合理使用存儲空間並優化性能,有助於程序員對程序規模由合理評估
ndarray數組也可以由非同質對象構成
非同質ndarray元素為對象類型
非同質ndarray數組無法發揮numpy優勢,盡量避免使用
ndarray數組的創建和變換
1) 從python列表元組等類型創建數組
x = np.array(list/tuple)
x = np.array(list/tuple,dtype=np.float32) 不指定類型的時候numpy自動關聯一個合適的除了arange函數,其他都是浮點數
ndarray數組的變換:維度變換、元素類型變換
ndarray數組向列表變換
ls = a.tolist()
ndarray數組的操作
索引和切片
ndarray一維數組的索引和列表一樣
ndarray數組的運算
數組與標量的運算等於每個元素都和這個標量算一下
maximum等經過運算存在數據類型隱式轉換
1.2 NumPy數據存取與函數
數據的csv文件存取
csv只能存儲讀取一維和二維數據,這是它的局限
多維數據的存取
對於ndarray數組 有個方法 a.tofile(frame,sep=’’,format=’%s’)
-frame 文件、字符串 sep:數據分隔符,如果是空串,寫入文件為二進制 format:寫入數據的格式
可以保存為二進制,小些,但是無法人類讀懂,如果知道是這樣寫的,可以還原,作為一種保存數據的方法
如何還原呢,np.fromfile(frame,dtype=float,count=-1,sep=’’)
-dtype:讀取的數據類型 count:讀入元素的個數-1表示全部
使用這個方法需要知道存入文件時候的數組維度和元素類型,就是元數據,所以fromfile和tofile需要配合使用,可以將元數據另外存儲解決
NumPy的便捷文件存取
np.save(fname,array)或者np.savez(fname,array)
-fname:文件名以.npy或者.npz
np.load(fname)
NumPy的隨機數函數
NumPy的random子庫 np.random.*NumPy的統計函數
NumPy的梯度函數
1.3 實例1:圖像的手繪效果
圖像的數組表示
RGB色彩表示
PIL庫 處理圖像的第三方庫 pip install pillow from PIL import Image
Image是PIL庫中代表圖像的類(對象)
圖像是一個由像素組成的二維矩陣,每個元素是一個RGB值圖像的變換
圖像的手繪實例
手繪特征:黑白灰色、邊界線條較重、相同或者相近色彩趨於白色、略有光源效果
from PIL import Image import numpy as np a = np.asarray(Image.open('./beijing.jpg').convert('L')).astype('float') depth = 10. # (0-100) grad = np.gradient(a) #取圖像灰度的梯度值 grad_x, grad_y = grad #分別取橫縱圖像梯度值 grad_x = grad_x*depth/100. grad_y = grad_y*depth/100. A = np.sqrt(grad_x**2 + grad_y**2 + 1.) uni_x = grad_x/A uni_y = grad_y/A uni_z = 1./A vec_el = np.pi/2.2 # 光源的俯視角度,弧度值 vec_az = np.pi/4. # 光源的方位角度,弧度值 dx = np.cos(vec_el)*np.cos(vec_az) #光源對x 軸的影響 dy = np.cos(vec_el)*np.sin(vec_az) #光源對y 軸的影響 dz = np.sin(vec_el) #光源對z 軸的影響 b = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源歸一化 b = b.clip(0,255) im = Image.fromarray(b.astype('uint8')) #重構圖像 im.save('./beijingHD.jpg')
2. 數據分析與展示
2.1 Matplotlib庫入門
由各種數據可視化類組成,內部結構復雜,是受matlab啟發
matplotlib.pyplot是繪制各類可視化圖形的命令子庫,相當於快捷方式
import matplotlib.pyplot as plt
plt.savefig(‘test’,dpi=600) #保存為png文件
繪制多個圖形,分區域plt.subplot(3,2,4)
pylot的plot函數
plt.plot(x,y,format_string,**kwargs)
-format_string 表示曲線的格式字符串 **kwargs表示第二組或更多(x,y,format_string) 當繪制多條曲線x不能省略,當繪制一條時候可以省略x用索引值format_string由顏色字符、風格字符、標記字符組成
pyplot的中文顯示
方法1:修改繪制區域的全部字體方法2:
pylot的文本顯示
首先字符串前邊的r代表是原始字符串,也就是里邊的內容不需要轉移,這個一般在正則表達式的時候也這么用,而這里是laText的用法,在python中使用laText,需要在文本的前后加上$符號,也就是你所用的那樣,然后就是laText的文本了,當你輸入了以上內容,matplotlib會自動為你解析的,\pi代表的就是π
pylot子繪圖區域
這種方法每次都要寫(3,3),用另外一種方法GridSpec類
2.2 Matplotlib基礎繪圖函數示例(5個實例)
pylot餅圖繪制
pylot直方圖繪制
pylot極坐標繪制
pyplot散點圖繪制
面向對象的繪制方法是matplotlib庫的推薦方法,pillow庫的函數變為對象的方法
2.3 實例2:引力波的繪制
http://python123.io/dv/grawave.html 引力波數據源
import numpy as np import matplotlib.pyplot as plt from scipy.io import wavfile rate_h, hstrain= wavfile.read(r"H1_Strain.wav","rb") rate_l, lstrain= wavfile.read(r"L1_Strain.wav","rb") #reftime, ref_H1 = np.genfromtxt('GW150914_4_NR_waveform_template.txt').transpose() reftime, ref_H1 = np.genfromtxt('wf_template.txt').transpose() #使用python123.io下載文件 htime_interval = 1/rate_h ltime_interval = 1/rate_l fig = plt.figure(figsize=(12, 6)) # 丟失信號起始點 htime_len = hstrain.shape[0]/rate_h htime = np.arange(-htime_len/2, htime_len/2 , htime_interval) plth = fig.add_subplot(221) plth.plot(htime, hstrain, 'y') plth.set_xlabel('Time (seconds)') plth.set_ylabel('H1 Strain') plth.set_title('H1 Strain') ltime_len = lstrain.shape[0]/rate_l ltime = np.arange(-ltime_len/2, ltime_len/2 , ltime_interval) pltl = fig.add_subplot(222) pltl.plot(ltime, lstrain, 'g') pltl.set_xlabel('Time (seconds)') pltl.set_ylabel('L1 Strain') pltl.set_title('L1 Strain') pltref = fig.add_subplot(212) pltref.plot(reftime, ref_H1) pltref.set_xlabel('Time (seconds)') pltref.set_ylabel('Template Strain') pltref.set_title('Template') fig.tight_layout() plt.savefig("Gravitational_Waves_Original.png") plt.show() plt.close(fig)
結果
3. 數據分析之概要
3.1 Pandas庫入門
Pandas提供高性能易用數據類型和分析工具
import pandas as pdPandas庫的Series類型 –一維
也支持自定義索引
b.index b.values 獲得索引和數據 類似ndarray和字典
兩套索引並存 但是不能混用Series類型也與字典類型類似 可以in, get()
Pandas庫的DataFrame類型 –二維
由共用相同索引的一組列組成,實際上就是一個表格
是一個表格型的數據類型,每列值類型可以不同
既有行索引也有列索引
常用於表達二維數據,單可以表達多維數據
DataFrame基本操作類似Series,根據行列索引
Pandas庫的數據數據類型操作
如何改變結構呢 增加 或重排:重新索引 刪除:drop索引是不可修改類型 索引的操作就是對數據的操作 numpy不存在索引 必須通過維度來操作
Series只有0軸 DataFrame由0軸 1軸,drop默認操作0軸
Pandas庫的數據類型運算
算術類型運算比較運算
數據和索引建立關聯關系 達到操作索引就是操作數據
3.2 Pandas數據特征分析
數據的排序
可以對索引排序
也可以對數據排序基本的統計分析函數
累計統計分析
滾動計算(窗口計算)
數據的相關分析