1 缺失值处理
对于获取到的数据,总会有一些是缺少的,如果这些缺少的数据对于我们的接下来的工作无关紧要,就可以直接舍弃;而有作用的就要应该补齐。我们使用一些电影数据来说明接下来的操作,先看看电影数据的结构
import pandas as pd
# 读取电影数据
movie = pd.read_csv("data/IMDB/IMDB-Movie-Data.csv")
index | Rank | Title | Genre | Description | Director | Actors | Year | Runtime (Minutes) | Rating Votes | Revenue (Millions) | Metascore |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Guardians of the Galaxy | Action,Adventure,Sci-Fi | A group of intergalactic criminals are forced … | James Gunn | Chris Pratt, Vin Diesel, Bradley Cooper, Zoe S… | 2014 | 121 | 8.1 | 757074 | 333.13 76. |
1.1 判断缺失值
首先判断是否空缺值
pd.notnull(movie) # 这个函数会把NaN的数值返回False,非NaN的数值返回True
pd.isnull(movie).head(10) # 这个函数会把NaN的数值返回True,非NaN的数值返回False
1.2 丢弃缺失值
对于不重要的数据可以直接舍弃
movie.size
# 12000
movie = movie.dropna() # 丢弃空缺的数据行
movie.size
# 10056
丢弃之后数量从12000变成了10056
1.3 替换缺失值
通常情况下缺失的只是一组数据的一小部分,这时候丢弃就是非常浪费的了,同时如果这组数据比较重要,那么丢弃就不可取,而是使用替换。
替换可以用中位数、众数、均值等替换,或者回归方程,最近值、固定值替换,高级一点可以使用拉 格朗日插值法和牛顿插值法
import numpy as np
# 读取电影数据
movie = pd.read_csv("data/IMDB/IMDB-Movie-Data.csv")
np.any(pd.isnull(movie))
# True
# ①判断哪一列有缺失值
for col in movie.columns:
# pd.isnull(movie[col])将当前列的缺失值转换为True,any()判断数组中是否至少有一个为True,是就返回True
if (np.any(pd.isnull(movie[col]))):
# 使用fillna()来填充缺失值,第一个参数的替换后的值,inplace参数表示是否修改原数据
movie[col].fillna(movie[col].mean(), inplace=True)
np.any(pd.isnull(movie)) # 可以看到在变换之后any返回为False,说明已经没有缺失值了
# False
1.4 当缺失值不为NaN的时候
把它替换成NaN,如下面这组缺失值为?的数据
wis = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data")
·····
22 1057013 8 4 5 1 2 ? 7 3 1 4
·····
这种情况下用any有缺失值但是不是NaN所以判断不出来
np.any(pd.isnull(wis)) #
False
那么,就先替换掉这个?,变成NaN
# 如果缺失值不是np.NaN 首先替换成nan
wis = wis.replace(to_replace='?', value=np.NAN)
np.any(pd.isnull(wis)) # 再次查看是否有缺失值
True # 可以看到现在是有缺失值的
接下来在进行其他缺失值操作
2 数据的离散化
- 离散化的概念
- 把连续的数据 分成几段, 处于某一段中的所有数据 忽略他们之间的区别
- 离散化的作用
- ① 可以降低数据属性的个数
- ② 可以是数据稳定性更强
- ③ 可以降低异常值对结果的影响
- ④有一些算法 更适合处理离散的值 比如逻辑回归
案例:股票的涨跌幅离散化
我们对股票每日的”p_change”进行离散化
先看看数据
data = pd.read_csv("data/stock_day/stock_day.csv")
p_change= data['p_change'