数据挖掘综合

本文详细介绍了数据挖掘的过程,包括从外部文件读取数据、数据清洗、机器学习以及可视化。数据清洗部分讲解了使用Pandas、Numpy和正则表达式的方法。在机器学习章节,涉及了训练集与测试集划分、模型选择和评估,强调了模型泛化能力和样本空间一致性的关键性。最后,探讨了Matplotlib、Seaborn、YellowBrick和PyeCharts等可视化工具的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、从外部文件读取/写入数据

以下所有读取或写入的数据统一以 Pandas 下的 DataFrame 类来承载。需要注意的是,使用 Pandas 模块读取.csv文件,为了防止因为读取路径包含中文字符而报错,需要注明使用 Python 作为加载引擎。

import os
import pandas as pd
import json

# 路径
__file__    #运行文件路径
os.listdir(path)    #列示文件夹下所有文件名
os.path.exists(path)    #判断路径指向目标是否存在
os.path.isdir(path)    #判断路径是否指向文件夹   
os.path.isfile(path)    #判断路径是否指向文件
os.path.dirname()    #截取上一级文件夹路径
os.mkdir(path)    #新建文件夹
os.rmdir(path)    #删除文件夹

# .txt/.csv
df = pd.read_csv(path, sep=',', engine='python')    #读取
df.to_csv(path, sep=',', index=None)    #写入

# .xls/.xlsx
df = pd.read_excel(path)    #读取
df.to_excel(path, index=None)    #写入

# .json
d = json.load(open(path,encoding='utf-8'))    #读取
json.dump(d,open(path,'w',encoding='utf-8'))    #写入

二、数据清洗

数据清洗用于纠正数据错误,包含格式检查、空值填补和异常值剔除等。数据的载体决定了数据清洗的效率。以下是数据处理中主要使用的类及其对比:

list array Series DataFrame
模块 - Numpy Pandas Pandas
最高嵌套维度 无限 无限 一维 二维
优点 系统内置类,调用简单,运行速度快;对维度一致性没有严格要求 擅长处理多维矩阵;可迅速生成特殊矩阵;数学/统计学运算可用于其他多个类型的变量 - 内置高效的数据清洗函数
缺点 针对数值的数学/统计学操作必须通过遍历每一项进行,代码效率低 维度一致性要求严格;没有高效的数据清洗函数 - 仅限二维;数学/统计学运算仅能用于 DataFrame 类的变量
用途 用于处理引用关系和简单数据 用于多维数据的处理以及数学运算 与 DataFrame 搭配使用 用于数据清洗、统计学运算和数据存储

导入所需模块,及本章示范所用的变量:

