1. 程式人生 > >python進階之資料分析與展示(三)

python進階之資料分析與展示(三)

資料分析之表示

資料存取與函式


資料的CSV檔案存取

  • CSV (Comma‐Separated Value, 逗號分隔值)
    • CSV是一種常見的檔案格式,用來儲存批量資料。
    • np.savetxt(frame, array, fmt=’%.18e’, delimiter=None)
      • frame:檔案、字串或產生器,可以是.gz或.bz2的壓縮檔案。
      • array:存入檔案的陣列。
      • fmt:寫入檔案的格式,例如:%d,%.2f,%.18e。
      • delimiter:分割字串,預設是任何空格。
      In [1]: import numpy as np
      
      In [2]: a = np.arange(100).reshape(5, 20)
      
      In [3]: np.savetxt('a.csv', a, fmt = '%d', delimiter = ',')
      
      In [4]: np.savetxt('a.csv', a, fmt = '%.1f', delimiter = ',')
      
    • np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)
      • frame:檔案、字串或產生器,可以是.gz或.bz2的壓縮檔案。
      • dtype:資料型別,可選。
      • delimiter:分割字串,預設是任何空格。
      • unpack:如果True,讀入屬性將分別寫入不同變數。
      In [5]: b = np.loadtxt('a.csv', delimiter = ',')
      
      In [6]: b
      Out[6]:
      array([[  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,
               11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.],
             [ 20.,  21.,  22.,  23.,  24.,  25.,  26.,  27.,  28.,  29.,  30.,
               31.,  32.,  33.,  34.,  35.,  36.,  37.,  38.,  39.],
             [ 40.,  41.,  42.,  43.,  44.,  45.,  46.,  47.,  48.,  49.,  50.,
               51.,  52.,  53.,  54.,  55.,  56.,  57.,  58.,  59.],
             [ 60.,  61.,  62.,  63.,  64.,  65.,  66.,  67.,  68.,  69.,  70.,
               71.,  72.,  73.,  74.,  75.,  76.,  77.,  78.,  79.],
             [ 80.,  81.,  82.,  83.,  84.,  85.,  86.,  87.,  88.,  89.,  90.,
               91.,  92.,  93.,  94.,  95.,  96.,  97.,  98.,  99.]])
      
      In [7]: b = np.loadtxt('a.csv', dtype = np.int, delimiter = ',')
      
      In [8]: b
      Out[8]:
      array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
              17, 18, 19],
             [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
              37, 38, 39],
             [40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
              57, 58, 59],
             [60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
              77, 78, 79],
             [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
              97, 98, 99]])
      
  • CSV檔案的侷限性
    • CSV只能有效儲存一維和二維陣列。
    • np.savetxt() np.loadtxt()只能有效存取一維和二維陣列。

