基於python的大數據分析基本知識


1. 數據科學領域中常用的python庫

Numpy庫:數據運算的基礎庫,運行效率高(底層C語言,高效index)

Scipy庫:實現了常用的科學計算方法(線性代數,傅里葉變換,信號和圖像處理)

Pandas庫:分析數據的利器,高級數據結構(Series,DataFrame)

Matplotlib庫:繪圖功能(散點,曲線,柱形)

2. Anaconda的使用說明

介紹:著名的python數據科學平台,開源,跨平台。包含有流行的python和R的包。

下載地址:https://www.anaconda.com/download/

Jupyter notebook基本使用:

新建一個文件:new
執行代碼:Shift + Enter
模式切換:code 和 markdown
查看函數幫助信息: shift + tab
以%開頭的為魔法函數:%matplotlib inline
Jupyter notebook基本使用

 3. Numpy庫介紹

3.1 預備知識

數組與矩陣:數組可以是N維的,而矩陣是二維的數組。

向量:1 * N 或 N * 1 的矩陣

標量:1 * 1 的矩陣

3.2 定義數組

import numpy as np
list_1 = [1,2,3,4,5]
array_1 = np.array(list_1)
print(array_1)
定義一維數組
import numpy as np
list_1 = [1, 2, 3, 4]
list_2 = [5, 6, 7, 8]
array_2 = np.array([list_1, list_2])
print(array_2)
定義二維數組
# arange函數類似於python的range函數      
import numpy as np
array_3 = np.arange(1, 10, 2)    
print(array_3)
通過arange函數定義數組
import numpy as np
array_4_1 = np.zeros(5)       # 定義一維全零數組
print(array_4_1)
array_4_2 = np.zeros([2,3])   # 定義二維全零數組,兩行三列
print(array_4_2)
定義全零數組
import numpy as np
array_5 = np.eye(5)       # 定義單位數組: 5*5
print(array_5)
定義單位數組
import numpy as np
array_6 = np.random.randn(10)
print(array_6)
通過randn定義數組
import numpy as np
array_7_1 = np.random.randint(10, size=10)      # 一維數組: 每個元素都是0-9中的一個數,size表示1行10列
print(array_7_1)
array_7_2 = np.random.randint(10, size=(2,3))   # 二維數組: 每個元素都是0-9中的一個數,size表示2行3列
print(array_7_2)
array_7_3 = np.random.randint(10, size=20).reshape(4,5)      # 二維數組,每個元素都是0-9中的一個數,size表示1行20列,通過reshape函數進行再次切分
print(array_7_3)
通過randint定義數組

3.3 操作數組

import numpy as np
array_1 = np.random.randint(10, size=20).reshape(4,5)

# 數組的屬性
print(array_1.shape)     # 數組行列信息:(4, 5)
print(array_1.size)      # 數組總數量:20
print(array_1.dtype)     # 元素數據類型, 如果存在多種類型,則取精度最高的那個

# 數組的訪問--操作與切片類似
print(array_1)
print(array_1[0][1])     # 行選0,列選1
print(array_1[0,1])      # 行選0,列選1
print(array_1[:2,1:3])   # 行選0和1,列選1和2

# 數組的常用函數
print(np.unique(array_1))
print(np.sum(array_1))           # 返回所有數組元素的和
print(np.sum(array_1[0]))        # 返回某一行的和
print(np.sum(array_1[:,0]))      # 返回某一列的和
print(array_1.max())             # 返回元素中的最大值
print(array_1[0].max())          # 返回某一行中的最大值
print(array_1[:,0].min())        # 返回某一列中的最小值
數組操作

3.4 矩陣相關

import numpy as np
m = np.mat([[1,2,3, 4],[5,6,7,8]])
print(m)
通過列表定義矩陣
import numpy as np
a = np.random.randint(10, size=20).reshape(4,5)   # 定義一個二維數組
m = np.mat(a)
print(m)
通過二維數組定義矩陣
import numpy as np
A = np.mat(np.random.randint(10, size=20).reshape(4,5))
B = np.mat(np.random.randint(10, size=20).reshape(5,4))
print(A * B)     # 注意:A*B 其中[A矩陣的行]和[B矩陣的列]需要一樣,否則會報錯
矩陣的乘積運算

 4. Pandas庫介紹

