05丨Python科學計算
在 NumPy 中數(shù)據(jù)結構是圍繞 ndarray 展開的, Pandas 中的核心數(shù)據(jù)結構是Series 和 DataFrame 這兩個核心數(shù)據(jù)結構酒觅,他們分別代表著一維的序列和二維的表結構愧捕∮缮樱基于這兩種數(shù)據(jù)結構捆愁,Pandas 可以對數(shù)據(jù)進行導入穆趴、清洗脸爱、處理、統(tǒng)計和輸出毡代。
- 數(shù)據(jù)結構:Series 和 DataFrame
- Series 是個定長的字典序列,有兩個基本屬性:index 和 values阅羹。在 Series 結構中,index 默認是 0,1,2,……遞增的整數(shù)序列教寂,當然我們也可以自己來指定索引捏鱼,比如 index=[‘a(chǎn)’, ‘b’, ‘c’, ‘d’]。
import pandas as pd
from pandas import Series, DataFrame
x1 = Series([1,2,3,4])
x2 = Series(data=[1,2,3,4], index=['a', 'b', 'c', 'd'])
print x1
print x2
結果:
0 1
1 2
2 3
3 4
dtype: int64
a 1
b 2
c 3
d 4
dtype: int64
- DataFrame 類型數(shù)據(jù)結構類似數(shù)據(jù)庫表酪耕。
import pandas as pd
from pandas import Series, DataFrame
data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [30, 98, 96, 77, 90]}
df1= DataFrame(data)
df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese'])
print df1
print df2
English Math Chinese
ZhangFei 65 30 66
GuanYu 85 98 95
ZhaoYun 92 96 93
HuangZhong 88 77 90
DianWei 90 90 80
- 數(shù)據(jù)的導入和導出
Pandas 允許直接從 xlsx导梆,csv 等文件中導入數(shù)據(jù),也可以輸出到 xlsx, csv 等文件,非常方便看尼。
import pandas as pd
from pandas import Series, DataFrame
score = DataFrame(pd.read_excel('data.xlsx'))
score.to_excel('data1.xlsx')
print score
- 數(shù)據(jù)清洗
示例數(shù)據(jù):
English Math Chinese
ZhangFei 65 30 66
GuanYu 85 98 95
ZhaoYun 92 96 93
HuangZhong 88 77 90
DianWei 90 90 80
- 刪除 DataFrame 中的不必要的列或行
df2 = df2.drop(columns=['Chinese']) #刪除列
df2 = df2.drop(index=['ZhangFei']) #刪除行
- 重命名列名 columns递鹉,讓列表名更容易識別
df2.rename(columns={'Chinese': 'YuWen', 'English': 'Yingyu'}, inplace = True)
- 去重復的值
df = df.drop_duplicates() #去除重復行
- 格式問題更改數(shù)據(jù)格式
這是個比較常用的操作,因為很多時候數(shù)據(jù)格式不規(guī)范藏斩,我們可以使用 astype 函數(shù)來規(guī)范數(shù)據(jù)格式躏结,比如我們把 Chinese 字段的值改成 str 類型,或者 int64 可以這么寫:
df2['Chinese'].astype('str')
df2['Chinese'].astype(np.int64)
#刪除左右兩邊空格
df2['Chinese']=df2['Chinese'].map(str.strip)
#刪除左邊空格
df2['Chinese']=df2['Chinese'].map(str.lstrip)
#刪除右邊空格
df2['Chinese']=df2['Chinese'].map(str.rstrip)
df2['Chinese']=df2['Chinese'].str.strip('$') #刪除Chinese 字段里有美元符號
#全部大寫
df2.columns = df2.columns.str.upper()
#全部小寫
df2.columns = df2.columns.str.lower()
#首字母大寫
df2.columns = df2.columns.str.title()
- 如果我們想看下哪個地方存在空值 NaN狰域,可以針對數(shù)據(jù)表 df 進行 df.isnull();如果我想知道哪列存在空值媳拴,可以使用 df.isnull().any()
- 使用 apply 函數(shù)對數(shù)據(jù)進行清洗
apply 函數(shù)是 Pandas 中自由度非常高的函數(shù),使用頻率也非常高兆览。比如我們想對 name 列的數(shù)值都進行大寫轉化可以用:
df['name'] = df['name'].apply(str.upper)
我們也可以定義個函數(shù)屈溉,在 apply 中進行使用。比如定義 double_df 函數(shù)是將原來的數(shù)值 *2 進行返回抬探。然后對 df1 中的“語文”列的數(shù)值進行 *2 處理子巾,可以寫成:
def double_df(x):
return 2*x
df1[u'語文'] = df1[u'語文'].apply(double_df)
我們也可以定義更復雜的函數(shù),比如對于 DataFrame小压,我們新增兩列线梗,其中’new1’列是“語文”和“英語”成績之和的 m 倍,'new2’列是“語文”和“英語”成績之和的 n 倍怠益,我們可以這樣寫:
def plus(df,n,m):
df['new1'] = (df[u'語文']+df[u'英語']) * m
df['new2'] = (df[u'語文']+df[u'英語']) * n
return df
df1 = df1.apply(plus,axis=1,args=(2,3,))
其中 axis=1 代表按照列為軸進行操作缠导,axis=0 代表按照行為軸進行操作,args 是傳遞的兩個參數(shù)溉痢,即 n=2, m=3僻造,在 plus 函數(shù)中使用到了 n 和 m,從而生成新的 df孩饼。
-
數(shù)據(jù)統(tǒng)計
image.png 數(shù)據(jù)表合并
兩個 DataFrame 數(shù)據(jù)表的合并使用的是 merge() 函數(shù)髓削,有下面 5 種形式:
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
df2 = DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(5)})
結果:
name data1
0 ZhangFei 0
1 GuanYu 1
2 a 2
3 b 3
4 c 4
=================
name data2
0 ZhangFei 0
1 GuanYu 1
2 A 2
3 B 3
4 C 4
- 基于指定列進行連接
df3 = pd.merge(df1, df2, on='name')
name data1 data2
0 ZhangFei 0 0
1 GuanYu 1 1
- inner 內連接
df3 = pd.merge(df1, df2, how='inner')
結果類似交集
- left 左連接
df3 = pd.merge(df1, df2, how='left')
name data1 data2
0 ZhangFei 0 0.0
1 GuanYu 1 1.0
2 a 2 NaN
3 b 3 NaN
4 c 4 NaN
- right 右連接
類似上面
- right 右連接
- outer 外連接
類似并集
- outer 外連接
- 如何用 SQL 方式打開 Pandas
借助工具pandasql,可以在 Python 里可以直接使用 SQL 語句來操作 Pandas镀娶。pandasql 中的主要函數(shù)是 sqldf立膛,它接收兩個參數(shù):一個 SQL 查詢語句,還有一組環(huán)境變量 globals() 或 locals()梯码。
···
import pandas as pd
from pandas import DataFrame
from pandasql import sqldf, load_meat, load_births
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
pysqldf = lambda sql: sqldf(sql, globals())
sql = "select * from df1 where name ='ZhangFei'"
print pysqldf(sql)
···
06 | 學數(shù)據(jù)分析要掌握哪些基本概念宝泵?
商業(yè)智能 BI、數(shù)據(jù)倉庫 DW轩娶、數(shù)據(jù)挖掘 DM 三者之間的關系
商業(yè)智能的英文是 Business Intelligence儿奶,縮寫是 BI。商業(yè)智能可以說是基于數(shù)據(jù)倉庫鳄抒,經(jīng)過了數(shù)據(jù)挖掘后闯捎,得到了商業(yè)價值的過程椰弊。所以說數(shù)據(jù)倉庫是個金礦,數(shù)據(jù)挖掘是煉金術瓤鼻,而商業(yè)報告則是黃金秉版。
數(shù)據(jù)倉庫的英文是 Data Warehouse,縮寫是 DW茬祷。它可以說是 BI 這個房子的地基清焕,搭建好 DW 這個地基之后,才能進行分析使用祭犯,最后產(chǎn)生價值耐朴。數(shù)據(jù)倉庫可以說是數(shù)據(jù)庫的升級概念。
數(shù)據(jù)挖掘的英文是 Data Mining盹憎,縮寫是 DM。在商業(yè)智能 BI 中經(jīng)常會使用到數(shù)據(jù)挖掘技術铐刘。數(shù)據(jù)挖掘的核心包括分類陪每、聚類、預測镰吵、關聯(lián)分析等任務檩禾,通過這些煉金術,我們可以從數(shù)據(jù)倉庫中得到寶藏疤祭,比如商業(yè)報告盼产。
元數(shù)據(jù)(MetaData):描述其它數(shù)據(jù)的數(shù)據(jù),也稱為“中介數(shù)據(jù)”勺馆。
數(shù)據(jù)元(Data Element):就是最小數(shù)據(jù)單元戏售。數(shù)據(jù)挖掘的流程
1. 分類就是通過訓練集得到一個分類模型,然后用這個模型可以對其他數(shù)據(jù)進行分類草穆。
2. 聚類人以群分灌灾,物以類聚。聚類就是將數(shù)據(jù)自動聚類成幾個類別悲柱,聚到一起的相似度大锋喜,不在一起的差異性大。我們往往利用聚類來做數(shù)據(jù)劃分豌鸡。
3. 預測顧名思義嘿般,就是通過當前和歷史數(shù)據(jù)來預測未來趨勢,它可以更好地幫助我們識別機遇和風險涯冠。
4. 關聯(lián)分析就是發(fā)現(xiàn)數(shù)據(jù)中的關聯(lián)規(guī)則炉奴,它被廣泛應用在購物籃分析,或事務數(shù)據(jù)分析中蛇更。
輸入數(shù)據(jù)--->數(shù)據(jù)預處理(特征選擇盆佣、維規(guī)約往堡、規(guī)范化、選擇數(shù)據(jù)子集)--->數(shù)據(jù)挖掘-->數(shù)據(jù)后處理(模式過濾共耍、可視化虑灰、模式表示)--->信息
數(shù)據(jù)預處理中,我們會對數(shù)據(jù)進行幾個處理步驟:數(shù)據(jù)清洗痹兜,數(shù)據(jù)集成穆咐,以及數(shù)據(jù)變換。1. 數(shù)據(jù)清洗主要是為了去除重復數(shù)據(jù)字旭,去噪聲(即干擾數(shù)據(jù))以及填充缺失值对湃。2. 數(shù)據(jù)集成是將多個數(shù)據(jù)源中的數(shù)據(jù)存放在一個統(tǒng)一的數(shù)據(jù)存儲中。3. 數(shù)據(jù)變換就是將數(shù)據(jù)轉換成適合數(shù)據(jù)挖掘的形式遗淳。比如拍柒,通過歸一化將屬性數(shù)據(jù)按照比例縮放,這樣就可以將數(shù)值落入一個特定的區(qū)間內屈暗,比如 0~1 之間拆讯。我會在后面的幾節(jié)課給你講解如何對數(shù)據(jù)進行預處理。
數(shù)據(jù)后處理是將模型預測的結果進一步處理后养叛,再導出种呐。比如在二分類問題中,一般能得到的是 0~1 之間的概率值弃甥,此時把數(shù)據(jù)以 0.5 為界限進行四舍五入就可以實現(xiàn)后處理爽室。
上帝不會告訴我們規(guī)律,而是展示給我們數(shù)據(jù)
原文中使用追女生的做了形象的類比:比如你認識了兩個漂亮的女孩淆攻。
商業(yè)智能會告訴你要追哪個阔墩?成功概率有多大?
數(shù)據(jù)倉庫會說瓶珊,我這里存儲了這兩個女孩的相關信息戈擒,你要嗎?其中每個女孩的數(shù)據(jù)都有單獨的文件夾艰毒,里面有她們各自的姓名筐高、生日、喜好和聯(lián)系方式等丑瞧,這些具體的信息就是數(shù)據(jù)元柑土,加起來叫作元數(shù)據(jù)。
數(shù)據(jù)挖掘會幫助你確定追哪個女孩绊汹,并且整理好數(shù)據(jù)倉庫稽屏,這里就可以使用到各種算法,幫你做決策了西乖。
你可能會用到分類算法狐榔。御姐坛增、蘿莉、女王薄腻,她到底屬于哪個分類收捣?
如果認識的女孩太多了,多到你已經(jīng)數(shù)不過來了庵楷,比如說 5 萬人罢艾!你就可以使用聚類算法了,它幫你把這些女孩分成多個群組尽纽,比如 5 個組咐蚯。然后再對每個群組的特性進行了解,進行決策弄贿。這樣就把 5 萬人的決策春锋,轉化成了 5 個組的決策。成功實現(xiàn)降維差凹,大大提升了效率期奔。
如果你想知道這個女孩的閨蜜是誰,那么關聯(lián)分析算法可以告訴你直奋。
如果你的數(shù)據(jù)來源比較多,比如有很多朋友給你介紹女朋友施禾,很多人都推薦了同一個脚线,你就需要去重,這叫數(shù)據(jù)清洗弥搞;為了方便記憶邮绿,你把不同朋友推薦的女孩信息合成一個,這叫數(shù)據(jù)集成攀例;有些數(shù)據(jù)渠道統(tǒng)計的體重的單位是公斤船逮,有些是斤,你就需要將它們轉換成同一個單位粤铭,這叫數(shù)據(jù)變換挖胃。最后你可以進行數(shù)據(jù)可視化了,它會直觀地把你想要的結果呈現(xiàn)出來梆惯。