多維資料的存取

  • a.tofile(frame, sep = ‘’, format = ‘%s’)

    • frame:檔案、字串。
    • sep:資料分割字串,如果是空串,寫入檔案為二進位制。
    • format:寫入資料的格式。
  • np.fromfile(frame, dtype = float, count = ‐1, sep = ‘’)

    • frame : 檔案、字串。

    • dtype : 讀取的資料型別。

    • count : 讀入元素個數, ‐1表示讀入整個檔案。

    • sep : 資料分割字串,如果是空串,寫入檔案為二進位制。

      In [1]: import numpy as np
      
      In [2]: a = np.arange(100).reshape((5, 10, 2))
      
      In [3]: a.tofile("b.dat", sep = ',', format = '%d')
      
      In [4]: c = np.fromfile("b.dat", dtype = np.int, sep = ',')
      
      In [5]: c
      Out[5]:
      array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
             17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
             34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
             51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
             68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
             85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])
      
      In [6]: d = np.arange(100).reshape((5, 10, 2))
      
      In [7]: d.tofile("e.dat", format = '%d')
      
      In [8]: f = np.fromfile("e.dat", dtype = np.int).reshape((5, 10, 2))
      
      In [9]: f
      Out[9]:
      array([[[ 0,  1],
              [ 2,  3],
              [ 4,  5],
              [ 6,  7],
              [ 8,  9],
              [10, 11],
              [12, 13],
              [14, 15],
              [16, 17],
              [18, 19]],
      
             [[20, 21],
              [22, 23],
              [24, 25],
              [26, 27],
              [28, 29],
              [30, 31],
              [32, 33],
              [34, 35],
              [36, 37],
              [38, 39]],
      
             [[40, 41],
              [42, 43],
              [44, 45],
              [46, 47],
              [48, 49],
              [50, 51],
              [52, 53],
              [54, 55],
              [56, 57],
              [58, 59]],
      
             [[60, 61],
              [62, 63],
              [64, 65],
              [66, 67],
              [68, 69],
              [70, 71],
              [72, 73],
              [74, 75],
              [76, 77],
              [78, 79]],
      
             [[80, 81],
              [82, 83],
              [84, 85],
              [86, 87],
              [88, 89],
              [90, 91],
              [92, 93],
              [94, 95],
              [96, 97],
              [98, 99]]])
      
  • 該方法需要讀取時知道存入檔案時陣列的維度和元素型別,a.tofile()和np.fromfile()需要配合使用,可以通過元資料檔案來儲存額外資訊。

  • numpy的便捷檔案存取

    • np.save(fname, array)或np.savez(fname, array)
      • fname:檔名,以.npy為副檔名,壓縮副檔名為.npz。
      • array : 陣列變數。
    • np.load(fname)
      • fname:檔名,以.npy為副檔名,壓縮副檔名為.npz。
      In [1]: import numpy as np
      
      In [2]: a = np.arange(100).reshape((5, 10, 2))
      
      In [3]: np.save("a.npy", a)
      
      In [4]: b = np.load("a.npy")
      
      In [5]: b
      Out[5]:
      array([[[ 0,  1],
              [ 2,  3],
              [ 4,  5],
              [ 6,  7],
              [ 8,  9],
              [10, 11],
              [12, 13],
              [14, 15],
              [16, 17],
              [18, 19]],
      
             [[20, 21],
              [22, 23],
              [24, 25],
              [26, 27],
              [28, 29],
              [30, 31],
              [32, 33],
              [34, 35],
              [36, 37],
              [38, 39]],
      
             [[40, 41],
              [42, 43],
              [44, 45],
              [46, 47],
              [48, 49],
              [50, 51],
              [52, 53],
              [54, 55],
              [56, 57],
              [58, 59]],
      
             [[60, 61],
              [62, 63],
              [64, 65],
              [66, 67],
              [68, 69],
              [70, 71],
              [72, 73],
              [74, 75],
              [76, 77],
              [78, 79]],
      
             [[80, 81],
              [82, 83],
              [84, 85],
              [86, 87],
              [88, 89],
              [90, 91],
              [92, 93],
              [94, 95],
              [96, 97],
              [98, 99]]])
      

numpy的隨機數函式子庫

  • NumPy的random子庫

    • np.random.*。
    • np.random.rand()。
    • np.random.randn()。
    • np.random.randint()。
  • np.random的隨機數函式

    • r a n d ( d 0 , d 1 , . . , d n ) rand(d_0, d_1, .., d_n)
      • 根據 d 0 d n d_0‐d_n 建立隨機數陣列,浮點數,[0, 1),均勻分佈。
    • r a n d n ( d 0 , d 1 , . . , d n ) randn(d_0, d_1, .., d_n)
      • 根據 d 0 d n d_0‐d_n 建立隨機數陣列,標準正態分佈。
    • r a n d i n t ( l o w , h i g h , s h a p e ) randint(low, high, shape)
      • 根據shape建立隨機整數或整數陣列,範圍是[low, high)。
    • s e e d ( s ) seed(s)
      • 隨機數種子,s是給定的種子值。
      In [1]: import numpy as np
      
      In [2]: a = np.random.rand(3, 4, 5)
      
      In [3]: a
      Out[3]:
      array([[[ 0.83217382,  0.61118163,  0.30590278,  0.71116985,  0.17603919],
              [ 0.81172826,  0.48699483,  0.81460026,  0.623493  ,  0.55107553],
              [ 0.86620657,  0.90390364,  0.81578716,  0.40891691,  0.2326408 ],
              [ 0.68340764,  0.63524826,  0.83587159,  0.19651474,  0.40335556]],
      
             [[ 0.08825054,  0.7536702 ,  0.20601117,  0.74694086,  0.50562464],
              [ 0.40090569,  0.55872767,  0.8516932 ,  0.6771278 ,  0.17050715],
              [ 0.2302661 ,  0.40845969,  0.7862477 ,  0.58725055,  0.60185095],
              [ 0.65965904,  0.53130834,  0.07635645,  0.12635217,  0.29800591]],
      
             [[ 0.83050967,  0.91737354,  0.58201733,  0.34622195,  0.09050391],
              [ 0.35995164,  0.67825314,  0.4664572 ,  0.81583095,  0.45641495],
              [ 0.87039701,  0.19466886,  0.99467247,  0.90765088,  0.14004337],
              [ 0.61259295,  0.3306319 ,  0.92665368,  0.88046747,  0.91534592]]])
      
      In [4]: sn = np.random.randn(3, 4, 5)
      
      In [5]: sn
      Out[5]:
      array([[[ 1.19890639, -1.04116259,  0.86310116, -0.44739765,  1.69247186],
              [-0.00500273, -1.72542962, -1.85303537,  0.32333834,  0.14319963],
              [-0.34740334,  1.13620253, -0.80952734,  0.5312918 , -0.40971214],
              [-0.16907081,  0.64456188,  0.68710157,  0.65388462, -1.67621268]],
      
             [[ 0.03925995, -2.42998597,  0.51701801, -0.33539791, -0.0650079 ],
              [-0.64138021,  0.63553016,  1.32243291, -1.22898913,  1.11420398],
              [ 0.55977458,  1.31880826, -1.90351377,  0.17989029,  0.82177797],
              [ 0.439646  ,  0.70095378, -1.13840963, -0.75624264, -0.44955757]],
      
             [[ 0.91002957,  0.6574978 ,  0.17688196,  0.12094879,  2.6644552 ],
              [ 2.07175029,  1.67643254, -0.55679737,  0.40536107,  1.5346217 ],
              [-0.27773992, -1.19676653,  0.71463593,  0.66457126,  0.14682141],
              [ 0.72601705,  1.4557889 , -1.60036546,  0.87030802, -0.82342311]]])
      
      In [6]: b = np.random.randint(100, 200, (3, 4))
      
      In [7]: b
      Out[7]:
      array([[171, 145, 171, 120],
             [191, 140, 162, 148],
             [128, 187, 191, 162]])
      
      In [8]: np.random.seed(10)
      
      In [9]: np.random.randint(100, 200, (3, 4))
      Out[9]:
      array([[109, 115, 164, 128],
             [189, 193, 129, 108],
             [173, 100, 140, 136]])
      
      In [10]: np.random.seed(10)
      
      In [11]: np.random.randint(100, 200, (3, 4))
      Out[11]:
      array([[109, 115, 164, 128],
             [189, 193, 129, 108],
             [173, 100, 140, 136]])
      
    • s h u f f l e ( a ) shuffle(a)
      • 根據陣列a的第1軸進行隨機排列,改變陣列x。
    • p e r m u t a t i o n ( a ) permutation(a)
      • 根據陣列a的第1軸產生一個新的亂序陣列,不改變陣列x。
    • c h o i c e ( a , s i z e , r e p l a c e , p ) choice(a, size, replace, p)
      • 從一維陣列a中以概率p抽取元素,形成size形狀新陣列,replace表示是否可以重用元素,預設為False。
      
      In [1]: import numpy as np
      
      In [2]: a = np.random.randint(100, 200, (3, 4))
      
      In [3]: a
      Out[3]:
      array([[141, 109, 136, 153],
             [115, 118, 192, 152],
             [169, 143, 169, 126]])
      
      In [4]: np.random.shuffle(a)    # 陣列a發生了改變
      
      In [5]: a
      Out[5]:
      array([[115, 118, 192, 152],
             [169, 143, 169, 126],
             [141, 109, 136, 153]])
      
      In [6]: np.random.shuffle(a)
      
      In [7]: a
      Out[7]:
      array([[141, 109, 136, 153],
             [169, 143, 169, 126],
             [115, 118, 192, 152]])
      
      In [8]: b = np.random.randint(100, 200, (3, 4))
      
      In [9]: b
      Out[9]:
      array([[136, 197, 152, 165],
             [195, 154, 132, 155],
             [127, 121, 123, 161]])
      
      In [10]: np.random.permutation(b)   # 陣列b沒有被改變
      Out[10]:
      array([[127, 121, 123, 161],
             [195, 154, 132, 155],
             [136, 197, 152, 165]])
      
      In [11]: b
      Out[11]:
      array([[136, 197, 152, 165],
             [195, 154, 132, 155],
             [127, 121, 123, 161]])
      
      In [12]: c = np.random.randint(100, 200, (8,))
      
      In [13]: c
      Out[13]: array([195, 112, 130, 169, 156, 180, 102, 130])
      
      In [14]: np.random.choice(c, (3, 2))
      Out[14]:
      array([[102, 102],
             [180, 130],
             [130, 130]])
      
      In [15]: np.random.choice(c, (3, 2), replace = False)
      Out[15]:
      array([[180, 112],
             [130, 130],
             [156, 169]])
      
      In [16]: np.random.choice(c, (3, 2), p = c / np.sum(c))
      Out[16]:
      array([[130, 130],
             [130, 130],
             [130, 169]])
      
    • u n i f o r m ( l o w , h i g h , s i z e ) uniform(low, high, size)
      • 產生具有均勻分佈的陣列,low起始值,high結束值,size形狀。
    • n o r m a l ( l o c , s c a l e , s i z e ) normal(loc, scale, size)
      • 產生具有正態分佈的陣列,loc均值,scale標準差,size形狀。
    • p o i s s o n ( l a m , s i z e ) poisson(lam, size)
      • 產生具有泊松分佈的陣列,lam隨機事件發生率,size形狀。
      In [1]: import numpy as np
      
      In [2]: u = np.random.uniform(0, 10, (3, 4))
      
      In [3]: u
      Out[3]:
      array([[ 5.77047246,  1.01256917,  1.95423089,  9.20612219],
             [ 2.74586998,  3.40639646,  8.98460191,  4.54858063],
             [ 7.79810175,  3.70017557,  0.29809813,  0.99915164]])
      
      In [4]: n = np.random.normal(10, 5, (3, 4))
      
      In [5]: n
      Out[5]:
      array([[  3.29396378,  23.49129387,  12.98561076,  18.09697008],
             [  5.62780735,  10.50709279,   7.99811177,   2.961821  ],
             [ 15.52654509,   7.95058117,  11.39385202,  12.41859651]])
      

numpy的統計函式

  • NumPy直接提供的統計類函式

    • np.*。
    • np.std()。
    • np.var()。
    • np.average()。
  • NumPy的統計函式

    • sum(a, axis = None)

      • 根據給定軸axis計算陣列a相關元素之和,axis整數或元組。
    • mean(a, axis = None)

      • 根據給定軸axis計算陣列a相關元素的期望,axis整數或元組。
    • average(a, axis = None, weights = None)

      • 根據給定軸axis計算陣列a相關元素的加權平均值。
    • std(a, axis = None)

      • 根據給定軸axis計算陣列a相關元素的標準差。
    • var(a, axis = None)

      • 根據給定軸axis計算陣列a相關元素的方差。
    • axis = None是統計函式的標配引數。

      
      In [1]: import numpy as np
      
      In [2]: a = np.arange(15).reshape(3, 5)
      
      In [3]: a
      Out[3]:
      array([[ 0,  1,  2,  3,  4],
             [ 5,  6,  7,  8,  9],
             [10, 11, 12, 13, 14]])
      
      In [4]: np.sum(a)
      Out[4]: 105
      
      In [5]: np.mean(a, axis = 1)
      Out[5]: array([  2.,   7.,  12.])
      
      In [6]: np.mean(a, axis = 0)
      Out[6]: array([ 5.,  6.,  7.,  8.,  9.])
      
      In [7]: np.average(a, axis = 0, weights = [10, 5, 1])
      Out[7]: array([ 2.1875,  3.1875,  4.1875,  5.1875,  6.1875])
      
      In [8]: np.std(a)
      Out[8]: 4.3204937989385739
      
      In [9]: np.var(a)
      Out[9]: 18.666666666666668
      
    • min(a),max(a)

      • 計算陣列a中元素的最小值、最大值。
    • argmin(a),argmax(a)

      • 計算陣列a中元素最小值、最大值的降一維後下標。
    • unravel_index(index, shape)

      • 根據shape將一維下標index轉換成多維下標。
    • ptp(a)

      • 計算陣列a中元素最大值與最小值的差。
    • median(a)

      • 計算陣列a中元素的中位數(中值)。
      In [1]: import numpy as np
      
      In [2]: b = np.arange(15, 0, -1).reshape(3, 5)
      
      In [3]: b
      Out[3]:
      array([[15, 14, 13, 12, 11],
             [10,  9,  8,  7,  6],
             [ 5,  4,  3,  2,  1]])
      
      In [4]: np.max(b)
      Out[4]: 15
      
      In [5]: np.argmax(b)    # 扁平化後的下標
      Out[5]: 0
      
      In [6]: np.unravel_index(np.argmax(b), b.shape)     # 重塑成多維下標
      Out[6]: (0, 0)
      
      In [7]: np.ptp(b)
      Out[7]: 14
      
      In [8]: np.median(b)
      Out[8]: 8.0
      

numpy的梯度函式

  • np.gradient(f)
    • 計算陣列f中元素的梯度,當f為多維時,返回每個維度梯度。

    • 梯度:連續值之間的變化率,即斜率。

    • XY座標軸連續三個X座標對應的Y軸值:a, b, c,其中b的梯度是:(c‐a)/2。

      In [1]: import numpy as np
      
      In [2]: a = np.random.randint(0, 20, (5))
      
      In [3]: a
      Out[3]: array([ 2,  4, 11, 12, 17])
      
      In [4]: np.gradient(a)
      Out[4]: array([ 2. ,  4.5,  4. ,  3. ,  5. ])
      
      In [5]: b = np.random.randint(0, 20, (5))
      
      In [6]: b
      Out[6]: array([ 2,  7,  7, 18, 15])
      
      In [7]: np.gradient(b)
      Out[7]: array([ 5. ,  2.5,  5.5,  4. , -3. ])   # 兩種情況的計算:存在兩側值比如2.5 = (7‐2)/2和只有一側值比如-3 = (15‐18)/1
      
      In [8]: c = np.random.randint(0, 50, (3, 5))
      
      In [9]: c
      Out[9]:
      array([[41, 17, 33, 14, 20],
             [ 0, 17, 37, 19,  6],
             [20,  1, 11, 49, 20]])
      
      In [10]: np.gradient(c)
      Out[10]:
      [array([[-41. ,   0. ,   4. ,   5. , -14. ],
              [-10.5,  -8. , -11. ,  17.5,   0. ],
              [ 20. , -16. , -26. ,  30. ,  14. ]]),  # 最外層維度的梯度
       array([[-24. ,  -4. ,  -1.5,  -6.5,   6. ],
              [ 17. ,  18.5,   1. , -15.5, -13. ],
              [-19. ,  -4.5,  24. ,   4.5, -29. ]])]  # 第二層維度的梯度