数据蛙数据分析每周作业Python时空大数据呆鸟的Python数据分析

数据分析实战二——清洗数据

2020-06-11  本文已影响0人  粉红狐狸_dhf

今日食餐

import os 
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import matplotlib.pyplot as plt

import pywt
from scipy.interpolate import lagrange
from scipy.io import loadmat  # mat是MATLAB的专用格式,调用loadmat方法读取
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

1 lagrange填充空值

可视化的理解
公式推导

path = os.getcwd()
inputfile = path + '/chapter4/data/catering_sale.xls'
outputfile = path + '/tmp/tmp4/sales.xls'

data = pd.read_excel(inputfile)
data.head()
360截图18430704113413.png
data[(data['销量'] < 400) | (data['销量'] > 5000)] = None

def ployinterp_column(index, df, k=5):
    y = df[list(range(index - k, index))
            + list(range(index + 1, index + 1 + k))]
    y = y[y.notnull()]
    #取空值数据周围12个非空数据为已知数样本
    
    return lagrange(y.index, list(y))(index)

y.index:已有数据的x。list(y):已有数据的y。 index:要插入的x 的值。

df = data[data['销量'].isnull()] #销量为空值的数据

index_list = df['销量'].index #销量为空值的数据的索引

for index in index_list:
    data.loc[index,'销量']= ployinterp_column(index, data['销量'])

data.to_excel(outputfile)

2规范化处理

(1)不同规范化处理方法的选择

(2)preprocessing.scale 与 preprocessing.StandardScaler

使用sklearn.preprocessing.StandardScaler类,使之fit(X_Train)

datafile = path + '/chapter4/data/normalization_data.xls'
data = pd.read_excel(datafile, header=None)
#指定作为列名的行,默认0,即取第一行,数据为列名行以下的数据;
#若数据不含列名,则设定 header = None;
data.head()
360截图18430702597672.png
print('最大最小规范化')
print((data - data.min()) / (data.max() - data.min()))

print('零均值规范化')
print((data - data.mean()) / data.std()) #按列标准化

print('单列')
print((data.iloc[:,0] - data.iloc[:,0].mean()) / data.iloc[:,0].std())
360截图1624122095136134.png
from  sklearn import preprocessing
print('\n  sklearn-preprocessing.scale')
data_scale=preprocessing.scale(data)
#在SciKit-Learn中的preprocessing.scale()可以直接将给定数据进行Z-Score规范化。按列标注化
print(data_scale,'\n')
print(data_scale.mean(axis=0))
print(data_scale.std(axis=0))#默认按行计算
360截图18500828194268.png
print('\n小数定标规范化')
#np.ceil返回大于等于该值的最小整数,np.log10计算最高位是几位数,log10(100)=2
#通过移动小数点的位置来进行规范化。小数点移动的位数取决于该属性数据取值的最大绝对值。
print(data / 10**np.ceil(np.log10(data.abs().max())))
360截图18430710251424.png

3 聚类

datafile = path + '/chapter4/data/discretization_data.xls'
data = pd.read_excel(datafile)
data.head()
360截图17001019102137115.png
data = data['肝气郁结证型系数'].copy()
k = 4
方法一 直接对数组进行分类--分箱等距
d1 = pd.cut(data, k, labels=range(k))
方法二: 等频率离散化
w = [1.0 * i / k for i in range(k + 1)]
# percentiles表示特定百分位数,同四分位数
w = data.describe(percentiles=w)[4:4 + k + 1]
#取几个分位数的值作为不等长列表,用于cut函数
w[0] = w[0] * (1 - 1e-10)
d2 = pd.cut(data, w, labels=range(k))
方法三: 使用Kmeans
kmodel = KMeans(n_clusters=k, n_jobs=4)
kmodel.fit(data.values.reshape(len(data), 1))

# 输出聚类中心,并且排序
c = DataFrame(kmodel.cluster_centers_).sort_values(0)

# 相邻两项求中点,作为边界点
w = DataFrame.rolling(c, 2).mean().iloc[1:]
# 加上首末边界点
w = [0] + list(w[0]) + [data.max()]
d3 = pd.cut(data, w, labels=range(k))
def cluster_plot(d, k):
    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()

print('d1等距\n',d1[:5])
print('d2百分位\n',d2[:5])
print('d3聚类\n',d3[:5])
360截图17970217292761.png

4利用PCA计算特征向量,用于降维分析

PCA(Principal Component Analysis,主成分分析)。降维致力于解决三类问题。

当数据集不同维度上的方差分布不均匀的时候,PCA最有用。如果是一个球壳形数据集,PCA不能有效的发挥作用,因为各个方向上的方差都相等;没有丢失大量的信息维度一个都不能忽略。

inputfile = path + "/chapter4/data/principal_component.xls"
outputfile = "tmp/tmp4/dimention_reducted.xls"

data = pd.read_excel(inputfile, header=None)
data.head()
360截图18430702749187.png
pca = PCA()
data_pca=pca.fit(data)

#禁用科学计数法
np.set_printoptions(suppress=True,   precision=10,  threshold=2000,  linewidth=150)  
pd.set_option('display.float_format',lambda x : '%.2f' % x)

# 返回各个模型的特征向量
pca.components_
# 返回各个成分各自的方差百分比
pca.explained_variance_ratio_

data.to_excel(outputfile, index=False)

遗留问题:pca之后是不是就该怎么建模怎么建模了,它只是减少了输入维度?(请路过的高人指教~)

上一篇 下一篇

猜你喜欢

热点阅读