数据处理工具记录【一】—— 数据

使用工具

jupyter notebook
pandas、sklearn
(matplotlib和numpy、scipy就不说了)
以上都可pip安装

注:

  1. 本人使用的sklearn版本是0.18
  2. jupyter notebook 安装前先升级pip,再输入pip install jupyter
  3. jupyter使用时先定位到项目文件夹。使用教程可参考博客: https://blog.csdn.net/gubenpeiyuan/article/details/79252402
  4. 图片样例来源于:机器学习实战:基于Scikit-Learn和TensorFlow

数据读取

读取csv文件

import pandas as pd
data = pd.read_csv(path)

读取excel文件

# 读取第一个sheet
data = pd.read_excel(path)  

# 读取第二个sheet
data = pd.read_excel(path, sheet_name=1)  

 # 读取所有的sheet,以字典的形式保存,key为sheet名
data = pd.read_excel(path, sheet_name=-1)  

返回DataFrame类。
其他参数可以参考博客:
https://blog.csdn.net/weixin_38546295/article/details/83537558

数据浏览

显示信息

data.head()  # 显示前5行数据

在这里插入图片描述

data.info()  # 显示一些信息,可以看出哪列有缺失,数据格式等

在这里插入图片描述

data["key"].value_counts()  # 显示该列的分类统计信息

在这里插入图片描述

data.describe()  # 显示统计相关信息,包含计数、均值、标准差、最大最小值、四分位数

在这里插入图片描述

划分测试集

from sklearn.model_selection import train_test_split
train_set, test_set = train_test_split(data, test_size=0.2, random_state=42)

可视化

频数直方图

%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
data.hist(bins=50, figsize=(20,15))  # 绘制频数直方图,bin是矩阵数

在这里插入图片描述
关于DataFrame.hist()更多参数说明,可参考官网:
https://pandas.pydata.org/pandas-docs/version/0.19/generated/pandas.DataFrame.hist.html
如果打开较慢或打不开,可参考博客:
https://blog.csdn.net/yanwucao/article/details/79841544

散点图

data.plot(kind="scatter", x=key1, y=key2)

在这里插入图片描述

带透明度的散点图

加上透明度,可以更有效的显示聚集情况

data.plot(kind="scatter", x=key1, y=key2,alpha=0.1)

在这里插入图片描述

带热力图与大小的散点图

data.plot(kind="scatter", x="longitude", y="latitude", alpha=0.4,
             s=housing["population"]/100, label="population", 
             c="median_house_value", cmap=plt.get_cmap("jet"), colorbar=True)

在这里插入图片描述

保存图片

def save_fig(path, tight_layout=True):
    print("Saving figure", fig_id)
    if tight_layout:
        plt.tight_layout()
    plt.savefig(path, format='png', dpi=300)

寻找相关性

皮尔逊相关系数矩阵

corr_matrix = data.corr()
corr_matrix[key].sort_values(ascending=False)

在这里插入图片描述

多指标散点图

不同指标位置为对应的散点,对角线相同指标位置为频数直方图。
从这样的图里面可以看到相关性

from pandas.plotting import scatter_matrix
attributes = ["key1", "key2", "key3", "key4"]
scatter_matrix(data[attributes], figsize=(12, 8))

在这里插入图片描述
在这里插入图片描述

数据组合

data[new_key] = data[key1] / data[key2]

数据清洗

一般方法

一般有以下三种方法,再DataFrame中都有方法可调用

  1. 放弃这一条数据,对应dropna()方法
  2. 放弃这一条属性,对应drop()方法
  3. 填补缺失值(0,中位数,平均数),对应fillna()方法
data.dropna(subset=[key1,key2])
data.drop(key, axis=1)
median = data[key].median()
data[key].fillna(median)

sklearn中有更好的估算器和转换器完成第三种方法

from sklearn.preprocessing import Imputer
imputer = Imputer(strategy="median")
imputer.fit(data)  # 估算器,一般用来拟合,估算参数
data = imputer.transform(data)  # 转换器,根据估算器更新数据集

# 此时data的属性时numpy.ndarray数组,最好还是转换成pandas的DataFrame
data = pd.DataFrame(data)

也可以自定义转换器,需要重构fit()和transform()方法。

class DataFrameSelector(BaseEstimator,TransformerMixin):
    def __init__(self,attribute_names): #可以为列表
        self.attribute_names = attribute_names
    def fit(self,X,y=None):
        return self
    def transform(self,X):
        return X[self.attribute_names].values #返回的为numpy array

特征放缩

from sklearn.preprocessing import StandardScaler  # 标准化(减去均值再除以标准差)
from sklearn.preprocessing import MinMaxScaler  # 归一化(0~1)

流水线

将上述步骤合在一起,安装一定顺序执行,调用优化过的fit_transform()方法。

from sklearn.pipeline import Pipeline
num_pipeline = Pipeline([('imputer', Imputer(strategy="median")),   # 估算器
                        ('attribs_adder', CombinedAttributesAdder()),   # 转换器
                        ('std_scaler', StandardScaler())   #特征缩放
                        ])
housing_num_tr = num_pipeline.fit_transform(housing_num)

流水线也可以组合

from sklearn.pipeline import FeatureUnion

num_attribs = list(data)
cat_attribs = ["ocean_proximity"]

num_pipeline = Pipeline([
    ('selector', DataFrameSelector(num_attribs)),
    ('imputer', Imputer(strategy="median")),
    ('attribs_adder', CombinedAttributesAdder()),   # 自定义的数据组合转换器
    ('std_scaler', StandardScaler()),
])

cat_pipeline = Pipeline([
    ('selector', DataFrameSelector(cat_attribs)),
    ('label_binarizer', LabelBinarizer()),  # 文本转换器,给字符编码
])

full_pipeline = FeatureUnion(transformer_list=[
    ("num_pipeline", num_pipeline),
    ("cat_pipeline", cat_pipeline),
])
data = full_pipeline.fit_transform(data)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

73826669

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值