python3数据分析的数据规范化与离散化
整理自(数据分析与挖掘和其他地方)
有时候处理数据的时候会出现过大或者单位不一样,我们可以利用以下方法实现数据规范化:
#数据规范化 import pandas as pd import numpy as np import sys dd = 'll/normalization_data.xls' data = pd.read_excel(dd,header=None) # 0 1 2 3 # 0 78 521 602 2863 # 1 144 -600 -521 2245 # 2 95 -457 468 -1283 # 3 69 596 695 1054 # 4 190 527 691 2051 # 5 101 403 470 2487 # 6 146 413 435 2571 #最小-最大值 dd = (data - data.min()) / (data.max() - data.min()) #零-均值 dd = (data - data.mean())/data.std() #小数定标 dd = data/10**np.ceil(np.log10(data.abs().max())) # data = np.array(data) dd = data/data[0,:] * 100 print(pd.DataFrame(dd))
有一些数据是连续的 我们有时候需要做离散也就是分段处理,可以使用如下代码:
# -*- coding: utf-8 -*- # 数据规范化 import pandas as pd from sklearn.cluster import KMeans # 引入KMeans import matplotlib.pyplot as plt import sys def cluster_plot(d, k, data): # 自定义作图函数来显示聚类结果 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 def do(): datafile = 'll/discretization_data.xls' # 参数初始化 data = pd.read_excel(datafile) # 读取数据 ''' 肝气郁结证型系数 0 0.026 1 0.033 2 0.034 3 0.041 4 0.042 5 0.042 6 0.045 7 0.045 8 0.049 9 0.049 10 0.053 11 0.054 12 0.055 13 0.056 14 0.057 15 0.083 16 0.085 17 0.087 18 0.087 19 0.089 20 0.089 21 0.089 22 0.091 23 0.092 24 0.092 25 0.093 26 0.094 27 0.094 28 0.095 29 0.097 .. ... 900 0.400 901 0.400 902 0.408 903 0.411 904 0.411 905 0.415 906 0.415 907 0.417 908 0.417 909 0.417 910 0.418 911 0.420 912 0.424 913 0.425 914 0.426 915 0.427 916 0.429 917 0.432 918 0.432 919 0.432 920 0.433 921 0.435 922 0.439 923 0.448 924 0.456 925 0.474 926 0.487 927 0.488 928 0.488 929 0.504 ''' data = data[u'肝气郁结证型系数'].copy() k = 4 # 等宽离散化,各个类比依次命名为0,1,2,3 d1 = pd.cut(data, k, labels=range(k)) # 等频率离散化 w = [1.0 * i / k for i in range(k + 1)] 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)) #聚类分析 kmodel = KMeans(n_clusters=k, n_jobs=4) # 建立模型,n_jobs是并行数,一般等于CPU数较好 kmodel.fit(data.reshape((len(data), 1))) # 训练模型 c = pd.DataFrame(kmodel.cluster_centers_).sort_values(0) # 输出聚类中心,并且排序(默认是随机序的) w = pd.rolling_mean(c, 2).iloc[1:] # 相邻两项求中点,作为边界点 w = [0] + list(w[0]) + [data.max()] # 把首末边界点加上 d3 = pd.cut(data, w, labels=range(k)) cluster_plot(d1, k, data).show() cluster_plot(d2, k, data).show() cluster_plot(d3, k, data).show() if __name__=='__main__': do()