Python爬蟲數據分析三劍客:Numpy、pandas、Matplotlib

一 Numpy

二 pandas

pandas簡介

pandas是創建在Numpy基礎上的高效數據分析處理庫,是Python的重要數據分析庫。
pandas提供了衆多的高級函數,極大地簡化了數據處理的流程,尤爲是被普遍地應用於金融領域的數據分析。python

pandas主要包括的是:
  • 帶有標籤的數據結構,主要包括序列(Series)和數據框(DataFrame)等
  • 容許簡單索引和多級索引
  • 支持從Excel、CSV等文本格式中文導入數據,以Pytables/HDF5格式高效地讀/寫數據。
  • 整合了對數據集的集合和轉換功能
  • 生成特定類型的數據
pandas的導入:
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
pandas中的Series

Series是一種相似與一維數組的對象,由下面兩個部分組成:數組

  • values:一組數據(ndarray類型)數據結構

  • index:相關的數據索引標籤app

1)Series的建立

兩種建立方式:dom

(1) 由列表或numpy數組建立ide

​ 默認索引爲0到N-1的整數型索引函數

  • 還能夠經過設置index參數指定索引
#使用列表建立   Series是序列
Series(data=[1,2,3,4,5,6])

#結果
0    1
1    2
2    3
3    4
4    5
5    6
dtype: int64
#經過numpy建立Series
Series(data=np.random.randint(1,40,size=(5,)),index=['a','d','f','g','t'],name='bobo')

(2) 由字典建立:不能在使用index.可是依然存在默認索引ui

​ 注意:數據源必須爲一維數據spa

dic = {
    '語文':150,
    '數學':150,
    '英語':150,
    '理綜':150
}
s = Series(data=dic)

#查看時

s

2)Series的索引和切片

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

(1) 顯式索引:

- 使用index中的元素做爲索引值
- 使用s.loc[](推薦):注意,loc中括號中放置的必定是顯示索引

注意,此時是閉區間

(2) 隱式索引:

- 使用整數做爲索引值
- 使用.iloc[](推薦):iloc中的中括號中必須放置隱式索引

注意,此時是半開區間

列如:

1551950155740

切片:隱式索引切片和顯示索引切片
  • 顯示索引切片:index和loc
  • 隱式索引切片:整數索引值和iloc

1551950430834

3)Series的基本概念

能夠把Series當作一個定長的有序字典

向Series增長一行:至關於給字典增長一組鍵值對

能夠經過shape,size,index,values等獲得series的屬性

1551950636694

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

1551950617463

對Series元素進行去重(使用unique)

1551951043909

兩個Series進行相加

  • 當索引沒有對應的值時,可能出現缺失數據顯示NaN(not a number)的狀況
  • 使得兩個Series進行相加:索引與之對應的元素會進行算數運算,不對應的就補空

1551951111777

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

1551951349043

4)Series的運算

(1) + - * /

(2) add() sub() mul() div() : s1.add(s2,fill_value=0)

(3) Series之間的運算

  • 在運算中自動對齊不一樣索引的數據
  • 若是索引不對應,則補NaN
pandas中的DataFrame

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

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

1)DataFrame的建立

最經常使用的方法是傳遞一個字典來建立。DataFrame以字典的鍵做爲每一【列】的名稱,以字典的值(一個數組)做爲每一列。

此外,DataFrame會自動加上每一行的索引。

使用字典建立的DataFrame後,則columns參數將不可被使用。

同Series同樣,若傳入的列與字典的鍵不匹配,則相應的值爲NaN。

DataFrame的建立方式:
  • 使用ndarray建立DataFrame

1551951693365

  • 使用ndarray建立DataFrame:建立一個表格用於展現張三,李四,語文,數學,英語的成績

    dic = {
        '張三':[77,88,99],
        '李四':[67,68,69]
    }
    df = DataFrame(data=dic,index=['語文','數學','英語'])
    df

    DataFrame屬性:values、columns、index、shape

    1551952332776

2)DataFrame的索引

(1) 對列進行索引
- 經過相似字典的方式  df['q']
- 經過屬性的方式     df.q

能夠將DataFrame的列獲取爲一個Series。返回的Series擁有原DataFrame相同的索引,且name屬性也已經設置好了,就是相應的列名。

1551952613925

修改索引
#修改列索引
df.columns = ['zhangsan','lisi']
df
(2) 對行進行索引
- 使用.loc[]加index來進行行索引
- 使用.iloc[]加整數來進行行索引

一樣返回一個Series,index爲原來的columns。

(3) 對元素索引的方法
- 使用列索引
- 使用行索引(iloc[3,1] or loc['C','q']) 行索引在前,列索引在後

切片:

【注意】 直接用中括號時:

  • 索引表示的是列索引
  • 切片表示的是行切片

3)DataFrame的運算

(1) DataFrame之間的運算

同Series同樣:

  • 在運算中自動對齊不一樣索引的數據
  • 若是索引不對應,則補NaN

處理丟失數據

有兩種丟失數據:

  • None
  • np.nan(NaN)
1. None

None是Python自帶的,其類型爲python object。所以,None不能參與到任何計算中。

2. np.nan(NaN)

np.nan是浮點類型,能參與到計算中。但計算的結果老是NaN。

3. pandas中的None與NaN
1) pandas中None與np.nan都視做np.nan
#建立DataFrame
df = DataFrame(data=np.random.randint(10,50,size=(8,8)))
df
df.iloc[1,3]=None
df.iloc[2,2]=None
df.iloc[4,2]=None
df.iloc[6,7]=np.nan

2) pandas處理空值操做

  • isnull()

  • notnull()
  • dropna(): 過濾丟失數據

  • fillna(): 填充丟失數據

#一行中要是都有值  也就是 不是空的爲True  
#一行 中只要有一個爲none 爲空則爲False
df.notnull().all(axis=1) #1表明行    notnull(all)  isnull(any)


df.loc[df.notnull().all(axis=1)]   #去掉行有值爲空的行

df.dropna() 能夠選擇過濾的是行仍是列(默認爲行):axis中0表示行,1表示的列

df.dropna(axis=0)  #刪除一行中有空值的行
3) 填充函數 Series/DataFrame
  • fillna():value和method參數

    能夠選擇前向填充仍是後向填充

    df.fillna(method='ffill',axis=1) #向前填充 就是根據前條數據來填充空數據

    method 控制填充的方式 bfill(向後填充) ffill(向前填充)

1. 建立多層列索引

1) 隱式構造

最多見的方法是給DataFrame構造函數的index或者columns參數傳遞兩個或更多的數組

2) 顯示構造pd.MultiIndex.from_
  • 使用數組
  • 使用product
import numpy as np
import pandas as pd
from pandas import Series,DataFrame

col=pd.MultiIndex.from_product([['qizhong','qimo'],
                                ['chinese','math']])

#建立DF對象
df = DataFrame(data=np.random.randint(60,120,size=(2,4)),index=['tom','jay'],
         columns=col)
df

二 pandas的拼接操做

pandas的拼接分爲兩種:

  • 級聯:pd.concat, pd.append
  • 合併:pd.merge, pd.join
1. 使用pd.concat()級聯
pandas使用pd.concat函數,與np.concatenate函數相似,只是多了一些參數:

objs
axis=0
keys
join='outer' / 'inner':表示的是級聯的方式,outer會將全部的項進行級聯(忽略匹配和不匹配),而inner只會將匹配的項級聯到一塊兒,不匹配的不級聯
ignore_index=False
1)匹配級聯
df1 = DataFrame(data=np.random.randint(0,100,size=(3,3)),index=['a','b','c'],columns=['A','B','C'])
df2 = DataFrame(data=np.random.randint(0,100,size=(3,3)),index=['a','d','c'],columns=['A','d','C'])
pd.concat((df1,df1),axis=0,join='inner')
2) 不匹配級聯

不匹配指的是級聯的維度的索引不一致。例如縱向級聯時列索引不一致,橫向級聯時行索引不一致

有2種鏈接方式:

  • 外鏈接:補NaN(默認模式)

  • 內鏈接:只鏈接匹配的項

3) 使用df.append()函數添加

因爲在後面級聯的使用很是廣泛,所以有一個函數append專門用於在後面添加

2. 使用pd.merge()合併

merge與concat的區別在於,merge須要依據某一共同的列來進行合併

使用pd.merge()合併時,會自動根據二者相同column名稱的那一列,做爲key來進行合併。

注意每一列元素的順序不要求一致

參數:

  • how:out取並集 inner取交集

  • on:當有多列相同的時候,可使用on來指定使用那一列進行合併,on的值爲一個列表

1) 一對一合併

將df1與df2合併

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,how='outer')
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,how='outer')
3)多對多合併
df5 = DataFrame({'employee':['Bob','Jake','Lisa'],
                 'group':['Accounting','Engineering','Engineering']})
df5

df6 = DataFrame({'group':['Engineering','Engineering','HR'],
                'supervisor':['Carly','Guido','Steve']
                })
df6
pd.merge(df5,df6,how='outer')

4) key的規範化

  • 當列衝突時,即有多個列名稱相同時,須要使用on=來指定哪個列做爲key,配合suffixes指定衝突列名
  • 當兩張表沒有可進行鏈接的列時,可以使用left_on和right_on手動指定merge中左右兩邊的哪一列列做爲鏈接的列
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']})
5) 內合併與外合併:out取並集 inner取交集
  • 內合併:只保留二者都有的key(默認模式)

  • 外合併 how='outer':補NaN

三 Matplotlib

Matplotlib是一個主要用於繪製二維圖形的Python庫

-可以繪製出高質量的圖形,而且圖形裏面的鑲嵌的文本必需足夠美觀

-可以和Tex文檔一塊兒輸出

-可以嵌入到GUI(圖形用戶界面)應用程序中

Matplotlib中的基本圖表包括的元素

  • x軸和y軸 axis
    水平和垂直的軸線

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

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

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

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

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

matplotlib的導入:
import matplotlib.pyplot as plt
包含單條曲線的圖
  • 注意:y,x軸的值必須爲數字

簡單的列子:

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

1551965523571

  • 繪製拋物線

    x = np.linspace(-np.pi,np.pi,num=20)
    y = x**2
    plt.plot(x,y)
  • 繪製正弦曲線圖

    x
    y = np.sin(x)
    plt.plot(x,y)
包含多個曲線的圖

一、連續調用屢次plot函數

plt.plot(x,y)
plt.plot(x+2,y+3)

二、也能夠在一個plot函數中傳入多對X,Y值,在一個圖中繪製多個曲線

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

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

  • a=plt.subplot(row,col,loc) 建立曲線圖
  • a.plot(x,y) 繪製曲線圖
ax1 = plt.subplot(221)
ax1.plot(x,y)

ax2 = plt.subplot(2,2,2)
ax2.plot(x,y)

ax3 = plt.subplot(2,2,3)
ax3.plot(x,y)

ax4 = plt.subplot(2,2,4)
ax4.plot(x,y)

網格線 plt.gride(XXX)

參數:

- axis
- color:支持十六進制顏色
- linestyle: --  -.  :
- alpha
plt.plot(x,y)
plt.grid(axis='both',c='blue')

繪製一個正弦曲線圖,並設置網格

plt.plot(x,y,c='red',alpha=0.7)

座標軸界限

axis方法:設置x,y軸刻度值的範圍

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

plt.plot(x,y)
plt.axis([-6,6,-2,2])
#plt.axis('off')
plt.axis('off')
關閉座標軸
相關文章
相關標籤/搜索