数据预处理(python&R)&读书笔记1(R語言):

python部分

1.缺失值处理:

##pandas中读取文件时: xlsx不容易出现编码错误
csv文件可以先用df读取在存成xlsx操作,如果读取csv文件在存成csv文件容易出现编码错误

##另外如果是文本文件,读取时用Python strip() 方法移除字符串头尾指定的字符(默认为空格)。否则切词以后结果可能带有大量的空格和换行。

pandas的數據框中缺失值會用NaN(Not a Number)表示


數據.png
import pandas as pd
df = pd.read_csv('Demand.csv',encoding='gbk')
數據2.png

如果DataFrame对象包含的数据很多,人工来查找NaN就不现实了。我们可以使用isnull方法来返回一个值为布尔类型的DataFrame,判断每个元素是否缺失,如果元素缺失,值为True。然后使用sum方法,我们就能得到DataFrame中每一列的缺失值个数。

df.isnull().sum()
缺失值个数.png

ps:由DataFrame數據框很容易得到NumPy数组,直接通过values属性即可,然后就可以用sklearn中的算法了:


數據轉換.png

1.直接刪除帶有缺失值的特征

刪除行.png
刪除列.png

dropna方法包含多个参数,這裡介紹三個:

##去掉所有值為NaN的行,默認為how ='any'
df.dropna(how ='all')
##留下五個以上非缺失值的行/去掉五個以下非缺失值的行
df.dropna(thresh = 5)
#按照“content”列中的空白部分来删除对应的行
df.dropna(subset=["content"])
thresh

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.正则表达式的一些例子(方便以后查阅)

正则.png

R部分

缺失值处理:

#讀入文件
> setwd("C:/Users/CuiShan/Desktop/aaa")
> getwd()
[1] "C:/Users/CuiShan/Desktop/aaa"
>matrix = read.csv("Demand.csv")
數據.png
#需要用到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)
aggr1
aggr2

aggr3
##淺色表示值小,深色表示值大,紅色為缺失值
matrixplot(matrix)
##另外還有marginplot()等等不做演示
matrixplot

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%。

按列刪

按行刪
刪除所有含有缺失值的行列
刪除缺失值達到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))先求频数再排序观察到,再用特定值填充。
插入0.png
均值填充1

均值填充2

其餘方法,以後再補充。附錄圖片來自百度文庫


附錄

读书笔记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 向量對象

數值型向量對象

在統計分析中,最為常用的數值型,可以用以下四種函數建立:

  1. seq()或者 “:” #若向量具有較為簡單的規律
  2. rep() #若向量具有較為複雜的規律
  3. c() #沒有規律
  4. 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為各維的名稱,缺省為空。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335