一.高级处理——数据离散化
学习目标
- 目标
- 应用cut、qcut实现数据的区间分组
- 应用get_dummies实现数据的one-hot编码
- 应用
- 找出股票的涨跌幅异动(异常)值
1 为什么要离散化
连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。
2 什么是数据的离散化
连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数 值代表落在每个子区间中的属性值。
离散化有很多种方法,这使用一种最简单的方式去操作
- 原始人的身高数据:165,174,160,180,159,163,192,184
- 假设按照身高分几个区间段:150~165, 165180,180195
这样我们将数据分到了三个区间段,我可以对应的标记为矮、中、高三个类别,最终要处理成一个"哑变量"矩阵
3 股票的涨跌幅离散化
我们对股票每日的"p_change"进行离散化
3.1 读取股票的数据
先读取股票的数据,筛选出p_change数据
data = pd.read_csv("./data/stock_day.csv")
p_change= data['p_change']
3.2 将股票涨跌幅数据进行分组
使用的工具:
- pd.qcut(data, bins):
- 对数据进行分组将数据分组 一般会与value_counts搭配使用,统计每组的个数
- series.value_counts():统计分组次数
# 自行分组
qcut = pd.qcut(p_change, 10)
# 计算分到每个组数据个数
qcut.value_counts()
自定义区间分组:
- pd.cut(data, bins)
# 自己指定分组区间
bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100]
p_counts = pd.cut(p_change, bins)
3.3 股票涨跌幅分组数据变成one-hot编码
- 什么是one-hot编码
把每个类别生成一个布尔列,这些列中只有一列可以为这个样本取值为1.其又被称为热编码。
把下图中左边的表格转化为使用右边形式进行表示:
- pandas.get_dummies(data, prefix=None)
- data:array-like, Series, or DataFrame
- prefix:分组名字
# 得出one-hot编码矩阵
dummies = pd.get_dummies(p_counts, prefix="rise")
4 小结
- 数据离散化【知道】
- qcut、cut实现数据分组【知道】
- get_dummies实现哑变量矩阵【知道】
二.案例实现
数据离散化处理
In [17]:
data = pd.read_csv("./data/stock_day.csv")
In [18]:
data_p = data["p_change"]
In [19]:
data_p.head()
Out[19]:
2018-02-27 2.68
2018-02-26 3.02
2018-02-23 2.42
2018-02-22 1.64
2018-02-14 2.05
Name: p_change, dtype: float64
In [20]:
# help(pd.qcut)
In [21]:
qcut = pd.qcut(data_p,q=10)
In [22]:
qcut
Out[22]:
2018-02-27 (1.738, 2.938]
2018-02-26 (2.938, 5.27]
2018-02-23 (1.738, 2.938]
2018-02-22 (0.94, 1.738]
2018-02-14 (1.738, 2.938]
...
2015-03-06 (5.27, 10.03]
2015-03-05 (1.738, 2.938]
2015-03-04 (0.94, 1.738]
2015-03-03 (0.94, 1.738]
2015-03-02 (1.738, 2.938]
Name: p_change, Length: 643, dtype: category
Categories (10, interval[float64]): [(-10.030999999999999, -4.836] < (-4.836, -2.444] < (-2.444, -1.352] < (-1.352, -0.462] ... (0.94, 1.738] < (1.738, 2.938] < (2.938, 5.27] < (5.27, 10.03]]
In [23]:
bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100]
cut_r = pd.cut(data_p,bins = bins)
In [24]:
count = cut_r.value_counts()
In [25]:
count
Out[25]:
(0, 3] 215
(-3, 0] 188
(3, 5] 57
(-5, -3] 51
(5, 7] 35
(7, 100] 35
(-100, -7] 34
(-7, -5] 28
Name: p_change, dtype: int64
In [29]:
# help( pd.get_dummies)
# get_dummies 是利用pandas实现one hot encode的方式。
# pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False)[source]
# 例子:
#import pandas as pd
# df = pd.DataFrame([
# ['green' , 'A'],
# ['red' , 'B'],
# ['blue' , 'A']])
# df.columns = ['color', 'class']
# pd.get_dummies(df)
get_dummies 前:
get_dummies 后:
将指定列进行get_dummies 后合并到元数据中
df = df.join(pd.get_dummies(df.color)
In [30]:
data_dummies = pd.get_dummies(count,prefix="best")
In [31]:
data_dummies
Out[31]:
best_28 | best_34 | best_35 | best_51 | best_57 | best_188 | best_215 | |
(0, 3] | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
(-3, 0] | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
(3, 5] | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
(-5, -3] | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
(5, 7] | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
(7, 100] | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
(-100, -7] | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
(-7, -5] | 1 | 0 | 0 | 0 | 0 | 0 | 0 |