php是最好的语言

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()


作者:xTao 分类:LNMP 浏览:2472 评论:0