import numpy as np
import pandas as pd
string = 'This is an example.'
vector = [1,2,3,4,5,6]
vector2 = [5,2,1,4,3,6]
matrix = [[1,2,3],[4,5,6]]
cube = [[[1,2],[3,4],[5,6]],[[7,8],[9,10],[11,12]]]
l = list(vector)
arr = np.array(matrix)
arr2 = np.array(cube)
arr3 = np.array(vector)
arr4 = np.array(vector2)
arr5 = np.array([[[[2],[3]],[[4],[5]]]])
s = pd.Series(['Tom', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
s1 = pd.Series([1,5,2,3,6,7])
s2 = pd.Series([9,7,3,1,6,3])
df = pd.DataFrame(matrix)
df2 = pd.DataFrame(np.random.random((5,3)), index=['a','c','e','f','h'], columns=['one','two','three'])
df3 = df2.reindex(index=['a','b'],columns=['one','two','five'])
df4 = pd.DataFrame({
   'Team':['Liverpool','Liverpool','Chelsea','Chelsea','Barcelona','Barcelona','Barcelona','Barcelona','Liverpool','Man U','Man U','Liverpool'],'Rank': [1,2,2,3,3,4,1,1,2,4,1,2],'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],'Points': [876,789,863,673,741,812,756,788,694,701,804,690]})
bins = [500,600,700,800,900]
labels = ['500-599','600-699','700-799','800-899']
df_one = pd.DataFrame({
   'id':[1,2,3,4], 'Name': ['Li', 'Yi', 'Qu', 'Mi'], 'subject_id':['DM','ML','DB','Prog.']})
df_two = pd.DataFrame({
   'id':[1,2,3,4], 'Name': ['Amy', 'Biky', 'Charles', 'Dave'], 'subject_id':['AI','ML','DB','NN']})
df_three = pd.DataFrame({
   'id2':[1,2,3,4], 'Name2': ['Amy', 'Biky', 'Charles', 'Dave'], 'subject_id2':['AI','ML','DB','NN']})

除了 Pandas 模块下的 Series 类对数据类型格式要求较为严格,其他的类都可以通过间接的方式实现相互转换。例如,将 DataFrame 格式的数据转换为 list,可以先将其转换为 Numpy 模块下的 array 格式,然后调用 Numpy 的 tolist() 公式。以下是两种常用的无差别转换:

l = arr.tolist()    #np.array转换为list
arr = df.values    #pd.DataFrame转换为np.array
1) 基本代码

以下列示不同种类的变量常用操作。

Built-In:str 类
string.find('is',4)    #寻找字符串
string.index('is',4)    #寻找字符串   
string.count('a')    #出现频率    
string.replace(‘a’, 'A')    #替换字符    
string.startswith('This')    #是否以该字符串开始    
string.endswith()    #是否以该字符串结尾    
string.split(' ')    #分割字符串    
'-'.join(string)    #插入字符    
string.strip()    #消除两边空格    
string.lstrip()    #消除左边空格    
string.rstrip()    #消除右边空格    
string.capitalize()    #首字母大写    
string.casefold()    #首字母小写
string.lower()    #全部小写    
string.upper()    #全部大写    
string.title()    #全部首字母大写    
string.islower()    #是否全部小写
string.isupper()    #是否全部大写
string.istitle()    #是否全部首字母大写
Built-In:list 类
# 全局信息:
len(l)    #长度
sorted(l)    #从小到大排序
list(set(l))    #值集

# 操作:
l.append(7)    #在最后一项插入数字7
l.insert(2, 2.5)    #在2处插入2.5
l.pop()    #删除并返回最后一项
del l[-1]    #删除最后一项
l.sort(reverse=False)    #将数据按从小到大排列
l.reverse()    #将列反向排列
list(map(float,l))    #将所有元素转为浮点形式
Numpy:NDArray 类
# 全局信息:
arr.shape    #行列比
arr.dtype    #数值类型
arr.T    #行列转置
arr2.transpose(0,2,1)    #第2维和第3维互换
arr.reshape([1,4])    #行列比调整为(1,4)
arr5.squeeze()    #剔除所有长度为1的维度
arr5.reshape(-1)    #剔除所有长度为1的维度并扁平化
arr5.ravel()    #剔除所有长度为1的维度并扁平化
arr5.flatten()    #剔除所有长度为1的维度并扁平化
arr.astype(np.int8)    #数值类型改为np.int8
np.argsort(arr, axis=1)    #每一行从小到大排序的索引
np.unique(arr)    #值集
np.where(arr>1)    #满足条件的值在每一维的位置

# 生成特殊矩阵:
np.arange(15)    #生成0到14的向量
np.zeros((2,3))    #生成行列比(2,3)、值都为0的矩阵
np.ones((2,3))    #生成行列比(2,3)、值都为1矩阵
np.full((2,3),7)    #生成行列比(2,3)、值都为7的矩阵
np.eye(5)    #生成行列比(5,5)、对角线上值都为1的对角矩阵
np.random.random((2,3))    #生成行列比(2,3)的均匀随机数矩阵
np.random.randn(2,3)    #生成行列比(2,3)的高斯随机数矩阵
np.random.seed(12)    #使每次生成的随机数固定,随机代号为12

# 数学运算:
np.max(arr)    #最大值
np.min(arr)    #最小值
np.abs(arr)    #绝对值
np.floor(arr)    #向下取整
np.ceil(arr)    #向上取整
np.percentile(arr,95)    #百分位数
np.sqrt(9)    #算术平方根
np.log(2.7)    #自然对数
np.exp(3)    #自然常数
np.dot(arr3,arr4)    #矩阵相乘
np.matmul(arr3,arr4)    #矩阵相乘
arr3*arr4    #矩阵点对点相乘

# 统计学运算:
np.sum(arr)    #总和
np.prod(arr)    #累乘
np.cumsum(arr)    #累和
np.mean(arr)    #均值
np.median(arr)    #中位数
np.var(arr)    #方差
np.std(arr)    #标准差
np.corrcoef(arr)    #相关系数
np.argmax(arr,axis=1)    #最大值位置
np.bincount(arr[0])    #出现频率(仅整数)

# 跨数据操作:
np.concatenate((arr3,arr4), axis=0)    #合并
np.vstack((arr3,arr4))    #纵向合并
np.hstack((arr3,arr4))    #横向合并
np.tile(arr, (2,3))    #2*3个矩阵合并
Pandas:Series 类

单独调用 DataFrame 的任何一列即为 Series,可调用 DataFrame 的任何公式。

# 全局信息:(仅当数值类型为str时可用)
s.str.len()    #每一项的长度
s.str.lower()    #每一个字母调整为小写
s.str.upper()    #每一个字母调整为大写
s.str.split('|')    #每一项按|进行切割
s.str.contains('as')    #每一项是否包含as的True/False矩阵
s.str.replace('@', '$')    #以$替代@
s.str.startswith ('T')    #每一项是否以T开始的True/False矩阵
s.str.endswith('t')    #每一项是否以t结尾True/False矩阵
s.str.find('e')    #每一项第一个e的位置

# 统计学运算:
s1.cov(s2)    #两组数据的协方差
s1.corr(s2)    #两组数据的相关系数

# 数据处理:
pd.get_dummies(s)    #生成Dummy列表
s.value_counts()    #值集与数量
s.apply(lambda x: np.float(x))    #单元操作
Pandas:DataFrame 类
# 全局信息:
df.copy()    #深赋值
df.shape    #行列比
df.index    #行序号
df.columns    #所有列的名称
df.head(2)    #头两行    
df.tail(1)    #尾一行
df.unique()    #值集
df.nunique()    #值集大小
df.isin([1,2,3])    #条件匹配
df2.sort_values(by=['0'], kind='mergesort')    #按名为0的列排序的结果
df2.loc['a','one']    #行名称等于a、列名称等于one的数值
df2.iloc[0,0]    #第0行、第0列的数值
df2.reindex(index=['a','b'], columns=['one','five'])    #保留选中的行和列
df2.set_index('two')    #将列设为行序列
df2.reset_index(drop=True)    #重置行序列为0开始的整数数列(不加入原列序号)
df2.rename(columns={
   'one':'two','two':'four'})    #重置列名称

# 统计学运算:
df.describe()    #计数、均数、标准差、最小值、四分位数、最大值
df.sum()    #求和
df.mean()    #均值
df.median()    #中位数
df.mode()    #众数
df.var()    #方差
df.std()    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值