數據分析

數據分析

1. 什麼是數據分析 :

數據分析:是把隱藏在一些看似雜亂無章的數據背後的信息提煉出來,總結出所研究對象的內在規律python

數據分析三劍客:

Numpy,Pandas,Matplotlib算法

2. Numpy

NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。數組

2.1 建立ndarray

使用np.array()建立數據結構

import numpy as np
# 一維
arr = np.array([1,2,3,4,5])
print(arr,type(arr))  # [1 2 3 4 5] <class 'numpy.ndarray'>  ---來自pycharm
# 二維 --來自jupyter notebook
arr = np.array([[1,2,3],[4,5,6]])
arr
# array([[1, 2, 3],
#       [4, 5, 6]])

注意 :app

arr = np.array([1,'two',3])
arr
# array(['1', 'two', '3'], dtype='<U11')
arr = np.array([['1','two','3'],[1,2,3]])
arr
# array([['1', 'two', '3'],
#      ['1', '2', '3']], dtype='<U3')
numpy默認ndarray的全部元素的類型是統一的
若傳進來的列表包含不一樣的類型的元素,則會贊成爲一個類型,優先級 : str > float > int

2.2 使用matplotlib.pyplot獲取一個numpy數組,數據來源於一張圖片

利用matplotlib讀取圖片數據到數組中 :dom

import matplotlib.pyplot as plt
img_arr = plt.imread('./落日.jpg')  # 讀取圖片,返回的是numpy數組
img_arr
# 
array([[[224,  88,  14],  # 三維數組
        [224,  88,  14],
        [224,  88,  14],
    ... ... ... ...
        [  6,   2,   3]]], dtype=uint8)

plt.imshow(img_arr) # 將讀取的三維數組的數據以圖片的形式展現出來
plt.imshow(img_arr-100) # 圖片變了

2.3 ndarray的屬性

  • dtype:數組元素的數據類型
  • size:數組元素的個數
  • ndim:數組的維數
  • shape:數組的維度大小(以元組形式)
import matplotlib.pyplot as plt
img_arr = plt.imread('./落日.jpg')
img_arr.ndim # 3 獲取數組的維度
img_arr.shape # (332, 500, 3) 獲取數組的外形
img_arr.size # 498000 獲取數組的大小
img_arr.dtype # dtype('uint8') 獲取數組的數據類型

2.4 np的routines函數建立

1. np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 等差數列數組svg

np.linspace(1,100,num=20)  # 產生1-100之間數量20個的等差數組
# 結果:
array([  0.        ,   5.26315789,  10.52631579,  15.78947368,
        21.05263158,  26.31578947,  31.57894737,  36.84210526,
        42.10526316,  47.36842105,  52.63157895,  57.89473684,
        63.15789474,  68.42105263,  73.68421053,  78.94736842,
        84.21052632,  89.47368421,  94.73684211, 100.        ])

2. np.arange([start, ]stop, [step, ]dtype=None) 等差步長數組函數

np.arange(0,100,step=2)  # 產生0-100,步長爲2的等差數組

3. random.randint(low,high=None,size=None,dtype="1")工具

np.random.randint(0,100) # 生成0-100 之間的一個隨機數
np.random.randint(0,100,size=(4,5)) # 生成 0-100 之間的隨機數組,size爲數組大小

4. 時間種子/隨機因子測試

時間種子(隨機因子):無時無刻都在變化的值(系統時間)

固定隨機因子就能夠固定隨機函數的隨機性

np.random.seed(90)  # 時間因子90是任意數值
np.random.randint(0,100,size=(3,5))

5. np.random.random(size=None)

np.random.seed(3) # 生成0到1的隨機數,左閉右開

2.5 ndarray的基本操做

  1. 索引

    arr = np.random.randint(0,100,size=(5,6))
    arr
    
    array([[28, 74, 88,  9, 15, 18],
           [80, 71, 88, 11, 17, 46],
           [ 7, 75, 28, 33, 84, 96],
           [88, 44,  5,  4, 71, 88],
           [88, 50, 54, 34, 15, 77]])
    
    arr[0]  # array([28, 74, 88,  9, 15, 18]) 第一行
    arr[0,0] # 28 第一行的第一列
    arr[0,1] # 74 第一行的第二列
    arr[0,[2,3]] # array([88,  9]) 第一行的第三四列
    1. 切片

      • 切取前兩行
      arr[0:2]  # 切取前兩行
      # 結果
      array([[28, 74, 88,  9, 15, 18],
             [80, 71, 88, 11, 17, 46]])
      • 切取前兩列
      arr[:,0:2] # 切取前兩列
      # 結果
      array([[28, 74],
             [80, 71],
             [ 7, 75],
             [88, 44],
             [88, 50]])
      • 切取前兩行的前兩列
      arr[0:2:,0:2] # 切取前兩行的前兩列
      # 結果
      array([[28, 74],
             [80, 71]])
      • 行倒序/列倒序

        arr[::-1] # 行倒序
        arr[:,::-1] # 列倒序
      • 所有倒序

        arr[::-1,::-1] # 所有倒序

2.6 圖片翻轉

讓圖片數組 列 倒序 - 圖片水平翻轉180°

import matplotlib.pyplot as plt
img_arr = plt.imread('./落日.jpg')
plt.imshow(img_arr[:,::-1])

讓圖片數組 行 倒序 - 圖片垂直翻轉180°

import matplotlib.pyplot as plt
img_arr = plt.imread('./落日.jpg')
plt.imshow(img_arr[::-1])

圖片顏色變化

import matplotlib.pyplot as plt
img_arr = plt.imread('./落日.jpg')
plt.imshow(img_arr[::-1,::-1])

2.7 圖片裁剪

import matplotlib.pyplot as plt
img_arr = plt.imread('./落日.jpg')
plt.imshow(img_arr[120:210,200:300]) # 根據jupyter的標尺進行切割

2.8 變形

arr
array([[28, 74, 88,  9, 15, 18],
       [80, 71, 88, 11, 17, 46],
       [ 7, 75, 28, 33, 84, 96],
       [88, 44,  5,  4, 71, 88],
       [88, 50, 54, 34, 15, 77]])

將多維數組變造成一維數組 - 須要根據原數組的元素個數進行合成

arr.reshape(30)

將多維數組變造成二維數組 - 須要根據原數組的元素個數進行合成

