1. 程式人生 > >Python高階--資料分析(pandas + matplotlib 繪圖)

Python高階--資料分析(pandas + matplotlib 繪圖)

一、matplotlib 庫

一個用來繪圖的庫
import matplotlib.pyplot as plt

1)plt.imread(“圖片路徑”)

功能: 將圖片載入後返回一個維陣列

>>> jin = plt.imread("./jin.png")
>>> jin
array([[[0.24313726, 0.24313726, 0.24705882],        
        ...,

        [0.7294118 , 0.7294118 , 0.7294118 ]]], dtype=float32)

>>> jin.shpae
(273
, 411, 3) ''' 這是一個三維陣列 第一層代表將圖片分成273行, 第二層代表將圖片的第一層的每一行分為411列, 第三層代表將每一畫素點中的(R,G,B) 注意:有些圖片載入後最內層有4個元素,分別是(R,G,B,A[阿爾法/透明度]) '''

2)plt.imshow(ndarray)顯示圖片

功能: 將多維陣列渲染為一張圖片

>>> plt.imshow(nd)  #將載入後的多維陣列傳入就可以將圖片渲染出來
'''
有的圖片加載出來之後資料範圍在0-255之間的需要將資料/255之後轉化為0-1之間的就可以和0-1的圖片進行合併操作
'''

這裡就可以將圖片進行處理(反轉,拉伸,改色)等操作

這裡寫圖片描述

3)plt.imsave(ndarray)儲存圖片

plt.imsave(ndarray)
預設儲存到當前路徑

plt.imsave('圖片名稱.png',圖片資料,cmap='gray')    #儲存圖片
cmap:將圖片儲存為黑白圖片

二、Pandas繪圖

1.繪製簡單的線型圖

1.1)簡單的Series圖表示例 .plot()

繪製正弦曲線

# 正弦曲線
x = np.linspace(0,2*np.pi,100)      # 從0 到 2π  取100份
y = np.sin(x)                       # y 為sin(x) 的值
s = Series(data=y,index=x) # 構建一個Series物件 s.plot() # 使用Series的plot()方法

這裡寫圖片描述`

1.2) 兩個Series繪製的曲線可以疊加

這裡寫圖片描述

2)簡單的DataFrame圖表示例 .plot()

繪製餘弦曲線

x = np.linspace(0,2*np.pi,100)          # 從0 到 2π  取100份
df = DataFrame(data={'sin':np.sin(x),'cos':np.cos(x)},index=x)   #建立DataFrame物件
df.plot()

這裡寫圖片描述

2.資料驅動的線型圖(分析蘋果股票)

導包

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

1.讀取資料

  • 讀取檔案AAPL.csv
df = pd.read_csv('./data/AAPL.csv')
df.head()

這裡寫圖片描述

2.檢查資料型別

df.dtypes

Date          object       #時間的資料型別為物件,在使用中需要做處理
Open         float64
High         float64
Low          float64
Close        float64
Adj Close    float64
Volume       float64
dtype: object

3.將’Date’這行資料轉換為時間資料型別

pd.to_datetime(Series物件)
功能: 將Series轉換為時間資料型別

df['Date']  # 這一列獲取出來是一個Series
type(df['Date'])
df['Date'] = pd.to_datetime(df['Date'])
df.dtypes

Date         datetime64[ns]  #此時已經是時間型別的資料了
Open                float64
High                float64
Low                 float64
Close               float64
Adj Close           float64
Volume              float64
dtype: object

4.將’Date’設定為行索引

df.set_index('Date',inplace=True)
'''
inplace:改變原來的變數的值
'''

5.繪製圖形,以欄位Adj Close(已調整收盤價格)為資料繪製

df['Adj Close'].plot()

這裡寫圖片描述

3.繪製簡單的柱狀圖

1) Series柱狀圖示例,kind = ‘bar’/’barh’

隨機產生5個數,對其繪製縱向柱狀圖

'''
data:  生成之後為Y軸的資料
index: 生成之後為X軸的索引
'''
s = Series(data=np.random.randint(0,10,size=5),index=list('abcde'))  #隨機產生5個數
s.plot(kind='bar')

這裡寫圖片描述
隨機產生5個數,對其繪製橫向柱狀圖

'''
data:  生成之後為Y軸的資料
index: 生成之後為X軸的索引
'''
s = Series(data=np.random.randint(0,10,size=5),index=list('abcde'))  
s.plot(kind='barh')

這裡寫圖片描述

2) DataFrame柱狀圖示例

隨機產生一個二維陣列,並繪製縱向(kind=’bar’)柱狀圖

'''
index: 生成資料X軸的索引
columns: 特徵的名稱
'''
df = DataFrame(np.random.randint(0,10,size=(8,4)),index=list('abcdefgh'),columns=list('ABCD'))
df.plot(kind='bar')

這裡寫圖片描述

隨機產生一個二維陣列,並繪製橫向(kind=’barh’)柱狀圖
這裡寫圖片描述

4.繪製簡單的直方圖

直方圖
直方圖(Histogram)又稱質量分佈圖。是一種統計報告圖,由一系列高度不等的縱向條紋或線段表示資料分佈的情況。 一般用橫軸表示資料型別,縱軸表示分佈情況。

s = Series(np.random.normal(loc=0,scale=5,size=10000))    # normal 正態分佈
s.hist()
#這裡模擬出一組以0為中心,標準差為5的正態分佈資料, 繪製出的直方圖如下

這裡寫圖片描述

5.繪製簡單的核密度(“ked”)圖

核心密度估計:對分佈的圖進行估計核心
我們繼續使用剛剛直方圖的 Series的正態分佈資料

Series(np.random.normal(loc=0,scale=5,size=10000))    
s.plot(kind='kde')

這裡寫圖片描述

直方圖一般和核密度圖常常被畫在一起,既展示出頻率,又展示出了概率

有兩組陣列,我們將這兩組資料連線成為一個。
分析這組新資料

ndarr1 = np.random.normal(loc=-10,scale=5,size=5000)  #第一組資料
ndarr2 = np.random.normal(loc=15,scale=2,size=5000)  第二組資料
ndarr = np.concatenate([ndarr1,ndarr2])   #將兩組資料合為一組
s = Series(ndarr)    #生成Series物件
s.plot(kind='kde')  # 核心 密度 估計 用來展示某個位置出現內容的概率的估計值
s.hist(density=True)  # density表示直方圖也以 密度概率的值來展示  hist用來展示某個位置出現內容的實際頻率
#展示效果如下
'''
s.plot(kind='kde')  展示某個位置的估計值
s.hist(density=True)  表示某個位置出現內容的實際頻率
'''

這裡寫圖片描述

6.繪製簡單的散點圖

散佈圖是觀察兩個一維資料數列之間的關係的有效方法

示例資料

df = DataFrame(np.random.randint(0,150,size=(20,3)),columns=['python','math','eng'])
df   #模擬一個DataFrame資料,列名為'python','math','eng'

    python  math    eng
0   141     41      55
1   37      76      96
2   61      28      135
。。。
17  124     103     83
18  86      47      44
19  35      85      85

將這組資料生成散點圖

df.plot(kind='scatter',x='python',y='eng')
# kind = 'scatter'  , 給明標籤columns

這裡寫圖片描述

這樣其實是沒有什麼實際的意義的
現在我們再加一列和“python”相關的資料

np.random.randint(-10,10,1)[0]   # 0-10之間 隨機取一個數
df['php'] = df['python'].map(lambda x: x*0.9+np.random.randint(-10,10,1)[0])
df

    python  math    eng php
0   121     67      15  113.9
1   148     33      149 123.2
。。。
18  79      77      108 74.1
19  105     107     53  102.5

我們從資料是很難看出來python和php有什麼關係
這時我們就可以用散點圖來繪製出觀察

這裡寫圖片描述

可以看出有python的值增大,php的值也會增大。