python數據分析入門


什么是數據分析?

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

數據分析三劍客:Numpy,Pandas,Matplotlb

NumPy簡介

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

NumPy的前身Numeric 最早是由 Jim Hugunin 與其它協作者共同開發,2005 年,Travis Oliphant 在 Numeric 中結合了另一個同性質的程序庫 Numarray 的特色,並加入了其它擴展而開發了 NumPy。NumPy 為開放源代碼並且由許多協作者共同維護開發。

NumPy是一個運行速度非常快的數學庫,主要用於數組計算,包含:

- 一個強大的N維數組對象ndarray

- 廣播功能函數

- 整合 c/c++/Fortran 代碼的工具

- 線性代數, 傅里葉變換、隨機數生成等功能

NumPy應用

NumPy 通常與 SciPy(Scientific Python)和 Matplotlib(繪圖庫)一起使用, 這種組合廣泛用於替代 MatLab,是一個強大的科學計算環境,有助於我們通過 Python 學習數據科學或者機器學習。

SciPy 是一個開源的 Python 算法庫和數學工具包。

SciPy 包含的模塊有最優化、線性代數、積分、插值、特殊函數、快速傅里葉變換、信號處理和圖像處理、常微分方程求解和其他科學與工程中常用的計算。

Matplotlib 是 Python 編程語言及其數值數學擴展包 NumPy 的可視化操作界面。它為利用通用的圖形用戶界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向應用程序嵌入式繪圖提供了應用程序接口(API)。

入門

NumPy的主要對象是同構多維數組.他是一個元素表(通常是數字),都是相同的類型,有正整數元組索引,在NumPy維度中成為軸.

例如,3D空間中的點的坐標[1,2,1]具有一個軸,該軸有三個元素,所以說它的長度為3,在下面所示的例子中,數組有兩個軸,第一個軸長度為2,第二個軸的長度為3.

[[ 1., 0., 0.],
 [ 0., 1., 2.]]

 

NumPy的數組類被調用ndarray它也被別名所知 array請注意,numpy.array這與標准Python庫類不同array.array,后者只處理一維數組並提供較少的功能。ndarray對象更重要的屬性是:

 

ndarray.ndim --- 數組的軸數(尺寸)

ndarray.shape --- 數組的大小,這是一個整數元組,表示每個維度中數組的大小,對於具有n行和m列的矩陣,shape將是(n,m).shape因此元組的長度是軸的數量ndim

ndarray.size --- 數組的元素總數。這等於元素的乘積shape

ndarray.itemsize --- 數組中每個元素的大小(以字節為單位)。例如,類型的元素數組float64itemsize8(= 64/8),而其中一個類型complex32itemsize4(= 32/8)。它相當於ndarray.dtype.itemsize

ndarray.data --- 包含數組實際元素的緩沖區。通常,我們不需要使用此屬性,因為我們將使用索引工具訪問數組中的元素。

例子:

>>> import numpy as np
>>> a = np.arange(15).reshape(3, 5) # 創建一個二維數組
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
>>> a.shape # 查看每個維度中數組的大小
(3, 5)      # 3行5列
>>> a.ndim   # 數組的軸數,二維數組
2
>>> a.dtype.name # 描述數組中元素類型的對象
'int64'
>>> a.itemsize # 數組中每個元素的大小為8字節
8
>>> a.size # 數組的元素總數
15
>>> type(a)
<type 'numpy.ndarray'>
>>> b = np.array([6, 7, 8])
>>> b
array([6, 7, 8]) # 創建一個數組
>>> type(b)
<type 'numpy.ndarray'>
>>> np.array([[1,2,3],['a','b',1.1]]) # 創建一個二維數組
array([['1', '2', '3'],
       ['a', 'b', '1.1']], dtype='<U11')

 

 數組的創建

有以下集中方法可以創建數組.

你可以使用array函數從常規python列表或元組創建數組,結果數組的類型是從序列中元素的類型推導出來的