arr.reshape((10,3)
arr.reshape((10,-1) # 自動計算

2.9 級聯

  1. 一維,二維,多維數組的級聯,實際操做中級聯多爲二維數組
import numpy as np
np.concatenate((arr,arr),axis=1)  # axis軸 0表示豎軸拼合,1表示橫軸拼合  arr爲;兩個數組
  1. 合併兩張圖片

    import numpy as np
    arr_3 = np.concatenate((img_arr,img_arr,img_arr),axis=1)
    plt.imshow(arr_3) # 三聯圖
    
    arr_9 = np.concatenate((arr_3,arr_3,arr_3),axis=0)
    plt.imshow(arr_9)  # 九宮格圖
  2. 級聯須要注意的點:

    1. 級聯的參數是列表:必定要加中括號或小括號
    2. 維度必須相同
    3. 形狀相符:在維度保持一致的前提下,若是進行橫向(axis=1)級聯,必須保證進行級聯的數組行數保持一致。若是進行縱向(axis=0)級聯,必須保證進行級聯的數組列數保持一致。
    4. 可經過axis參數改變級聯的方向

2.10 ndarray的聚合操做

1. 求和 - np.sum

arr :
array([[28, 74, 88,  9, 15, 18],
       [80, 71, 88, 11, 17, 46],
       [ 7, 75, 28, 33, 84, 96],
       [88, 44,  5,  4, 71, 88],
       [88, 50, 54, 34, 15, 77]])
arr.sum(axis=0) # 縱軸的求總和
# array([291, 314, 263,  91, 202, 325])

arr.sum(axis=1) # 橫軸的求總和
# array([232, 313, 323, 300, 318])

2. 最大最小值:np.max()/ np.min()

3. 平均值:np.mean()

4. 其餘聚合

Function Name    NaN-safe Version    Description
np.sum    np.nansum    Compute sum of elements
np.prod    np.nanprod    Compute product of elements
np.mean    np.nanmean    Compute mean of elements
np.std    np.nanstd    Compute standard deviation
np.var    np.nanvar    Compute variance
np.min    np.nanmin    Find minimum value
np.max    np.nanmax    Find maximum value
np.argmin    np.nanargmin    Find index of minimum value
np.argmax    np.nanargmax    Find index of maximum value
np.median    np.nanmedian    Compute median of elements
np.percentile    np.nanpercentile    Compute rank-based statistics of elements
np.any    N/A    Evaluate whether any elements are true
np.all    N/A    Evaluate whether all elements are true
np.power 冪運算

5. ndarray的排序

np.sort()與ndarray.sort()均可以,但有區別:

  • np.sort() 返回一個新的排序好的對象,arr並無改變
  • arr.sort(axis=0) arr直接被改變了
np.sort(arr,axis=0) # 對每一列排序
np.sort(arr,axis=1) # 對每一行排序
arr.sort(axis=0) # 對每一列排序,改變原有arr數據

3. Pandas的數據結構

1. Series - 一維

Series是一種相似與一維數組的對象,由下面兩個部分組成:
- values:一組數據(ndarray類型)
- index:相關的數據索引標籤

使用列表建立Series :

import pandas as pd
from pandas import Series,DataFrame
s = Series(data=[3,,4])

# 
0    3
1    4
dtype: int64  # 0,1 表示的是隱式索引(默認索引)
s = Series(data=[5,6],index=['a','b'])  # a,b表示的是顯式索引
#
a    5
b    6
dtype: int64
s['a'] # 5
s[0] # 5
s.a # 5 但不能s.1

2. Series的索引和切片

可使用中括號取單個索引(此時返回的是元素類型),或者中括號裏一個列表取多個索引(此時返回的是一個Series類型)。

(1) 顯式索引:

    - 使用index中的元素做爲索引值
    - 使用s.loc[](推薦):注意,loc中括號中放置的必定是顯示索引
    注意,此時是閉區間
(2)在運算中自動對齊不一樣索引的數據 若是索引不對應,則補NaN
s['a'] # 5
s[0] # 5
s.a # 5 但不能s.1
s[0:2] # 切片
# 切片結果
a    5
b    6
dtype: int64

可使用s.head(),tail()分別查看前n個和後n個值

s = Series(data=[1,2,3,4,5,6,9,9,9,])   
s.head(2) # 只顯示前兩行數據

對Series元素進行去重

s = Series(data=[1,2,3,4,5,6,9,9,9,])
s.unique() # 去重

Series相加

s1 = Series([1,2,3],index=['a','b','c'])
s2 = Series([1,2,3],index=['a','d','c'])
s = s1 + s2
s
# 結果
a    2.0
b    NaN
c    6.0
d    NaN
dtype: float64

# 說明  Series只能夠對索引相同的進行算法運算,不然爲空(NaN)

可使用pd.isnull(),pd.notnull(),或s.isnull(),notnull()函數檢測缺失數據

s[[True,False,True,False]]
# 結果
a    2.0
c    6.0
dtype: float64
# 將布爾值做爲Series的索引,那麼索引爲False對應的值就不會顯示
s.isnull()  # 若是是空值返回爲True
# 結果
a    False
b     True
c    False
d     True
dtype: bool
s.notnull()  # 若是不是空返回True
# 結果 
a     True
b    False
c     True
d    False
dtype: bool

對Series去空 - 將Series中的空值直接進行了清洗

s[s.notnull()]
a    2.0
c    6.0
dtype: float64
# 利用 - 將布爾值做爲Series的索引,那麼索引爲False對應的值就不會顯示

3. DataFrame

DataFrame是一個【表格型】的數據結構。DataFrame由按必定順序排列的多列數據組成。設計初衷是將Series的使用場景從一維拓展到多維。DataFrame既有行索引,也有列索引。

  • 行索引:index
  • 列索引:columns
  • 值:values

3.1 DataFrame的建立

最經常使用的方法是傳遞一個字典來建立。DataFrame以字典的鍵做爲每一【列】的名稱,以字典的值(一個數組)做爲每一列。
此外,DataFrame會自動加上每一行的索引。
使用字典建立的DataFrame後,則columns參數將不可被使用。
同Series同樣,若傳入的列與字典的鍵不匹配,則相應的值爲NaN。
from pandas import Series,DataFrame
import numpy as np

DataFrame(data=np.random.randint(0,100,size=(2,3)))
# 結果

    0   1   2
0   88  15  6
1   85  22  11
from pandas import Series,DataFrame
import numpy as np

df = DataFrame(data=np.random.randint(0,100,size=(2,3)),index=['a','b'],columns=['A','B','C'])
# 結果

    A   B   C
a   12  92  96
b   62  57  79

3.2 DataFrame的基本屬性

# values 返回全部元素
df.values  # 返回的是一個數組
array([[42, 57, 97],
       [50, 45, 40]])
# index 返回全部的列索引
df.index # Index(['a', 'b'], dtype='object')
# columns 返回全部的行索引
df.columns
# Index(['A', 'B', 'C'], dtype='object')
# shape 返回形狀
df.shape
# (2, 3)

利用字典做爲數據建立DataFrame

dic = {
    'zhangsan':[99,99,99,99],
    'lisi':[0,0,0,0]
}
df = DataFrame(data=dic,index=['語文','數學','英語','理綜'])
# 結果
    lisi zhangsan
語文  0   99
數學  0   99
英語  0   99
理綜  0   99

3.3 DataFrame的索引

(1) 對列進行索引

- 經過相似字典的方式  df['q']
- 經過屬性的方式     df.q
能夠將DataFrame的列獲取爲一個Series。返回的Series擁有原DataFrame相同的索引,且name屬性也已經設置好了,就是相應的列名。

取列索引

df['lisi']  #列索引
df[['zhangsan','lisi']]

語文    0
數學    0
英語    0
理綜    0

zhangsan    lisi
語文  99  0
數學  99  0
英語  99  0
理綜  99  0

取行索引

- 使用.loc[]加顯式索引取相應行
- 使用.iloc[]加整數來取相應行
df.loc['語文']  或 df.iloc[0] # 隱式索引 取第一行
lisi         0
zhangsan    99

df.loc[['語文','數學']] 或 df.iloc[[0,1]] # 取前兩行
lisi    zhangsan
語文  0   99
數學  0   99

取單個某些數據

df.iloc[2,1] #取第三行的第二個值
df.loc['英語','zhangsan']
df.iloc[[1,2],1] # 取第二三行的第二個值

3.4 DataFrame的切片

切行

df[0:2]  #行切片
lisi    zhangsan
語文  0   99
數學  0   99

切列/行

df.iloc[:,0:1] # 只切列
df.iloc[:2,0:1] # 切前三行和兩列

總結:

  • 索引
    • df['col']:列索引,取出指定的列
    • df[[col1,col2]]:取出多列
    • df.iloc[1]:取指定的1行
    • df.loc['語文']:取指定的行
    • df.iloc[hang,lie]:取元素
  • 切片:
    • df[行切片]:切行
    • df.iloc[hang,lie]:切列

3.5 DataFrame的運算

同Series同樣:
    1. 在運算中自動對齊不一樣索引的數據
    2. 若是索引不對應,則補NaN
能夠對DataFrame的每一行每一列直接進行運算

4. 股票分析- 基於tushare模塊

Tushare是一個免費、開源的python財經數據接口包。主要實現對股票等金融數據從數據採集、清洗加工 到 數據存儲的過程,可以爲金融分析人員提供快速、整潔、和多樣的便於分析的數據

安裝tushare包
pip install tushare
import tushare as ts
import pandas as pd
# 請求茅臺股票的數據,600519爲茅臺股票的代碼
maotai = ts.get_k_data(code='600519',start='1900-01-01')

    date    open    close   high    low volume  code
0   1991-01-02  0.185   0.188   0.188   0.185   759.00  000001
1   1991-01-03  0.429   0.429   0.429   0.429   212.40  000001
... ...
# 以maotai.csv爲名存儲到本地
maotai.to_csv('./maotai.csv')
#讀取部分數據(前五行)
maotai.head()
df.index    # 顯示全部的行索引
df.index[0] # 第一個行索引
df.columns  # 顯示全部的列索引
df.columns[0] # 第一個列索引
#從本地讀取數據 - 用pandas讀取數據
df = pd.read_csv('./maotai.csv')
# 刪除labels='Unnamed: 0'(字段) axis=1 表示刪除列,0表示刪除行,
#inplace=True表示操做做用到源數據中
df.drop(labels='Unnamed: 0',axis=1,inplace=True)
#index_col將哪一列做爲原數據的行索引 ,parse_dates=['date']:將date的類型轉成時間類型
df = pd.read_csv('./maotai.csv',index_col='date',parse_dates=['date'])

要求 :

  • 輸出該股票全部收盤比開盤上漲3%以上的日期。
# 輸出該股票全部收盤比開盤上漲3%以上的日期。
#(收盤-開盤)/開盤 > 0.03  返回的是邏輯表達式,Ture和False
(df['close'] - df['open']) / df['open'] > 0.03
#將True對應的行數據取出
df.loc[(df['close'] - df['open']) / df['open'] > 0.03]
#取行索引
df.loc[(df['close'] - df['open']) / df['open'] > 0.03].index
  • 輸出該股票全部開盤比前日收盤跌幅超過2%的日期。
#輸出該股票全部開盤比前日收盤跌幅超過2%的日期。
#(開盤-前日收盤)/前日收盤  < -0.02
# shift(1)表示下移 ,-1表示上移
(df['open'] - df['close'].shift(1)) / df['close'].shift(1) < -0.02

df.loc[(df['open'] - df['close'].shift(1)) / df['close'].shift(1) < -0.02]

df.loc[(df['open'] - df['close'].shift(1)) / df['close'].shift(1) < -0.02].index
  • 假如我從2010年1月1日開始,每個月第一個交易日買入1手股票,每一年最後一個交易日賣出全部股票,到今天爲止,個人收益如何?
    df_2010 = df['2010':'2019']

分析 :

  • 基於開盤價進行股票的買賣
  • 買股票的時機:
    • 每個月的第一個交易日買入一手(100股)股票
    • 一個完整的年會買入12次股票供給1200股
  • 賣股票的時機:
    • 每一年的最後一個交易日賣出全部(1200股)的股票
    • 一共能夠賣9次股票
  • 注意:19年只能夠買入不能夠賣出,最後剩餘的不能賣出的1000股股票是須要計算到總收益中

數據的從新取樣resample()

df_2010 = df['2010':'2019']
#買入股票花費的錢數  A年 M天 D天
# m取到每月對應的第一行數據
df_monthly = df_2010.resample('M').first()
# 買股票花的錢  一手100股
cost_money = df_monthly['open'].sum()*100

#賣出股票收到多少錢,刨除今年
df_yearly = df_2010.resample('A').last()[:-1]

last_price = df_2010['close'][-1]  #昨天的收盤價

# 結果:
recv_monry = df_yearly['open'].sum()*1200 + last_price*1000
recv_monry - cost_money

5. 數據清洗 - DataFrame

  • 有兩種丟失數據:

    • import numpy as np
      import pandas
      from pandas import DataFrame
    • None

      None是Python自帶的,其類型爲python object。所以,None不能參與到任何計算中。
      #查看None的數據類型
      type(None) # NoneType
    • np.nan(NaN)

      np.nan是浮點類型,能參與到計算中。但計算的結果老是NaN。
      #查看np.nan的數據類型
      type(np.nan)  # float

1. pandas中的None與NaN

建立DataFrame :

df = DataFrame(data=np.random.randint(0,100,size=(10,8)))
df

0   1   2   3
0   62  13  85  96
1   91  66  93  61
2   65  60  40  81
#將某些數組元素賦值爲nan / None
df.iloc[1,2] = None
df.iloc[2,1] = np.nan
df

    0   1       2       3
0   30  95.0    21.0    88
1   10  54.0    NaN 71
2   17  NaN     30.0    27

判斷函數 df.isnull() / df.notnull()

df.isnull() 

    0       1       2       3
0   False   False   False   False
1   False   False   True    False
2   False   True    False   False

all() / any()

df.isnull().all(axis=0) # 鑑定每一列的總狀態 all : 有一個False就是False,全True才True
0    False
1    False
2    False
3    False

df.isnull().all(axis=1) # 鑑定每一行的總狀態
0    False
1    False
2    False

df.isnull().any(axis=1) # 鑑定每一行的總狀態 all : 有一個True就是True
0    False
1     True
2     True
df.loc[~df.isnull().any(axis=1)] # ~ 爲取反
df.loc[df.notnull().all(axis=1)] # 兩個結果相同
    0   1       2       3
0   30  95.0    21.0    88
固定搭配 :
    isnull() → any()
    notnull() → all()
df.dropna() 能夠選擇過濾的是行仍是列(默認爲行):axis中0表示行,1表示的列
df.dropna(axis=0)

    0   1       2   3
0   30  95.0    21.0    88

覆蓋

df.fillna(value=66666) # 將全部的空值賦值66666

使用周圍近鄰值覆蓋

df.fillna(method='ffill',axis=1) # 豎軸前面一數據  做爲填充數據源進行覆蓋 bfill爲向後

    0       1       2       3
0   30.0    95.0    21.0    88.0
1   10.0    54.0    54.0    71.0
2   17.0    17.0    30.0    27.0
#測試df_test中的哪些列中還有空值
df_test.isnull().any(axis=0)

6. pandas的拼接操做

pandas的拼接分爲兩種:

  • 級聯:pd.concat, pd.append

  • 合併:pd.merge, pd.join

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

1. 使用pd.concat()級聯

pandas使用pd.concat函數的級聯,與np.concatenate函數相似,只是多了一些參數:

objs
axis=0
keys
join='outer' / 'inner':表示的是級聯的方式,outer會將全部的項進行級聯(忽略匹配和不匹配,默認參數),而inner只會將匹配的項級聯到一塊兒,不匹配的不級聯
ignore_index=False
  • 匹配級聯

    df1 = DataFrame(data=np.random.randint(0,100,size=(3,4)))
    df2 = DataFrame(data=np.random.randint(0,100,size=(3,4)))
    pd.concat((df1,df2),axis=0)
  • 不匹配級聯

    不匹配指的是級聯的維度的索引不一致。例如縱向級聯時列索引不一致,橫向級聯時行索引不一致
    • pd.concat((df1,df2),axis=0,join='inner')
    • 有2種鏈接方式:

      • 外鏈接:補NaN(默認模式)- outer
      • 內鏈接:只鏈接匹配的項 - inner

2. 使用pd.merge()合併

merge與concat的區別在於,merge須要依據某一共同的列來進行合併
使用pd.merge()合併時,會自動根據二者相同column名稱的那一列,做爲key來進行合併。
注意每一列元素的順序不要求一致
參數:
- how:out取並集    inner取交集 - 默認
- on:當有多列相同的時候,可使用on來指定使用那一列進行合併,on的值爲一個列表
    若是不寫on,默認將相同的一列做爲合併條件

1. 一對一合併

數據

df1 = DataFrame({'employee':['Bob','Jake','Lisa'],
                'group':['Accounting','Engineering','Engineering'],
                })
df1

df2 = DataFrame({'employee':['Lisa','Bob','Jake'],
                'hire_date':[2004,2008,2012],
                })
df2
pd.merge(df1,df2)

2. 多對一合併

df3 = DataFrame({
    'employee':['Lisa','Jake'],
    'group':['Accounting','Engineering'],
    'hire_date':[2004,2016]})
df3

df4 = DataFrame({'group':['Accounting','Engineering','Engineering'],
                       'supervisor':['Carly','Guido','Steve']
                })
df4
pd.merge(df3,df4)

3. 多對多合併

df1 = DataFrame({'employee':['Bob','Jake','Lisa'],
                 'group':['Accounting','Engineering','Engineering']})
df1
df5 = DataFrame({'group':['Engineering','Engineering','HR'],
                'supervisor':['Carly','Guido','Steve']
                })
df5
pd.merge(df1,df5,how='right')  # right保留右表數據

4. key的規範化

  • 當列衝突時,即有多個列名稱相同時,須要使用on=來指定哪個列做爲key,配合suffixes指定衝突列名
df1 = DataFrame({'employee':['Jack',"Summer","Steve"],
                 'group':['Accounting','Finance','Marketing']})
df2 = DataFrame({'employee':['Jack','Bob',"Jake"],
                 'hire_date':[2003,2009,2012],
                'group':['Accounting','sell','ceo']})
pd.merge(df1,df2,on='employee')
  • 當兩張表沒有可進行鏈接的列時,可以使用left_on和right_on手動指定merge中左右兩邊的哪一列列做爲鏈接的列

    df1 = DataFrame({'employee':['Bobs','Linda','Bill'],
                    'group':['Accounting','Product','Marketing'],
                   'hire_date':[1998,2017,2018]})
    df1
    df5 = DataFrame({'name':['Lisa','Bobs','Bill'],
                    'hire_dates':[1998,2016,2007]})
    df5
    pd.merge(df1,df5,left_on='employee',right_on='name',how='outer')

5. 內合併與外合併:out取並集 inner取交集

  • 內合併:只保留二者都有的key(默認模式)

    df6 = DataFrame({'name':['Peter','Paul','Mary'],
                   'food':['fish','beans','bread']}
                   )
    df7 = DataFrame({'name':['Mary','Joseph'],
                    'drink':['wine','beer']})
  • 外合併 how='outer':補NaN

    df6 = DataFrame({'name':['Peter','Paul','Mary'],
                   'food':['fish','beans','bread']}
                   )
    df7 = DataFrame({'name':['Mary','Joseph'],
                    'drink':['wine','beer']})

3. 案例分析:美國各州人口數據分析

  • 需求:
    • 導入文件,查看原始數據
    • 將人口數據和各州簡稱數據進行合併
    • 將合併的數據中重複的abbreviation列進行刪除
    • 查看存在缺失數據的列
    • 找到有哪些state/region使得state的值爲NaN,進行去重操做
    • 爲找到的這些state/region的state項補上正確的值,從而去除掉state這一列的全部NaN
    • 合併各州面積數據areas
    • 咱們會發現area(sq.mi)這一列有缺失數據,找出是哪些行
    • 去除含有缺失數據的行
    • 找出2010年的全民人口數據
    • 計算各州的人口密度
    • 排序,並找出人口密度最高的五個州 df.sort_values()
import numpy as np
from pandas import DataFrame,Series
import pandas as pd
  1. 導入文件,查看原始數據

    abb = pd.read_csv('./data/state-abbrevs.csv')
    abb.head(2)
    pop = pd.read_csv('./data/state-population.csv')
    pop.head(2)
    area = pd.read_csv('./data/state-areas.csv')
    area.head(2)
  2. 將人口數據和各州簡稱數據進行合併

    abb_pop = pd.merge(abb,pop,left_on='abbreviation',right_on='state/region',how='outer')
    abb_pop.head(2)
  3. 將合併的數據中重複的abbreviation列進行刪除

    abb_pop.drop(labels='abbreviation',axis=1,inplace=True)  
    # inplace將操做做用到原表
    abb_pop.head(2)
  4. 查看存在缺失數據的列

    abb_pop.isnull().any(axis=0)
  5. 找到有哪些state/region使得state的值爲NaN,進行去重操做

    理解 : 找到state的空對應的state/region空值有幾種,而後去重

    #1.state列中哪些值爲空
    abb_pop['state'].isnull()
    #2.能夠將step1中空對應的行數據取出(state中的空值對應的行數據)
    abb_pop.loc[abb_pop['state'].isnull()]
    #3.將對應的行數據中指定的簡稱列取出
    abb_pop.loc[abb_pop['state'].isnull()]['state/region'].unique()
  6. 爲找到的這些state/region的state項補上正確的值,從而去除掉state這一列的全部NaN

    #1.先將USA對應的state列中的空值定位到(找到全部的USA所對應的行)
    abb_pop['state/region'] == 'USA'  # 邏輯表達式,範湖的是True/False
    #2,將布爾值做爲原數據的行索引,取出USA簡稱對應的行數據
    abb_pop.loc[abb_pop['state/region'] == 'USA']
    #3.獲取符合要求行數據的行索引
    indexs = abb_pop.loc[abb_pop['state/region'] == 'USA'].index
    #4.將indexs這些行中的state列的值批量賦值成united states
    abb_pop.loc[indexs,'state'] = 'United Status'
    #5.將PR對應的state列中的空批量賦值成 PUERTO RICO
    abb_pop['state/region'] == 'PR'
    abb_pop.loc[abb_pop['state/region'] == 'PR']
    indexs = abb_pop.loc[abb_pop['state/region'] == 'PR'].index
    abb_pop.loc[indexs,'state'] = 'PUERTO RICO'
  7. 合併各州面積數據areas

    abb_pop_area = pd.merge(abb_pop,area,how='outer')
    abb_pop_area.head(3)
  8. 咱們會發現area(sq.mi)這一列有缺失數據,找出是哪些行

    abb_pop_area['area (sq. mi)'].isnull()
    #將空值對應的行數據取出
    indexs = abb_pop_area.loc[abb_pop_area['area (sq. mi)'].isnull()].index
    indexs
  9. 去除含有缺失數據的行

    abb_pop_area.drop(labels=indexs,axis=0,inplace=True)
  10. 找出2010年的全民人口數據

    abb_pop_area.query('year == 2010 & ages == "total"')
  11. 計算各州的人口密度

    abb_pop_area['midu'] = abb_pop_area['population'] / abb_pop_area['area (sq. mi)']
    abb_pop_area.head(2)
  12. 排序,並找出人口密度最高的五個州 df.sort_values()

abb_pop_area.sort_values(by='midu',axis=0,ascending=False).head(5) 
# ascending=False升序

7. pandas數據處理

  • 使用duplicated()函數檢測重複的行,返回元素爲布爾類型的Series對象,每一個元素對應一行,若是該行不是第一次出現,則元素爲True
  • keep參數:指定保留哪一重複的行數據
import numpy as np
import pandas as pd
from pandas import DataFrame

建立具備重複元素行的DataFrame

#建立一個df
df = DataFrame(data=np.random.randint(0,100,size=(12,7)))
df
#手動將df的某幾行設置成相同的內容
df.iloc[1] = [6,6,6,6,6,6,6]
df.iloc[8] = [6,6,6,6,6,6,6]
df.iloc[5] = [6,6,6,6,6,6,6]
df

1. 刪除重複數據(行級別)

  • 使用drop_duplicates()函數刪除重複的行

    • drop_duplicates(keep='first/last'/False)
    • first刪除第一行的重複數據
    • last刪除最後一行的重複數據
    • False刪除全部行的重複數據
    df.drop_duplicates(keep='last')

2. 映射

DataFrame替換操做 :
- 單值替換
    - 普通替換:  替換全部符合要求的元素:to_replace=15,value='e'
    - 按列指定單值替換: to_replace={列標籤:替換值} value='value'
    
- 多值替換
    - 列表替換: to_replace=[]  value=[]
    - 字典替換(推薦)  to_replace={to_replace:value,to_replace:value}
- 注意:DataFrame中,沒法使用method和limit參數

替換 :

#建立一個df
df = DataFrame(data=np.random.randint(0,100,size=(12,7)))
df

將源數據中全部的6都替換成six

df.replace(to_replace=6,value='six') # 加入inplace=True就會改寫源數據
df.replace(to_replace={6:'six'})

將第五列中的6替換成six

df.replace(to_replace={5:6},value='six')  # to_replace={5:6} 第五列中的6

映射 :

  • map()函數:新建一列 , map函數並非df的方法,而是series的方法

  • map()能夠映射新一列數據

  • map()中可使用lambd表達式

  • map()中可使用方法,能夠是自定義的方法

    eg:map({to_replace:value})

  • 注意 map()中不能使用sum之類的函數,for循環

新增一列:給df中,添加一列,該列的值爲中文名對應的英文名

dic = {
    'name':['張三','周杰倫','張三'],
    'salary':[20000,10000,20000]
}
df = DataFrame(data=dic)
df
#映射關係表
dic = {
    '張三':'tom',
    '周杰倫':'jay'
}
df['e_name'] = df['name'].map(dic)
df
  • map當作一種運算工具,至於執行何種運算,是由map函數的參數決定的(參數:lambda,函數)

使用自定義函數 :

# 自定義的函數
def after_sal(s):
    return s - (s-3000)*0.5

#超過3000部分的錢繳納50%的稅
df['after_sal'] = df['salary'].map(after_sal)
df

df['after_sal'] = df['salary'].apply(after_sal)  #apply效率高於map
df

注意:並非任何形式的函數均可以做爲map的參數。只有當一個函數具備一個參數且有返回值,那麼該函數才能夠做爲map的參數

8. 使用聚合操做對數據異常值檢測和過濾

  • 使用df.std()函數能夠求得DataFrame對象每一列的標準差

建立一個1000行3列的df 範圍(0-1),求其每一列的標準差

df = DataFrame(data=np.random.random(size=(1000,3)),columns=['A','B','C'])
df

對df應用篩選條件,去除標準差太大的數據:假設過濾條件爲 C列數據大於兩倍的C列標準差

twice_std = df['C'].std() * 2
twice_std
~(df['C'] > twice_std)
df.loc[~(df['C'] > twice_std)]
- 檢測過濾缺失值
    - dropna
    - fillna
- 檢測過濾重複值
    - drop_duplicated(keep)
- 檢測過濾異常值
    - 獲得鑑定異常值的條件
    - 將異常值對應的行刪除

9. 排序

使用.take()函數排序

    - take()函數接受一個索引列表,用數字表示,使得df根據列表中索引的順序進行排序
    - eg:df.take([1,3,4,2,5])

能夠藉助np.random.permutation()函數隨機排序
np.random.permutation(x)能夠生成x個從0-(x-1)的隨機數列
np.random.permutation(1000)
df.take(indices=np.random.permutation(1000),axis=0).take(indices=np.random.permutation(3),axis=1)
# 切五行
df.take(indices=np.random.permutation(1000),axis=0).take(indices=np.random.permutation(3),axis=1)[0:5]
  • 隨機抽樣
    • 當DataFrame規模足夠大時,直接使用np.random.permutation(x)函數,就配合take()函數實現隨機抽樣

10. 數據分類處理【重點】

數據聚合是數據處理的最後一步,一般是要使每個數組生成一個單一的數值。

數據分類處理:

 - 分組:先把數據分爲幾組
 - 用函數處理:爲不一樣組的數據應用不一樣的函數以轉換數據
 - 合併:把不一樣組獲得的結果合併起來
 
數據分類處理的核心:
     - groupby()函數
     - groups屬性查看分組狀況
     - eg: df.groupby(by='item').groups

分組

df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'],
                'price':[4,3,3,2.5,4,2],
               'color':['red','yellow','yellow','green','green','green'],
               'weight':[12,20,50,30,20,44]})
