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 pd
Pandas庫的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數據特征分析
數據的排序
可以對索引排序
也可以對數據排序
基本的統計分析函數

累計統計分析
滾動計算(窗口計算)
數據的相關分析