pandas庫主要功能是進行數據的分析和處理,它有兩個重要的數據結構:Series 和 DataFrame

4.1 關於數據處理過程中的NaN數據

1. np.nan 其數據類型為float
2. 特點:任何數據跟NaN進行運算,都是NaN
3. 刪除帶有NaN的行或列
    s.dropna()
    df.dropna(axis=1),其中how參數:any(有nan就刪)還是all(全是nan才刪),thresh參數:可以設置nan的閾值
4. 其他與nan有關的函數
    s.isnull(),s.notnull(),df.isnull(),df.notnull()
    df.fillna(value=1)   # nan值全部填充為1
    df.fillna(value=(0:0,1:1))  # 0列nan填充0,1列nan填充1
關於NaN的一些知識點

4.2 數據結構Series

Series 類似於 Numpy 中的 array

4.2.1 定義Series

import numpy as np
import pandas as pd

# 通過list
s1 = pd.Series([1,2,3,4,5], index=['a','b','c','d','e'])
print(s1)

# 通過array
s2 = pd.Series(np.arange(10))
print(s2)

# 通過dict, 其中dict的key為index
s3 = pd.Series({"a":1,"b":2,"c":3,})
print(s3)
創建Series:3種方式
s.index
s.name
s.index.name
s.values
Series一些常見屬性

4.2.2 Series基本操作

import pandas as pd

s2 = pd.Series([1,2,3,4,5], index=['a','b','c','d','e'])

print(s2["b"])         # 訪問元素:根據索引
print(s2[s2<3])      # 訪問元素:給定值范圍

print(s2.to_dict())   # 將 Series 轉為 dict

index_new = ["A","B","C","D","E","F"]
s3 = pd.Series(s2, index=index_new)    # 改變Series的索引

s2.drop('a')            # 刪除一個元素

# Series的排序
s2.sort_index()      #  Series依據index排序
s2.sort_values()    #  Series依據values排序
Series基本操作

4.3 數據結構DataFrame

4.3.1 DataFrame基本知識

DataFrame對象中的某一列,返回的是一個Series對象

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

# 方式1:csv --> DataFrame
df1 = pd.read_csv("filePath_csv")

# 方式2:Series --> DataFrame
df2 = DataFrame([s1, s2], index=["a","b"])

# 方式3:dict --> DataFrame
df3 = DataFrame({})
創建DataFrame
df.shape                    # 查看df的行數和列數
df.columns                 # 查看df的列名
df.head()                   # 查看df的某幾行數據
df[['列名1','列名2']]     # 查看df的某些列數據, 也可以用 df.列名 的方法
df.T                          # 對df進行轉置
DataFrame的基本操作
### 過濾功能
# 對原有的DataFrame過濾掉某些列,得到一個新的DataFrame  相當於刪除某些列
df_new = DataFrame(df, columns=['第一列', '第三列'])    # 如果columns中填寫的列在df中不存在,那么該列的value均為NaN
# 表示行取10-19,列取0-1
df.iloc[10:20,0:2]     
# 表示行取10-11,列取從第一個到列名為[列名1]的列
df.loc[10:11,:'列名1']

### 修改value
# 給column中一整列全部value重新賦值
df_new['第N列'] = list | numpy | pandas
# 給column中某一個或幾個元素賦值
df_new['第十八列'] = pd.Series([100, 200], index=[1, 2])

### 刪除操作
# 刪除指定一行
df.drop('A',axis=0)
# 刪除指定一列
df.drop('c1',axis=1)

### 添加操作
# 方式1:直接新增一列
df["GDP"] = Series([111,222,333])  # 注意此方式有缺點,如果df的index不是默認值,新增時也需要指定
# 方式2:直接新增一列
df["GDP"] = df["城市"].map(gdp_map_dict)   # 使用map的優點,不需要關注index的情況
DataFrame的數據處理

4.3.2 DataFrame相關高級操作

4.3.2.1 運用到DataFrame中的高級函數

# apply可以對一列或一行數據進行處理
# apply可以傳入一個函數,這個函數對某一行或某一列進行操作
# apply也可以實現將一列分成多列
apply函數
# 通過去重進行數據清洗
df.drop_duplicates(['Seqno'], keep='last')
思路:先看某一列不重復的數據有多少:len(df[''].unique()),再通過duplicated判斷元素是否重復
drop_duplicates函數
# 已知一個[按天采樣]的Series,求其[按月采樣]或[按時采樣]
t_range = pd.date_range('2016-01-01', '2016-12-31')
s_day = Series(np.random.randn(len(t_range)), index=t_range)
# 按月采樣
s_month = s_day.resample('M').mean()
# 按時采樣
s_hour = s_day.resample('H').ffill()
resample函數
# 數據分箱技術binning    
score_list = np.random.randint(25, 100, size=20)
bins = [0, 59, 70, 80, 100]      # 定義區間范圍點
score_cat = pd.cut(score_list, bins)  # 對score_list做分箱操作
pd.value_counts(score_cat)   # 做統計呈現    

df = DataFrame()
df['score'] = score_list
df['student'] = [pd.util.testing.rands(3) for i in range(20)]

# 給df添加區間
df['categories'] = pd.cut(df['score'], bins, labels=['r1','r2','r3','r4'])
# 注意labels的數量應該等於bins的數量減1
print(df)
cut函數
# 數據聚合技術Aggregation
基本使用:df.agg("func_name")
其中func_name可以是內置的函數,也可以是自定義函數
內置的如:
    mean,min,max,describe
自定義的如:
    def func1(attr): return attr.max() - attr.min()
    df.agg("func1")    
agg函數
df = DataFrame([[1,2,3],[1,3,9],[7,3,9]], columns=["A","B","C"])
dfgb_one = df.groupby(df['A'])
# 按A列分組,求其他列的平均值
dfgb_one.mean()
# 按A列分組,求B列的平均值
dfgb_one['B'].mean()
groupby

4.3.2.2 DataFrame的排序

df = DataFrame(np.arange(40).reshape(8,5))

# 以A列進行排序,降序方式
df.sort_values('A',ascending=False)

# 以index進行排序
df.sort_index()
DataFrame的排序

4.3.2.3 重命名DataFrame的index

df.index = df.index.map(str.lower)                       # map函數可以自己定義,也可以使用python的內置函數
df.rename(index=str.lower, columns=str.lower)
df.rename(index={'A':'a'}, columns={'BJ':'bj'})    # 傳入字典,字典中內容為修改的內容
重命名DataFrame的index

4.3.2.4 DataFrame的merge操作

合並兩個df:pd.merge
合並規則:找列名相同,value值相同
    on參數默認為None,用來指定用哪一列進行merge
    how參數默認為inner,用來指定merge策略。可選取值:left, right, inner,outer
DataFrame的merge操作

4.3.2.4 DataFrame的多級index

1. 創建1個二級index的Series
2. 如何訪問具有二級index的Series
3. 多級index的Series與DataFrame的相互轉換
4. 創建1個具有多級index和多級columns的DataFrame
DataFrame的多級index

 

5. Pandas庫中Series和DataFrame的關系

1. DataFrame 的每一列為一個 Series

    DataFrame的每一行為一個 tuple。df.iterrows() 返回一個generator,遍歷generator,每個元素為一個tuple,每個tuple有兩個元素:index, Series。

2. Series是一維數據結構。index 創建series時可以指定,values array類型。

    DataFrame是二維數據結構。包含有index,columns,values。

3. Series轉為字典:{k1:v1,k2:v2}

    DataFrame轉為字典:{k1:{k11:v11,k12:v12}}

6. 使用pandas過程中的問題記錄

1. 當用read_csv讀取文件時,若某一列原本有整數和NaN數據,那么讀取內容后此列中所有的整數都會變為浮點數。因為NaN數據屬於浮點數。

2. 查看某一列中有多少個NaN的方法:.isnull().sum()

3. 統計某列或者某行數據元素的個數.value_counts()

4. 去除df中所有包含NaN的行:df.dropna()

5. 按條件刪除某些行:df.drop(df[(df.score < 50) & (df.score > 20)].index)

    其中可以使用操作符: | 只需其中一個成立,& 同時成立,~ 表示取反

6. 對列中每個元素做統一操作:df['column_name'].map(len)。其中len也可以是自定義函數

7. 針對某一列取值的唯一性,定義一些必要的映射關系:dict{ zip(df.column_name.unique(), {"a1", "a2", "a3"}) }


免責聲明!

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



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