>>> import numpy as np
>>> a = np.array([2,3,4])
>>> a
array([2, 3, 4])
>>> a.dtype
dtype('int64')
>>> b = np.array([1.2, 3.5, 5.1])
>>> b.dtype
dtype('float64')

 常見的錯誤在於array使用多個數字參數調用,而不是提供單個數字列表作為參數.

>>> a = np.array(1,2,3,4)    # 錯誤的
>>> a = np.array([1,2,3,4])  # 正確的

 array將兩個序列轉換成二維陣列,將序列轉換成三維陣列.等.

>>> b = np.array([(1.5,2,3), (4,5,6)])
>>> b
array([[ 1.5,  2. ,  3. ],
       [ 4. ,  5. ,  6. ]])

注意:

  - numpy默認ndarray的所有元素的類型是相同的

       - 如果傳進來的列表中包含不同的類型,則統一為統一類型,優先級 str > float > int

也可以在創建時顯式指定數組類型:

>>> c = np.array( [ [1,2], [3,4] ], dtype=complex )
>>> c
array([[ 1.+0.j,  2.+0.j],
       [ 3.+0.j,  4.+0.j]])

 通常數組的元素最初是未知的,但其大小是已知的.因此,NumPy提供了幾個函數來創建具有初始占位符內容的數組.這些最小化了增加舉證的必要性,這是一項昂貴的操作,

函數zeros創建一個充滿零的數組,

函數ones創建一個完整的數組,

函數empty創建一個數組,其初始內容是隨機的,取決於內存的狀態.默認情況下,創建的數組的dtype是float64.

>>> np.zeros( (3,4) )
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
>>> np.ones( (2,3,4), dtype=np.int16 )                # dtype can also be specified
array([[[ 1, 1, 1, 1],
        [ 1, 1, 1, 1],
        [ 1, 1, 1, 1]],
       [[ 1, 1, 1, 1],
        [ 1, 1, 1, 1],
        [ 1, 1, 1, 1]]], dtype=int16)
>>> np.empty( (2,3) )                                 # uninitialized, output may vary
array([[  3.73603959e-262,   6.02658058e-154,   6.55490914e-260],
       [  5.30498948e-313,   3.14673309e-307,   1.00000000e+000]])

 

為了創建數字序列,NumPy提供了一個類似於range返回數組而不是列表的函數

>>> np.arange( 10, 30, 5 )
array([10, 15, 20, 25])
>>> np.arange( 0, 2, 0.3 )                 # it accepts float arguments
array([ 0. ,  0.3,  0.6,  0.9,  1.2,  1.5,  1.8])

第一個參數開始數字,第二個是結束數字,第三個類似步長

 當arange與浮點參數一起使用時,由於有限的浮點精度,通常不可能預測所獲得的元素的數量。出於這個原因,通常最好使用linspace作為參數接收我們想要的元素數量的函數,而不是步驟:

>>> from numpy import pi
>>> np.linspace( 0, 2, 9 )                 # 9 numbers from 0 to 2
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])
>>> x = np.linspace( 0, 2*pi, 100 )        # useful to evaluate function at lots of points
>>> f = np.sin(x)

 數組的打印

當您打印數組時,NumPy以與嵌套列表類似的方式顯示它,但具有以下布局:

  • 最后一個軸從左到右打印,
  • 倒數第二個是從上到下打印的,
  • 其余部分也從上到下打印,每個切片用空行分隔。

然后將一維數組打印為行,將二維數據打印為矩陣,將三維數據打印為矩陣列表。

>>> a = np.arange(6)                         # 然后將一維數組打印為行
>>> print(a)
[0 1 2 3 4 5]
>>>
>>> b = np.arange(12).reshape(4,3)           # 將二維數據打印為矩陣
>>> print(b)
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
>>>
>>> c = np.arange(24).reshape(2,3,4)         # 將三維數據打印為矩陣列表
>>> print(c)
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]
 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

 如果數組太大而無法打印,NumPy會自動跳過數組的中心部分並僅打印角落:

