Python資料分析入門

at_1發表於2021-09-09

如今資料分析越來越重要,比起使用excel等工具,使用程式語言更加高效。這篇文章主要介紹一些簡單的資料分析入門知識,使用的語言是python。

讀取csv檔案

資料分析的第一步是要利用程式讀取csv檔案:

例子1:

import csv

with open('a.csv') as csvfile:
    mpg = list(csv.DictReader(csvfile))    
    
mpg[:3]

例子2:

ds_file = "/home"
with open(ds_file, 'w') as csvfile:
    fout = csv.writer(csvfile, delimiter='|')
    
    for airport in airports:
        fout.writerow(airport)

Pandas

Panda庫是處理dataframe的強有力工具, 我們可以處理兩種型別的資料:

  1. Series: one-dimensional, 一維資料
values = pd.Series(data, index=idx)
series = pd.Series(range(5), index=['a','b','c','d','e'])
  1. DataFrame: two-dimensional,二維資料
dt = {
    'A': [0,2,3,45],
    'B': [1,2,3,4]
}
df = pd.DataFrame(dt, index=list('qwert'))

df.head() #檢視頭部幾行資料
df.tail(2) # 檢視尾部2行資料
df.describe() #檢視統計資料
df.columns # 檢視所有列名

對於資料中有一些空資料,可以使用以下這些方法進行處理:

df.dropna()

df.dropna(axis=1)
df.fillna(0)

df.fillna(df.mean())

另外,更加高階的一些資料處理操作:

  • : 透過標籤選取資料
  • : 透過行/列號選取資料

Numpy

NumPy(Numerical Python) 是Python 語言的一個擴充套件程式庫,支援大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫。它也是資料分析中常用的一個庫。

基礎操作

最基礎的操作就是資料的加減乘除,都可以給予陣列的形式進行:

a = np.array([1,2,3,4])
b = np.array([2,3,4,5])
a + b
a / b
a-b
a > b
a*b
A.dot(B)
np.dot(A, B)
a *= 3

另外,可以使用統計方法獲取陣列的統計資訊:

ages.sum()
ages.min()
ages.max()
ages.sum(axis=0)

切片和高階索引

資料的切片和其他Python資料結構類似:

a[2] # 獲取第二個
a[-2] # 獲取倒數第二個
a[2:7] # 從索引 2 開始到索引 7 停止
a[:11:2] # 從最開頭到索引11停止,間隔為2
a[::-1] # 獲得反轉的資料結構

numpy中提供了多種分割陣列的方式:

np.split(x, 3) # 通用函式,將一個陣列分割成多個子陣列
np.split(x, [4,7])
np.hsplit(y, 2) # 按列分割
np.vsplit(y, 2) # 按行分割

數學函式

numpy庫還提供了很多數學函式操作:

angels = np.array([0, 30, 45])
np.radians(angles) # 角度計算
np.cos(angels_radians) # cos
np.degrees(inv) 
np.mean()
np.median()
np.genfromtxt('data/s.csv', delimiter=',')
np.std()
np.var()

陣列變形

另外,可以藉助以下這些方法實現陣列的翻轉,變換等操作:

a.ravel() # 展開陣列
a.T # 置換陣列
a.T.ravel()
a.shape # 返回陣列的形狀
a.reshape(4,2) # 修改維度

遍歷元素

在python程式中有很多種方式可以遍歷numpy 生成的資料:

for i in a:
    print(i)
    
for element in students.flatten():
    print(element)
   
for element in students.flatten(order='F'):
    print(element)

numpy.*nditer*方法提供了一種更加靈活的方式訪問一個或者多個陣列元素。

for i in np.nditer(x):
    print(i)

我們可以使用引數order來決定遍歷的順序,order='F'表示Fortran order,即是列序優先.反之,order='C'表示行序優先:

for i in np.nditer(x, order = 'F', flags = ['external_loop']):
    print(i)

陣列的淺複製

一般的引用複製都是淺複製,這也意味著引用資料被修改,原有資料來源也會被修改

frunits.view()

深複製

fruits = np.array(3)
basket = fruits.copy()

高階陣列索引

藉助原生操作,我們還能實現更加高階地過濾處理陣列:

import numpy as np

a = np.arange(12)**2
indx_1 = [2,6,8]
a[inx_1]
indx+2 = np.array([[2,4],[8,10]])
a[indx_2]
food[row, col]

返回所有非0的陣列:

np.count_nonzero(gdp_16[gdp_16 > 1000])

Scipy

SciPy以NumPy為基礎,與NumPy一樣,SciPy有著穩定,成熟,且應用廣泛的數值運算庫。要學習相關技術,可以參考其

圖片操作

藉助scipy,可以基於畫素層面處理一些圖片資料:

# rgb values r,g,b: 值從0-255
# 灰度值grayscale範圍從0到-1 
from scipy import ndimage
from scipy import misc
import matplotlib.pyplot as plt

f = misc.face()
f.shape
plt.imshow(f)
plt.show()

其中misc模組中,提供一些基本的影像相關的讀寫函式,可以輕鬆讀寫影像資料。misc模組自帶一些灰度影像ascent和彩色的face圖,可以供我們學習使用。

視覺化

資料的視覺化,通常我們會藉助matplotlib這個庫,如果你使用Jupyter的話,可以使用如下語句開啟自動畫圖功能:

%matplotlib inline

下面是一些簡單的例子:

import matplotlib.pyplot as plt

# 1. 畫圖
fig = plt.figure()
# 2.新增axis
ax = fig.add_subplot()

# 或者使用快速步驟
fig, ax = plt.subplots()

plt.show()

或者畫一個子圖:

import numpy as np

fig, ax = plt.subplots(figsize=(10,5))

m = -2
b = 5
x = np.linspace(0, 10)
y = m * x + b

# 把資料帶上
ax.plot(x, y)
plt.show()

我們還可以在圖片上新增文字資訊:

ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")

ax.set_title("Test Title")

控制顯示範圍:

ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)

控制數軸上顯示的數字邏輯:

ax.set_xticks(np.arange(0, 15, 5))
ax.set_yticks(np.arange(-15, 10, 5))

如果需要畫多條線的話,可以參考如下例子:

x1 = np.linspace(0, 10)
y1 = m * x1 + b

x2 = x1
y2 = -1 * y1

ax.plot(x1, y1)
ax.plot(x2, y2)

*參考資料*

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1817/viewspace-2824929/,如需轉載,請註明出處,否則將追究法律責任。

相關文章