df
  • 使用groupby實現分組

    df.groupby(by='item',axis=0)  #根據item分組
  • 使用groups查看分組狀況

    #該函數能夠進行數據的分組,可是不顯示分組狀況
    df.groupby(by='item',axis=0).groups
  • 分組後的聚合操做:分組後的成員中能夠被進行運算的值會進行運算,不能被運算的值不進行運算

  • 給df建立一個新列,內容爲各個水果的平均價格

    df.groupby(by='item',axis=0).mean()['price'] # 這樣效率低
    
    # 先將價格取出再運算
    df.groupby(by='item',axis=0)['price'].mean()
    按顏色查看各類顏色的水果的平均價格
    mean_price_series = df.groupby(by='item',axis=0)['price'].mean()
    mean_price_series
    # 結果
    item
    Apple     3.00
    Banana    2.75
    Orange    3.50
    
    #映射關係表
    dic = mean_price_series.to_dict()  # 將 mean_price_series 轉換成字典做爲映射表
    df['mean_price'] = df['item'].map(dic)
    df
  • 彙總:將各類顏色水果的平均價格和df進行彙總

    df['color_mean_price'] = df['color'].map(df.groupby(by='color')['price'].mean().to_dict())
    df

11. 高級數據聚合

使用groupby分組後,也可使用transform和apply提供自定義函數實現更多的運算

 - df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum)
 - transform和apply都會進行運算,在transform或者apply中傳入函數便可
 - transform和apply也能夠傳入一個lambda表達式

自定義聚合函數 :

def my_mean(s):
    sum = 0
    for i in s:
        sum += i
    return sum/len(s)

#使用apply函數求出水果的平均價格
df.groupby(by='item')['price'].apply(my_mean)

12. 美國2012年總統候選人政治獻金數據分析

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
  • 方便你們操做,將月份和參選人以及所在政黨進行定義

    months = {'JAN' : 1, 'FEB' : 2, 'MAR' : 3, 'APR' : 4, 'MAY' : 5, 'JUN' : 6,
              'JUL' : 7, 'AUG' : 8, 'SEP' : 9, 'OCT': 10, 'NOV': 11, 'DEC' : 12}
    of_interest = ['Obama, Barack', 'Romney, Mitt', 'Santorum, Rick', 
                   'Paul, Ron', 'Gingrich, Newt']
    parties = {
      'Bachmann, Michelle': 'Republican',
      'Romney, Mitt': 'Republican',
      'Obama, Barack': 'Democrat',
      "Roemer, Charles E. 'Buddy' III": 'Reform',
      'Pawlenty, Timothy': 'Republican',
      'Johnson, Gary Earl': 'Libertarian',
      'Paul, Ron': 'Republican',
      'Santorum, Rick': 'Republican',
      'Cain, Herman': 'Republican',
      'Gingrich, Newt': 'Republican',
      'McCotter, Thaddeus G': 'Republican',
      'Huntsman, Jon': 'Republican',
      'Perry, Rick': 'Republican'           
     }
  1. 讀取usa_election.txt文件

    df = pd.read_csv('./data/usa_election.txt')
    df.head()