>>> print(np.arange(10000))
[   0    1    2 ..., 9997 9998 9999]
>>>
>>> print(np.arange(10000).reshape(100,100))
[[   0    1    2 ...,   97   98   99]
 [ 100  101  102 ...,  197  198  199]
 [ 200  201  202 ...,  297  298  299]
 ...,
 [9700 9701 9702 ..., 9797 9798 9799]
 [9800 9801 9802 ..., 9897 9898 9899]
 [9900 9901 9902 ..., 9997 9998 9999]]

 要禁用此行為並強制NumPy打印整個陣列,可以使用更改打印選項set_printoptions

>>> np.set_printoptions(threshold=np.nan)

 基本操作

數組上的算術運算符應用於元素創建一個新數組並填充結果。

>>> a = np.array( [20,30,40,50] )
>>> b = np.arange( 4 )
>>> b
array([0, 1, 2, 3])
>>> c = a-b
>>> c
array([20, 29, 38, 47])
>>> b**2
array([0, 1, 4, 9])
>>> 10*np.sin(a)
array([ 9.12945251, -9.88031624,  7.4511316 , -2.62374854])
>>> a<35
array([ True, True, False, False])

 與許多矩陣語言不同,產品運算符*在NumPy數組中以元素方式運行。矩陣乘積可以使用@運算符(在python> = 3.5中)或dot函數或方法執行:

>>> A = np.array( [[1,1],
...             [0,1]] )
>>> B = np.array( [[2,0],
...             [3,4]] )
>>> A * B                       # elementwise product
array([[2, 0],
       [0, 4]])
>>> A @ B                       # matrix product
array([[5, 4],
       [3, 4]])
>>> A.dot(B)                    # another matrix product
array([[5, 4],
       [3, 4]])

 某些操作(例如+=和)*=用於修改現有陣列而不是創建新陣列。

>>> a = np.ones((2,3), dtype=int)
>>> b = np.random.random((2,3))
>>> a *= 3
>>> a
array([[3, 3, 3],
       [3, 3, 3]])
>>> b += a
>>> b
array([[ 3.417022  ,  3.72032449,  3.00011437],
       [ 3.30233257,  3.14675589,  3.09233859]])
>>> a += b                  # b is not automatically converted to integer type
Traceback (most recent call last):
  ...
TypeError: Cannot cast ufunc add output from dtype('float64') to dtype('int64') with casting rule 'same_kind'

 當使用不同類型的數組進行操作時,結果數組的類型對應於更一般或更精確的數組(稱為向上轉換的行為)

>>> a = np.ones(3, dtype=np.int32)
>>> b = np.linspace(0,pi,3)
>>> b.dtype.name
'float64'
>>> c = a+b
>>> c
array([ 1.        ,  2.57079633,  4.14159265])
>>> c.dtype.name
'float64'
>>> d = np.exp(c*1j)
>>> d
array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j,
       -0.54030231-0.84147098j])
>>> d.dtype.name
'complex128'

 許多一元操作,例如計算數組中所有元素的總和,都是作為ndarray類的方法實現的

>>> a = np.random.random((2,3))
>>> a
array([[ 0.18626021,  0.34556073,  0.39676747],
       [ 0.53881673,  0.41919451,  0.6852195 ]])
>>> a.sum()
2.5718191614547998
>>> a.min()
0.1862602113776709
>>> a.max()
0.6852195003967595

 默認情況下,這些操作適用於數組,就像它是一個數字列表一樣,無論其形狀如何。但是,通過指定axis 參數,您可以沿數組的指定軸應用操作:

>>> b = np.arange(12).reshape(3,4)
>>> b
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>>
>>> b.sum(axis=0)                            # 列的總和
array([12, 15, 18, 21])
>>>
>>> b.min(axis=1)                            # 行的總和
array([0, 4, 8])
>>>
>>> b.cumsum(axis=1)                         # cumulative sum along each row
array([[ 0,  1,  3,  6],
       [ 4,  9, 15, 22],
       [ 8, 17, 27, 38]])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM