python r语言rep_数据预处理(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

#直接刪除缺失值過多的特征(列)或者實例(行)缺失值个数大于列数的20%

>matrix2

>sum(!complete.cases(matrix2)) #再次查看結果(個數6,刪除了一行)

其中,函数manyNAs(x,nORp)用来查找数据框x中缺失值過多(≥缺失比例nORp)的行,nORp默认为0.2,即缺失值个数≥列数的20%。

按列刪

按行刪

刪除所有含有缺失值的行列

刪除缺失值達到20%的行

ps:

x

mean(x)#默认不忽略NA值或NaN值,注意与NULL的区别

[1] NA

mean(x,na.rm=TRUE)#忽略缺失值

[1] 2.75

#簡單插補就是用某個值(如均值,中位數,眾數等等)替換缺失值

#缺失值全部填充0

matrix[is.na(matrix)]

#均值,中位數,特定數填充,用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)]

##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

> 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

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

> z

[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0

> z

> 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

> 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

> z

[1] 2 2 3 3 4 4 5 5

> z

> 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

> z

[1] 42 7 64 9

> z

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

> z

[1] 1 2 3 1 2 3 4 1 2 3 4 5

> z

> z

[1] 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5

字符型向量對象

字符串在輸入時使用單引號或者雙引號。如果字符里有引號需要用到轉義字符\,應該寫為"。字符向量可以通過函數c()連接,函數paste()可以接受任意個參數,并從它們中逐個去出字符并連成字符串,形成的字符串個數與參數中最長字符串的長度相同。

默認情況下,參數中的字符串是被一個空格分隔的,通過修改參數sep= string,可以更改為其他字符串。

> z

> z

[1] "green" "blue sky" "=88"

> labs

> labs

[1] "X,1" "Y,2" "X,3" "Y,4" "X,5" "Y,6" "X,7" "Y,8" "X,9" "Y,10"

> labs

> labs

[1] "X1" "Y2" "X3" "Y4" "X5" "Y6" "X7" "Y8" "X9" "Y10"

> labs

> 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

> temp 12

> temp

[1] FALSE FALSE FALSE FALSE TRUE

temp就是一個邏輯型向量

因子型向量

數值型向量的運算

向量可以用於算術表達式,操作是按照向量中的元素一個一個進行的。同一個表達式中的向量并不需要具有相同的長度,如果長度不同,表達式的結果是一個長度和長向量相同的向量,表達式中較短的向量會根據它的長度被重複使用若干次(不一定是整數次),直到與長度最長的向量相匹配,而常數被不斷重複,這被稱為循環法則。

> x

> y

> v

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

> x[1:4]

[1] 4 2 3 5

> y

> y

[1] 4 3

#(2)去

> y

> y

[1] 3 7

#(3)

> fruit

> names(fruit)

> fruit

orange banana apple peach

50 80 10 30

> lunch

> lunch

apple orange

10 50

(4)邏輯向量

> x

> x>30

[1] TRUE FALSE FALSE TRUE

> x[x>30]

[1] 50 56

> x[x<50&x>30]

numeric(0) #因為沒有符合條件的數,所以顯示狀態

> x[x>30]

> 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

> z 0)]

> y

[1] 28 20 30 28

> z

[1] 28 20 30 28

5 數組與矩陣對象

數組的建立

R中的數組由函數array()建立,其一般格式為

> array(data,dim,dimnames)

其中data為向量,其元素用來構建數組,dim為數組的維數,dimnames為各維的名稱,缺省為空。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值