```

cmte_id cand_id cand_nm contbr_nm contbr_city contbr_st contbr_zip contbr_employer contbr_occupation contb_receipt_amt contb_receipt_dt receipt_desc memo_cd memo_text form_tp file_num
0 C00410118 P20002978 Bachmann, Michelle HARVEY, WILLIAM MOBILE AL 3.6601e+08 RETIRED RETIRED 250.0 20-JUN-11 NaN NaN NaN SA17A 736166
1 C00410118 P20002978 Bachmann, Michelle HARVEY, WILLIAM MOBILE AL 3.6601e+08 RETIRED RETIRED 50.0 23-JUN-11 NaN NaN NaN SA17A 736166

...

  1. 新建一列各個候選人所在黨派party

    ```python

    利用映射

    df['party'] = df['cand_nm'].map(parties)
    df.head()

```

cmte_id cand_id cand_nm contbr_nm contbr_city contbr_st contbr_zip contbr_employer contbr_occupation contb_receipt_amt contb_receipt_dt receipt_desc memo_cd memo_text form_tp file_num party
0 C00410118 P20002978 Bachmann, Michelle HARVEY, WILLIAM MOBILE AL 3.6601e+08 RETIRED RETIRED 250.0 20-JUN-11 NaN NaN NaN SA17A 736166 Republican
1 C00410118 P20002978 Bachmann, Michelle HARVEY, WILLIAM MOBILE AL 3.6601e+08 RETIRED RETIRED 50.0 23-JUN-11 NaN NaN NaN SA17A 736166 Republican
  1. party這一列中有哪些元素

    df['party'].unique() # 利用去重
  2. 統計party列中各個元素出現次數

    df['party'].value_counts()

    結果 :

    Democrat       292400
    Republican     237575
    Reform           5364
    Libertarian       702
  3. 查看各個黨派收到的政治獻金總數contb_receipt_amt

    df.groupby(by='party')['contb_receipt_amt'].sum()

    結果

    party
    Democrat       8.105758e+07
    Libertarian    4.132769e+05
    Reform         3.390338e+05
    Republican     1.192255e+08
  4. 查看天天各個黨派收到的政治獻金總數contb_receipt_amt

    df.groupby(by=['contb_receipt_dt','party'])['contb_receipt_amt'].sum()
    # groupby中by的參數,誰在前先對誰分組
  5. 將表中日期格式轉換爲'yyyy-mm-dd' day-m-y

    def transformDate(d):
        day,month,year = d.split('-')
        month = months[month]
        return '20'+year+'-'+str(month)+'-'+day
    df['contb_receipt_dt'] = df['contb_receipt_dt'].map(transformDate)
    df.head()
  6. 查看老兵(捐獻者職業)主要支持誰 :查看老兵們捐贈給誰的錢最多

    #1.將老兵對應的行數據取出
    df['contbr_occupation'] == 'DISABLED VETERAN'
    old_bing = df.loc[df['contbr_occupation'] == 'DISABLED VETERAN']
    
    #2.根據候選人分組
    old_bing.groupby(by='cand_nm')['contb_receipt_amt'].sum()
    # 結果 :
    cand_nm
    Cain, Herman       300.00
    Obama, Barack     4205.00
    Paul, Ron         2425.49
    Santorum, Rick     250.00
  7. 捐贈金額最大的人的職業以及捐獻額 .經過query("查詢條件來查找捐獻人職業")

    # 1.先找出捐錢金額最大的數據
    df['contb_receipt_amt'].max()  # 結果 1944042.43
    # 2.經過query("查詢條件來查找捐獻人職業")
    df.query('contb_receipt_amt == 1944042.43')

13. matplotlib繪圖

seaborn - 也是繪圖模塊

1. Matplotlib基礎知識

Matplotlib中的基本圖表包括的元素
    + x軸和y軸  axis   
    水平和垂直的軸線

    + x軸和y軸刻度  tick  
    刻度標示座標軸的分隔,包括最小刻度和最大刻度

    + x軸和y軸刻度標籤  tick label  
    表示特定座標軸的值

    + 繪圖區域(座標系) axes  
    實際繪圖的區域

    + 座標系標題 title  
    實際繪圖的區域

    + 軸標籤 xlabel ylabel  
    實際繪圖的區域

導包 :

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas import Series,DataFrame

%matplotlib inline # jupyter中的一個魔法函數(Magic Functions)當你調用matplotlib.pyplot的繪圖函數plot()進行繪圖的時候,或者生成一個figure畫布的時候,能夠直接在你的python console裏面生成圖像。

1. 包含單條曲線的圖

x=[1,2,3,4,5]
y=[2,4,6,8,10]
plt.plot(x,y)

2. 繪製拋物線

x = np.linspace(-np.pi,np.pi,num=10)  # linspace等差數列 pi=π
y = x**2
plt.plot(x,y)

3. 繪製正弦曲線

x = x
y = np.sin(x)
plt.plot(x,y)

4. 包含多個曲線的圖

a. 連續調用屢次plot函數

plt.plot(x,y)
plt.plot(x-1,y+2)

b. 在一個plot函數中傳入多對X,Y值,在一個圖中繪製多個曲線

plt.plot(x,y,x+1,y-1)

5. 將多個曲線圖繪製在一個table區域中:對象形式建立表圖

  • a=plt.subplot(row,col,loc) 建立曲線圖
  • a.plot(x,y) 繪製曲線圖
ax1 = plt.subplot(2,2,1) #  2,2,1 表示繪製兩行兩列的曲線圖,在位置1上
ax1.plot(x,y)

ax2 = plt.subplot(222)
ax2.plot(x+1,y-2)

ax3 = plt.subplot(223)
ax3.plot(x+3,y-1)

ax4 = plt.subplot(224)
ax4.plot(x**2,y-2)

6. 座標軸界限 (設置座標軸範圍)

plt.axis([xmin,xmax,ymin,ymax])

plt.plot(x,y)
plt.axis([-6,6,-2,2])  # 座標軸的範圍是 : X軸 (-6,6), Y軸 (-2,2)

7. 關閉座標軸 - plt.axis('off')

plt.plot(x,y)
plt.axis('off')

8. 設置畫布比例

  • plt.figure(figsize=(a,b)) a:x刻度比例 b:y刻度比例 (2:1)表示x刻度顯示爲y刻度顯示的2倍
plt.figure(figsize=(16,8))
plt.plot(x,y)

9. 座標軸標籤

  • s 標籤內容
  • color 標籤顏色
  • fontsize 字體大小
  • rotation 旋轉角度
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認字體 解決不能顯示中文的問題
mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示爲方塊的問題
plt.plot(x,y)
plt.xlabel('X軸')
plt.ylabel('Y軸')
plt.title('標題')

10. 圖例

兩種傳參方法:

  • 分別在plot函數中增長label參數,再調用plt.legend()方法顯示
  • 直接在legend方法中傳入字符串列表
plt.plot(x,y,label='temp')
plt.plot(x-1,y+3,label='dist')
plt.legend(loc=4) 
plt.legend(loc=3,ncol=2)
# loc 爲指定圖例的位置默認是1  ; ncol控制圖例中有幾列,在legend中設置ncol
1 - 右上
2 - 左上
3 - 左下
4 - 右下

11. 保存圖片

  • 使用figure對象的savefig函數來保存圖片

  • fig = plt.figure()---必須放置在繪圖操做以前

  • figure.savefig的參數選項

    • filename

      含有文件路徑的字符串或Python的文件型對象。圖像格式由文件擴展名推斷得出,例如,.pdf推斷出PDF,.png推斷出PNG (「png」、「pdf」、「svg」、「ps」、「eps」……)

    • dpi

      圖像分辨率(每英寸點數),默認爲100

    • facecolor ,打開保存圖片查看 圖像的背景色,默認爲「w」(白色)

fig = plt.figure()

plt.plot(x,y,label='temp')
plt.plot(x-1,y+3,label='dist')
plt.legend(loc=3,ncol=2)

fig.savefig('./123.png',dpi=300)

12. 設置plot的風格和樣式

  • 設置plot的風格和樣式

    • plot語句中支持除X,Y之外的參數,以字符串形式存在,來控制顏色、線型、點型等要素,語法形式爲:
      plt.plot(X, Y, 'format', ...)
    plt.plot(x,y,c='red',alpha=0.5,ls='steps',lw=3,marker='s',markersize='10')
    # 顏色 : color/c
    # alpha : 透明度
    # 線性 : linestyle或ls
    # 線寬 : linewidth或lw參數
    # 點型 marker 設置點形 markersize 設置點形大小
    線條風格 描述 線條風格 描述
    '-' 實線 ':' 虛線
    '--' 破折線 'steps' 階梯線
    '-.' 點劃線 'None' / ',' 什麼都不畫

點型 :

標記 描述 標記 描述 標記 描述 標記 描述
's' 正方形 'p' 五邊形 'x' X ',' 像素
'h' 六邊形1 'H' 六邊形2 '*' 星號 'o' 圓圈
'8' 八邊形 '.' '+' 加號 'D' 菱形
'1' 一角朝下的三腳架 '2' 一角朝上的三腳架 '3' 一角朝左的三腳架 '4' 一角朝右的三腳架
'd' 小菱形 '','None',' ',None

2. 2D圖形

1. 直方圖

  • 是一個特殊的柱狀圖,又叫作密度圖。

【直方圖的參數只有一個x!!!不像條形圖須要傳入x,y】

plt.hist()的參數

  • bins
    直方圖的柱數,可選項,默認爲10
  • color
    指定直方圖的顏色。能夠是單一顏色值或顏色的序列。若是指定了多個數據集合,例如DataFrame對象,顏色序列將會設置爲相同的順序。若是未指定,將會使用一個默認的線條顏色
  • orientation
    經過設置orientation爲horizontal建立水平直方圖。默認值爲vertical
data = [1,2,3,3,4,2,5]
plt.hist(data,bins=10,color='red')
plt.hist(data,bins=10,color='red',orientation='horizontal')

返回值 :

1: 直方圖向量,是否歸一化由參數normed設定

2: 返回各個bin的區間範圍

3: 返回每一個bin裏面包含的數據,是一個list

2. 條形圖

  • 參數:第一個參數是索引。第二個參數是數據值。第三個參數是條形的寬度

  • 【條形圖有兩個參數x,y】

  • width 縱向設置條形寬度

  • height 橫向設置條形高度

  • bar() - 豎向、barh() - 橫向

    x = [1,2,3,4,5]
    y = [2,4,6,8,10]
    plt.bar(x,y) # 豎向
    plt.barh(x,y) # 橫向

3. 餅圖

【餅圖也只有一個參數x】

pie()
餅圖適合展現各部分佔整體的比例,條形圖適合比較各部分的大小

  1. 普通各部分佔滿餅圖

    plt.pie([1,3,5])
  2. 普通未佔滿餅圖:小數/比例

    plt.pie([0.2,0.3,0.1])
    餅圖陰影、分裂等屬性設置 :
        #labels參數設置每一塊的標籤;
        #labeldistance參數設置標籤距離圓心的距離(比例值)
        #autopct參數設置比例值小數保留位(%.3f%%);
        #pctdistance參數設置比例值文字距離圓心的距離
        #explode參數設置每一塊頂點距圓心的長度(比例值,列表);
        #colors參數設置每一塊的顏色(列表);
        #shadow參數爲布爾值,設置是否繪製陰影
        #startangle參數設置餅圖起始角度
  3. labels標籤

    arr=[11,22,31,15]
    plt.pie(arr,labels=['a','b','c','d'])  #
  4. 參數設置標籤距離圓心的距離(比例值)

    #labeldistance參數設置標籤距離圓心的距離(比例值)
    arr=[11,22,31,15]
    plt.pie(arr,labels=['a','b','c','d'],labeldistance=0.3)
  5. 參數設置比例值小數保留位

    #autopct參數設置比例值小數保留位(%.3f%%); 3表示保留三位小數
    arr=[11,22,31,15]
    plt.pie(arr,labels=['a','b','c','d'],labeldistance=0.3,autopct='%.5f%%')
  6. explode參數設置每一塊頂點距圓心的長度(比例值,列表)

    #explode參數設置每一塊頂點距圓心的長度(比例值,列表);
    arr=[11,22,31,15]
    plt.pie(arr,labels=['a','b','c','d'],labeldistance=0.3,shadow=True,explode=[0.2,0.3,0.2,0.9])

3. 散點圖

  • 因變量隨自變量而變化的大體趨勢

【散點圖須要兩個參數x,y,但此時x不是表示x軸的刻度,而是每一個點的橫座標!】- scatter()

x=[1,2,3,4,5]
y=[2,4,6,8,10]
plt.scatter(x,y)

plt.scatter(x,y,marker='d',c="rbgy") 設置不一樣的散點顏色

x = np.random.random(size=(30,))
y = np.random.random(size=(30,))
plt.scatter(x,y)
相關文章
相關標籤/搜索