《Python数据分析与挖掘实战》学习笔记之数据离散化

数据离散化

1、等宽离散化:将属性的值域分为具有相同宽度的区间。

        采用pandas.cut()函数,cut有三个参数,第一个是数据,第二个参数表示分为k份,第三个参数为标签labels。

 pandas.cut(data,3,labels=["便宜","适中","贵"])#将数据data分为3等份,标签为便宜、适中、贵

如:

 2、等频率离散化:将相同数据的记录放进每个区间 ①求分位数②cut函数

     过程主要将k份的分位数求出来,dataframe可以用describe函数求,属性采用percentile就可以了。列表可以用numpy的percentile来求。比如np.percentile(data,75)是求四分位数(3/4)。

  ①dataframe结构

  #k为分的份数,w作为分位数,可以运用dataframe.describe(percentiles=w)来计算分位数

  w=[ i/k for i in range(k+1)]

  w=data.describe (percentiles=w) [ 4:4+k+1] #取几个分位数的值作为不等长列表,用于cut函数

  d2=pd.cut(data,w,labels=range(k))

  ②列表、数组结构

  #用np.percentile(data,百分比)来求

  temp=[ i/k*100 for i in range(k+1)]

  w=[ ]

  for item in temp:

    w.append(np.percentile(data,item))

  d3=pd.cut(data,w,labels=range(k))

3、一维聚类离散化:先聚类(如k-means),然后对每一类的连续值进行标记。

 ①k-means求聚类中心,并排序,将相邻两项的中点作为边界点,把首末边界点加上,整合成w列表②cut函数

import pandas as pd
import numpy as np

datafile = r'E:\data\chapter4\demo\data\discretization_data.xls' #文件路径
data = pd.read_excel(datafile) #读取数据
data = data[u'肝气郁结证型系数'].copy() #复制数据
k = 4 #分类数

d1 = pd.cut(data, k, labels = range(k)) #等宽离散化,各个类别依次命名为,1,2,3 保存的是index 的分类

#等频离散化
w = [1.0*i/k for i in range(k+1)]  #创建一个列表,确定分位数0%,25%,50%,75%,100%
w=data.describe(percentiles=w)[4:4+k+1] #利用describe函数计算分位数,取出分位数
w[0]=w[0]*(1-1e-10)  #保证小于最小值
d2=pd.cut(data,w,labels=range(k)) 

from sklearn.cluster import KMeans #引入KMeanms

kmodel = KMeans(n_clusters = k, n_jobs = 4) #建立模型,簇数为k,n_jobs一般为CPU数
kmodel.fit(data.values.reshape((len(data),1))) #训练模型
c = pd.DataFrame(kmodel.cluster_centers_).sort_values(0) #输出聚类中心,并且排序
w = c.rolling(2).mean().iloc[1:] #用滑动窗口求均值的方法求相邻两项求中点,作为边界点
w = [0] + list(w[0]) + [data.max()] #把首末边界点加上
d3 = pd.cut(data, w, labels = range(k))

def cluster_plot(d, k): #自定义作图函数来显示聚类结果
	import matplotlib.pyplot as plt
	plt.rcParams['font.sans-serif'] = ['SimHei'] #用来显示中文标签
	plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号

	plt.figure(figsize = (8, 3)) #图的大小
	for j in range(0,  k):
		plt.plot(data[d==j], [j for i in d[d==j]], 'o')

	plt.ylim(-0.5, k-0.5)
	return plt

cluster_plot(d1, k).show()
cluster_plot(d2, k).show()
cluster_plot(d3, k).show()

程序运行结果:

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值