python部分
1.缺失值处理:
##pandas中读取文件时: xlsx不容易出现编码错误
csv文件可以先用df读取在存成xlsx操作,如果读取csv文件在存成csv文件容易出现编码错误
##另外如果是文本文件,读取时用Python strip() 方法移除字符串头尾指定的字符(默认为空格)。否则切词以后结果可能带有大量的空格和换行。
pandas的數據框中缺失值會用NaN(Not a Number)表示
import pandas as pd
df = pd.read_csv('Demand.csv',encoding='gbk')
如果DataFrame对象包含的数据很多,人工来查找NaN就不现实了。我们可以使用isnull方法来返回一个值为布尔类型的DataFrame,判断每个元素是否缺失,如果元素缺失,值为True。然后使用sum方法,我们就能得到DataFrame中每一列的缺失值个数。
df.isnull().sum()
ps:由DataFrame數據框很容易得到NumPy数组,直接通过values属性即可,然后就可以用sklearn中的算法了:
1.直接刪除帶有缺失值的特征
dropna方法包含多个参数,這裡介紹三個:
##去掉所有值為NaN的行,默認為how ='any'
df.dropna(how ='all')
##留下五個以上非缺失值的行/去掉五個以下非缺失值的行
df.dropna(thresh = 5)
#按照“content”列中的空白部分来删除对应的行
df.dropna(subset=["content"])
2.插入值
插入值有很多方法:例如拉格朗日插值法,用於分類的數據可以用smote算法生成樣本,最常用的是均值插入或者中位數插入。
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类能很容易实现此方法:
先介紹一下主要參數
missing_values:缺失值,可以为整数或NaN(缺失值numpy.nan用字符串‘NaN’表示),默认为NaN
strategy:替换策略,字符串,默认用均值‘mean’替换
①若为mean时,用特征列的均值替换
②若为median时,用特征列的中位数替换
③若为most_frequent时,用特征列的众数替换
axis:指定轴数,默认axis=0代表列,axis=1代表行
copy:设置为True代表不在原数据集上修改,设置为False时,就地修改,存在如下情况时,即使设置为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)
先计算每一列的平均值,然后用相应列的平均值来替换NaN。如果将参数axis=0改为axis=1,则会计算每个样本的所有特征(行)的平均值。
這個數據最後一行只有一格數,應該先用上面的方法刪除最後一行,再做填充。
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)) #计算数据集中的缺失值总数
> sum(complete.cases(matrix)) #统计数据集中完整样本的个数(即縮小矩陣到max(a*b)以後可以為一個完整的矩陣)
1.識別缺失值
#函數is.na(),is.nan()和is.infinite()可以分別用來識別缺失值、不可能值、無窮值。
#返回結果為TRUE或FALSE,這個不做演示了
#列出沒有缺失值的行
matrix[complete.cases(matrix), ]
#列出有一個或多個缺失值的行
matrix[!complete.cases(matrix),]
#由於邏輯值TRUE和FALSE分別等價于數值1和0,
#可用sum()和mean()函數來獲取關於缺失值數據的有用信息。
sum(is.na(matrix$GDP))
mean(is.na(matrix$GDP))
mean(!complete.cases(matrix))#0.4375
#可以通过md.pattern()获取缺失值的分布情况(mice包),
#其中1表示没有缺失数据,0表示存在缺失数据,最后一行给出了每个变量中缺失值的数目:
> library(mice)
> md.pattern(matrix)
##第一行代表無缺失值的模型,
#第二行代表一個缺失值(以此類推,如果沒有則跳過),
#最後一列代表該模式缺失值的個數,第一列表示各缺失值模式的實例個數,
#例如:第一列為9511,9就表示無缺失值的實例(行)個數有9個,
#5就表示有一個缺失值的的實例(行)個數有1個
2.缺失值可視化
##因為不能顯示中文,所以縱坐標只有一個GDP正常顯示
##第一張圖可以看出除了第一項是全的,每項都缺失至少一個,
##倒數第二項缺了7個
##第二張圖,說明有9行沒有缺失值,有5行有一個缺失值,
#有1行有兩個缺失值,有1行有10個缺失值
#對應上面的md.pattern(matrix)顯示的9511
aggr(matrix,prop=FALSE,numbers=TRUE)
##prop=TRUE,用比例代替計數
aggr(matrix,prop=TRUE,numbers=TRUE)
##消去數值型標籤numbers=FALSE位默認值
aggr(matrix,prop=TRUE,numbers=FALSE)
##淺色表示值小,深色表示值大,紅色為缺失值
matrixplot(matrix)
##另外還有marginplot()等等不做演示
3直接刪除&簡單插補
#直接刪除有缺失值的列、行
a = t(na.omit(t(matrix)))#列
b = t(na.omit(matrix))#行
#或者用DMwR包實現
> library(VIM)
> library(DMwR)
>sum(!complete.cases(matrix))#查看含有缺失值的樣本個數(個數為7)
#直接刪除所有含有缺失值的行列
>matrix1<-na.omit(matrix)
#直接刪除缺失值過多的特征(列)或者實例(行)缺失值个数大于列数的20%
>matrix2<-matrix[-manyNAs(matrix,0.2),]#数据框的“删除行”操作
>sum(!complete.cases(matrix2)) #再次查看結果(個數6,刪除了一行)
其中,函数manyNAs(x,nORp)用来查找数据框x中缺失值過多(≥缺失比例nORp)的行,nORp默认为0.2,即缺失值个数≥列数的20%。
ps:
x<-c(1,2,3,NA,5)
mean(x)#默认不忽略NA值或NaN值,注意与NULL的区别
[1] NA
mean(x,na.rm=TRUE)#忽略缺失值
[1] 2.75
#簡單插補就是用某個值(如均值,中位數,眾數等等)替換缺失值
#缺失值全部填充0
matrix[is.na(matrix)]<-0
#均值,中位數,特定數填充,用Hmisc中的impute
#因為中文無法識別,這裡取能識別的一列GDP
library(Hmisc)
matrix$GDP=impute(matrix$GDP, mean) #插补均值
matrix$GDP=impute(matrix$GDP, median) #插补中位数
matrix$GDP=impute(matrix$GDP, 20.2) #填充特定值
matrix$GDP[is.na(matrix$GDP)] <-mean(matrix$GDP, na.rm=T)#手动插补均值
##ps:R语言中没有直接求众数的函数,可用sort(table(x))先求频数再排序观察到,再用特定值填充。
其餘方法,以後再補充。附錄圖片來自百度文庫
读书笔记1(R語言)
很久不用R語言和matlab,這裡重新看書梳理一下R中比較重要的內容,方便以後查閱。w3cschool和R語言實戰里的教程也比較詳細,筆記里沒有細節部分可以上去查閱。
1 對象的類型和屬性
R的所有對象都有兩個內在屬性:類型和長度。
類型是對象元素的基本種類,共四種:數值型(整型,單精度實型,雙精度實型),字符型,復數型,邏輯型(FALSE、TRUE、NA)。NA表示缺失數據(Not Available 所有類型的缺失值都用NA表示)
長度是對象中元素的數目。對象的類型和長度可以分別通過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可以正確地表示無窮的數值,正無窮/負無窮(Inf/-Inf)例如x <- 8/0那麼x <- Inf;用NaN(not a number)表示不是數字的值例如:Inf-Inf或者sqrt(-5)或者0/0
2 對象信息的瀏覽和刪除
ls() 顯示內存中的對象名字
ls(pattern = "A")顯示對象名字中包含指定字符的對象,這裡是A
ls(pattern = "^c")以某字母開頭的對象
ls.str()顯示內存中所有對象的詳細信息
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 向量對象
數值型向量對象
在統計分析中,最為常用的數值型,可以用以下四種函數建立:
- seq()或者 “:” #若向量具有較為簡單的規律
- rep() #若向量具有較為複雜的規律
- c() #沒有規律
- 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個數
> 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(重複對象,重複次數),等價于rep(2:5,times = 2)
> z
[1] 2 3 4 5 2 3 4 5
#> rep(1:2,1:2)
#[1] 1 2 2
#重複對象對應重複次數也就是1重複1次,2重複兩次,一一對應,前後隊列應該長度相等
#例如:
> 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
字符型向量對象
字符串在輸入時使用單引號或者雙引號。如果字符里有引號需要用到轉義字符\,應該寫為"。字符向量可以通過函數c()連接,函數paste()可以接受任意個參數,并從它們中逐個去出字符并連成字符串,形成的字符串個數與參數中最長字符串的長度相同。
默認情況下,參數中的字符串是被一個空格分隔的,通過修改參數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,轉化為數字向量是TRUE當做1,FALSE當做0。
> x <- c(10.4,5.6,3.1,6.8,16.5)
> temp <- x >12
> temp
[1] FALSE FALSE FALSE FALSE TRUE
temp就是一個邏輯型向量
因子型向量
略
數值型向量的運算
向量可以用於算術表達式,操作是按照向量中的元素一個一個進行的。同一個表達式中的向量并不需要具有相同的長度,如果長度不同,表達式的結果是一個長度和長向量相同的向量,表達式中較短的向量會根據它的長度被重複使用若干次(不一定是整數次),直到與長度最長的向量相匹配,而常數被不斷重複,這被稱為循環法則。
> 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(長的對象長度不是短的對象長度的整數倍)
> 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
產生一個長度為11的新向量,其中2*x被重複2次,y被重複1次,常數1倍重複11次。
向量運算:
(1)向量和一個常數加減乘除都是對向量中每個元素進行的,乘方(^)開方(sqrt)也一樣,另外log,exp,sin,cos,tan等普通運算函數同樣適用
(2)同樣長度向量的基本運算為對應元素進行相應運算
(3)不同長度的向量加減乘除遵從循環法則,但是要注意這種情況通常要求向量的長度為倍數關係,否則會出現上面的警告
> 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 常用統計函數
具體見R語言實戰第五章,有圖表
向量的下標和子集的提取
(1)正整數向量,提取對應元素。
(2)負整數向量,去掉向量中與索引向量對應的元素。
(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) #因為沒有符合條件的數,所以顯示狀態
> x[x>30]<-28
> x
[1] 28 20 30 28
> y = runif(100,min = 0,max = 1)##在(0,1)上100個均勻分佈隨機數
> sum(y<0.5)#值小於0.5的元素的個數
[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 數組與矩陣對象
數組的建立
R中的數組由函數array()建立,其一般格式為
> array(data,dim,dimnames)
其中data為向量,其元素用來構建數組,dim為數組的維數,dimnames為各維的名稱,缺省為空。