python部分
1.缺失值處理:
##pandas中讀取文件時: xlsx不容易出現(xiàn)編碼錯誤
csv文件可以先用df讀取在存成xlsx操作,如果讀取csv文件在存成csv文件容易出現(xiàn)編碼錯誤
##另外如果是文本文件,讀取時用Python strip() 方法移除字符串頭尾指定的字符(默認為空格)昆淡。否則切詞以后結(jié)果可能帶有大量的空格和換行狡相。
pandas的數(shù)據(jù)框中缺失值會用NaN(Not a Number)表示
import pandas as pd
df = pd.read_csv('Demand.csv',encoding='gbk')
如果DataFrame對象包含的數(shù)據(jù)很多员寇,人工來查找NaN就不現(xiàn)實了羽戒。我們可以使用isnull方法來返回一個值為布爾類型的DataFrame歼冰,判斷每個元素是否缺失,如果元素缺失剧腻,值為True拘央。然后使用sum方法,我們就能得到DataFrame中每一列的缺失值個數(shù)书在。
df.isnull().sum()
ps:由DataFrame數(shù)據(jù)框很容易得到NumPy數(shù)組灰伟,直接通過values屬性即可,然后就可以用sklearn中的算法了:
1.直接刪除帶有缺失值的特征
dropna方法包含多個參數(shù)儒旬,這裡介紹三個:
##去掉所有值為NaN的行栏账,默認為how ='any'
df.dropna(how ='all')
##留下五個以上非缺失值的行/去掉五個以下非缺失值的行
df.dropna(thresh = 5)
#按照“content”列中的空白部分來刪除對應(yīng)的行
df.dropna(subset=["content"])
2.插入值
插入值有很多方法:例如拉格朗日插值法,用於分類的數(shù)據(jù)可以用smote算法生成樣本栈源,最常用的是均值插入或者中位數(shù)插入挡爵。
pandas中使用fillna()完成插補,例如:插補0:df.fillna(0)甚垦,使用字典對指定列進行插補:df.fillna({1:0.5,3:-0.5})茶鹃,均值插補:data = pd.
Series([103,112,NA,121,98,NA])
data.fillna(data.mean())
這裡介紹均值插入,使用sklearn中的Imputer類能很容易實現(xiàn)此方法:
先介紹一下主要參數(shù)
missing_values:缺失值艰亮,可以為整數(shù)或NaN(缺失值numpy.nan用字符串‘NaN’表示)闭翩,默認為NaN
strategy:替換策略,字符串迄埃,默認用均值‘mean’替換
①若為mean時疗韵,用特征列的均值替換
②若為median時,用特征列的中位數(shù)替換
③若為most_frequent時侄非,用特征列的眾數(shù)替換
axis:指定軸數(shù)蕉汪,默認axis=0代表列,axis=1代表行
copy:設(shè)置為True代表不在原數(shù)據(jù)集上修改逞怨,設(shè)置為False時者疤,就地修改,存在如下情況時骇钦,即使設(shè)置為False時宛渐,也不會就地修改
from sklearn.preprocessing import Imputer
imr = Imputer(missing_values='NaN', strategy='mean', axis=0)
imr = imr.fit(df)
imputed_data = imr.transform(df.values)
先計算每一列的平均值,然后用相應(yīng)列的平均值來替換NaN眯搭。如果將參數(shù)axis=0改為axis=1窥翩,則會計算每個樣本的所有特征(行)的平均值。
這個數(shù)據(jù)最後一行只有一格數(shù)鳞仙,應(yīng)該先用上面的方法刪除最後一行寇蚊,再做填充。
2.正則表達式的一些例子(方便以后查閱)
R部分
缺失值處理:
#讀入文件
> setwd("C:/Users/CuiShan/Desktop/aaa")
> getwd()
[1] "C:/Users/CuiShan/Desktop/aaa"
>matrix = read.csv("Demand.csv")
#需要用到VIM和mice包
install.packages(c("VIM","mice"))
> which(is.na(matrix)) #返回缺失值的位置
> sum(is.na(matrix)) #計算數(shù)據(jù)集中的缺失值總數(shù)
> sum(complete.cases(matrix)) #統(tǒng)計數(shù)據(jù)集中完整樣本的個數(shù)(即縮小矩陣到max(a*b)以後可以為一個完整的矩陣)
1.識別缺失值
#函數(shù)is.na(),is.nan()和is.infinite()可以分別用來識別缺失值、不可能值、無窮值。
#返回結(jié)果為TRUE或FALSE俺泣,這個不做演示了
#列出沒有缺失值的行
matrix[complete.cases(matrix), ]
#列出有一個或多個缺失值的行
matrix[!complete.cases(matrix),]
#由於邏輯值TRUE和FALSE分別等價于數(shù)值1和0扒怖,
#可用sum()和mean()函數(shù)來獲取關(guān)於缺失值數(shù)據(jù)的有用信息较锡。
sum(is.na(matrix$GDP))
mean(is.na(matrix$GDP))
mean(!complete.cases(matrix))#0.4375
#可以通過md.pattern()獲取缺失值的分布情況(mice包),
#其中1表示沒有缺失數(shù)據(jù)盗痒,0表示存在缺失數(shù)據(jù),最后一行給出了每個變量中缺失值的數(shù)目:
> library(mice)
> md.pattern(matrix)
##第一行代表無缺失值的模型蚂蕴,
#第二行代表一個缺失值(以此類推,如果沒有則跳過)俯邓,
#最後一列代表該模式缺失值的個數(shù)骡楼,第一列表示各缺失值模式的實例個數(shù),
#例如:第一列為9511稽鞭,9就表示無缺失值的實例(行)個數(shù)有9個鸟整,
#5就表示有一個缺失值的的實例(行)個數(shù)有1個
2.缺失值可視化
##因為不能顯示中文,所以縱坐標只有一個GDP正常顯示
##第一張圖可以看出除了第一項是全的朦蕴,每項都缺失至少一個篮条,
##倒數(shù)第二項缺了7個
##第二張圖,說明有9行沒有缺失值梦重,有5行有一個缺失值兑燥,
#有1行有兩個缺失值,有1行有10個缺失值
#對應(yīng)上面的md.pattern(matrix)顯示的9511
aggr(matrix,prop=FALSE,numbers=TRUE)
##prop=TRUE琴拧,用比例代替計數(shù)
aggr(matrix,prop=TRUE,numbers=TRUE)
##消去數(shù)值型標籤numbers=FALSE位默認值
aggr(matrix,prop=TRUE,numbers=FALSE)
##淺色表示值小,深色表示值大嘱支,紅色為缺失值
matrixplot(matrix)
##另外還有marginplot()等等不做演示
3直接刪除&簡單插補
#直接刪除有缺失值的列蚓胸、行
a = t(na.omit(t(matrix)))#列
b = t(na.omit(matrix))#行
#或者用DMwR包實現(xiàn)
> library(VIM)
> library(DMwR)
>sum(!complete.cases(matrix))#查看含有缺失值的樣本個數(shù)(個數(shù)為7)
#直接刪除所有含有缺失值的行列
>matrix1<-na.omit(matrix)
#直接刪除缺失值過多的特征(列)或者實例(行)缺失值個數(shù)大于列數(shù)的20%
>matrix2<-matrix[-manyNAs(matrix,0.2),]#數(shù)據(jù)框的“刪除行”操作
>sum(!complete.cases(matrix2)) #再次查看結(jié)果(個數(shù)6,刪除了一行)
其中,函數(shù)manyNAs(x,nORp)用來查找數(shù)據(jù)框x中缺失值過多(≥缺失比例nORp)的行除师,nORp默認為0.2沛膳,即缺失值個數(shù)≥列數(shù)的20%。
ps:
x<-c(1,2,3,NA,5)
mean(x)#默認不忽略NA值或NaN值汛聚,注意與NULL的區(qū)別
[1] NA
mean(x,na.rm=TRUE)#忽略缺失值
[1] 2.75
#簡單插補就是用某個值(如均值锹安,中位數(shù),眾數(shù)等等)替換缺失值
#缺失值全部填充0
matrix[is.na(matrix)]<-0
#均值倚舀,中位數(shù)叹哭,特定數(shù)填充,用Hmisc中的impute
#因為中文無法識別痕貌,這裡取能識別的一列GDP
library(Hmisc)
matrix$GDP=impute(matrix$GDP, mean) #插補均值
matrix$GDP=impute(matrix$GDP, median) #插補中位數(shù)
matrix$GDP=impute(matrix$GDP, 20.2) #填充特定值
matrix$GDP[is.na(matrix$GDP)] <-mean(matrix$GDP, na.rm=T)#手動插補均值
##ps:R語言中沒有直接求眾數(shù)的函數(shù)风罩,可用sort(table(x))先求頻數(shù)再排序觀察到,再用特定值填充舵稠。
其餘方法超升,以後再補充入宦。附錄圖片來自百度文庫
讀書筆記1(R語言)
很久不用R語言和matlab,這裡重新看書梳理一下R中比較重要的內(nèi)容,方便以後查閱室琢。w3cschool和R語言實戰(zhàn)里的教程也比較詳細乾闰,筆記里沒有細節(jié)部分可以上去查閱。
1 對象的類型和屬性
R的所有對象都有兩個內(nèi)在屬性:類型和長度盈滴。
類型是對象元素的基本種類涯肩,共四種:數(shù)值型(整型,單精度實型雹熬,雙精度實型)宽菜,字符型,復(fù)數(shù)型竿报,邏輯型(FALSE铅乡、TRUE、NA)烈菌。NA表示缺失數(shù)據(jù)(Not Available 所有類型的缺失值都用NA表示)
長度是對象中元素的數(shù)目阵幸。對象的類型和長度可以分別通過mode()和length()得到。
> x<-1;A<-"R language";compar<-TRUE;z<-1i
> mode(x);mode(A);mode(compar);mode(z)
[1] "numeric"
[1] "character"
[1] "logical"
[1] "complex"
> length(x);length(A);length(compar);length(z)
[1] 1
[1] 1
[1] 1
[1] 1
R可以正確地表示無窮的數(shù)值芽世,正無窮/負無窮(Inf/-Inf)例如x <- 8/0那麼x <- Inf挚赊;用NaN(not a number)表示不是數(shù)字的值例如:Inf-Inf或者sqrt(-5)或者0/0
2 對象信息的瀏覽和刪除
ls() 顯示內(nèi)存中的對象名字
ls(pattern = "A")顯示對象名字中包含指定字符的對象,這裡是A
ls(pattern = "^c")以某字母開頭的對象
ls.str()顯示內(nèi)存中所有對象的詳細信息
rm(A)刪除對象A
rm(list =ls())刪除所有對象
清理控制臺:Ctrl + L
運行:Ctrl + R
> ls()
[1] "A" "compar" "x" "z"
> ls(pattern="A")
[1] "A"
> ls(pattern = "c")
[1] "compar"
> ls.str()
A : chr "R language"
compar : logi TRUE
x : num Inf
z : cplx 0+1i
> rm(A)
> ls()
[1] "compar" "x" "z"
> rm(list =ls())
> ls()
character(0)
3 向量對象
數(shù)值型向量對象
在統(tǒng)計分析中济瓢,最為常用的數(shù)值型荠割,可以用以下四種函數(shù)建立:
- seq()或者 “:” #若向量具有較為簡單的規(guī)律
- rep() #若向量具有較為複雜的規(guī)律
- c() #沒有規(guī)律
- scan() #通過鍵盤逐個輸入
例如:
> 1:10
[1] 1 2 3 4 5 6 7 8 9 10
> 1:10-1 #每個元素-1
[1] 0 1 2 3 4 5 6 7 8 9
> 1:(10-1)
[1] 1 2 3 4 5 6 7 8 9
> z <- seq(1,5,by = 0.5) #等價于seq(from = 1, to = 5 ,by = 0.5)
> z
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
> z <- seq(1,10,length = 11) #等價于seq(1,10,length.out = 11) 把1-10拆成11個數(shù)
> z
[1] 1.0 1.9 2.8 3.7 4.6 5.5 6.4 7.3 8.2 9.1 10.0
> z <- rep(2:5,2) #rep(重複對象,重複次數(shù))旺矾,等價于rep(2:5,times = 2)
> z
[1] 2 3 4 5 2 3 4 5
#> rep(1:2,1:2)
#[1] 1 2 2
#重複對象對應(yīng)重複次數(shù)也就是1重複1次蔑鹦,2重複兩次,一一對應(yīng)箕宙,前後隊列應(yīng)該長度相等
#例如:
> rep(1:2,2:3)
[1] 1 1 2 2 2
> z <- rep(2:5,rep(2,4))
> z
[1] 2 2 3 3 4 4 5 5
> z <- rep(1:3,time = 4,each = 2)
> z
[1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3
> z <- x <- c(42,7,64,9)
> z
[1] 42 7 64 9
> z <- scan() #通過鍵盤建立向量嚎朽,手動輸入元素
1: 1
2: 0.1
3: 4.4
4: 222
5: 2.0 3.0 5.2
8:
Read 7 items
> z
[1] 1.0 0.1 4.4 222.0 2.0 3.0 5.2
> z <- sequence(3:5)
> z
[1] 1 2 3 1 2 3 4 1 2 3 4 5
> z <- sequence(c(10,5)) #1到10,1到5
> z
[1] 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5
字符型向量對象
字符串在輸入時使用單引號或者雙引號。如果字符里有引號需要用到轉(zhuǎn)義字符\柬帕,應(yīng)該寫為"哟忍。字符向量可以通過函數(shù)c()連接,函數(shù)paste()可以接受任意個參數(shù)陷寝,并從它們中逐個去出字符并連成字符串锅很,形成的字符串個數(shù)與參數(shù)中最長字符串的長度相同。
默認情況下盼铁,參數(shù)中的字符串是被一個空格分隔的粗蔚,通過修改參數(shù)sep= string,可以更改為其他字符串饶火。
> z <- c("green","blue sky","=88")
> z
[1] "green" "blue sky" "=88"
> labs <- paste(c("X","Y"),1:10,sep=",")
> labs
[1] "X,1" "Y,2" "X,3" "Y,4" "X,5" "Y,6" "X,7" "Y,8" "X,9" "Y,10"
> labs <- paste(c("X","Y"),1:10,sep="")
> labs
[1] "X1" "Y2" "X3" "Y4" "X5" "Y6" "X7" "Y8" "X9" "Y10"
> labs <- paste(c("X","Y"),1:10,sep=" ")
> labs
[1] "X 1" "Y 2" "X 3" "Y 4" "X 5" "Y 6" "X 7" "Y 8" "X 9" "Y 10"
邏輯型向量
共三個TRUE,FALSE和NA
前兩個可簡寫為T和F鹏控,轉(zhuǎn)化為數(shù)字向量是TRUE當做1致扯,F(xiàn)ALSE當做0。
> x <- c(10.4,5.6,3.1,6.8,16.5)
> temp <- x >12
> temp
[1] FALSE FALSE FALSE FALSE TRUE
temp就是一個邏輯型向量
因子型向量
略
數(shù)值型向量的運算
向量可以用於算術(shù)表達式当辐,操作是按照向量中的元素一個一個進行的抖僵。同一個表達式中的向量并不需要具有相同的長度,如果長度不同缘揪,表達式的結(jié)果是一個長度和長向量相同的向量耍群,表達式中較短的向量會根據(jù)它的長度被重複使用若干次(不一定是整數(shù)次),直到與長度最長的向量相匹配找筝,而常數(shù)被不斷重複蹈垢,這被稱為循環(huán)法則。
> x <- c(10.4,5.6,3.1,6.4,21.7)
> y <- c(x,0,x)
> v <- 2*x+y+1
Warning message:
In 2 * x + y :
longer object length is not a multiple of shorter object length(長的對象長度不是短的對象長度的整數(shù)倍)
> v
[1] 32.2 17.8 10.3 20.2 66.1 21.8 22.6 12.8 16.9 50.8 43.5
> y
[1] 10.4 5.6 3.1 6.4 21.7 0.0 10.4 5.6 3.1 6.4 21.7
產(chǎn)生一個長度為11的新向量袖裕,其中2*x被重複2次曹抬,y被重複1次,常數(shù)1倍重複11次急鳄。
向量運算:
(1)向量和一個常數(shù)加減乘除都是對向量中每個元素進行的谤民,乘方(^)開方(sqrt)也一樣,另外log,exp,sin,cos,tan等普通運算函數(shù)同樣適用
(2)同樣長度向量的基本運算為對應(yīng)元素進行相應(yīng)運算
(3)不同長度的向量加減乘除遵從循環(huán)法則疾宏,但是要注意這種情況通常要求向量的長度為倍數(shù)關(guān)係张足,否則會出現(xiàn)上面的警告
> 1:2 + 1:4
[1] 2 4 4 6
> 1:4 + 1:7
[1] 2 4 6 8 6 8 10
Warning message:
In 1:4 + 1:7 :
longer object length is not a multiple of shorter object length
4 常用統(tǒng)計函數(shù)
具體見R語言實戰(zhàn)第五章,有圖表
向量的下標和子集的提取
(1)正整數(shù)向量坎藐,提取對應(yīng)元素为牍。
(2)負整數(shù)向量,去掉向量中與索引向量對應(yīng)的元素岩馍。
(3)字符串向量吵聪,這種可能性只存在于擁有names屬性的向量。(類似python中的字典兼雄,java中的哈希表)
(4)邏輯向量,去除滿足條件的元素帽蝶。取出所有返回值為TRUE的元素赦肋。
#(1)取
> x <- c(4,2,3,5,3,7)
> x[1:4]
[1] 4 2 3 5
> y <- x[c(1,3)]
> y
[1] 4 3
#(2)去
> y <- x[-(1:4)]
> y
[1] 3 7
#(3)
> fruit <- c(50,80,10,30)
> names(fruit)<-c("orange","banana","apple","peach")
> fruit
orange banana apple peach
50 80 10 30
> lunch <- fruit[c("apple","orange")]
> lunch
apple orange
10 50
(4)邏輯向量
> x <- c(50,20,30,56)
> x>30
[1] TRUE FALSE FALSE TRUE
> x[x>30]
[1] 50 56
> x[x<50&x>30]
numeric(0) #因為沒有符合條件的數(shù),所以顯示狀態(tài)
> x[x>30]<-28
> x
[1] 28 20 30 28
> y = runif(100,min = 0,max = 1)##在(0,1)上100個均勻分佈隨機數(shù)
> sum(y<0.5)#值小於0.5的元素的個數(shù)
[1] 53
> sum(y[y<0.5])#值小於0.5的元素之和
[1] 12.86025
> y <- x[!is.na(x)] #x中的非缺失值
> z <- x[(!is.na(x))&(x>0)]
> y
[1] 28 20 30 28
> z
[1] 28 20 30 28
5 數(shù)組與矩陣對象
數(shù)組的建立
R中的數(shù)組由函數(shù)array()建立励稳,其一般格式為
> array(data,dim,dimnames)
其中data為向量佃乘,其元素用來構(gòu)建數(shù)組,dim為數(shù)組的維數(shù)驹尼,dimnames為各維的名稱趣避,缺省為空。