第2章 加载数据
2.0 简介
机器学习最重要的一步无异于是数据加载。本章会使用pandas库中的一些方法来加载数据。
2.1 加载样本数据库
加载已有的样本数据集
#加载已有的样本数据集
from sklearn import datasets #databases是pandas提供的玩具数据集
#加载手写数字数据集
digits = datasets.load_digits()
#创建特征矩阵
features=digits.data
#创建目标矩阵
target= digits.target
print(features)
print(target)
#运行结果
[[ 0. 0. 5. ... 0. 0. 0.]
[ 0. 0. 0. ... 10. 0. 0.]
[ 0. 0. 0. ... 16. 9. 0.]
...
[ 0. 0. 1. ... 6. 0. 0.]
[ 0. 0. 2. ... 12. 0. 0.]
[ 0. 0. 10. ... 12. 1. 0.]]
[0 1 2 ... 8 9 ]
可以看出features是一个二维数组,标签为0-9的数字
databases数据库中包含了许多玩具数据集,这些数据集比现实生活中的数据集小得多。scikit-learn中比较流行的有三个:load_boston(波士顿房价)、load_iris(鸢尾花)、load_digits(手写体数据集)
load_boston:包含了503个波士顿房价的观察值。常用于研究回归算法。
load_iris:包含了150个鸢尾花尺寸的观察值。常用于研究分类算法。
load_digits:包含了1797个手写数字图片的观察值。常用于研究图像分类。
2.2 创建仿真数据集
生成一个仿真数据集
如果需要创建一个仿真数据集来做线性回归,可以使用make_regression
如果需要创建一个仿真数据库用于分类,可以使用make_classification
如果需要创建一个仿真数据集用于聚类,可以使用make_blobs
make_regression参数说明
n_samples:表示数据样本点个数,默认值100
n_features:特征数(自变量个数)
n_informative:参与建模特征数
n_targets:因变量个数
noise:噪音
bias:偏差(截距)
coef:是否输出coef标识
random_state:随机状态若为固定值则每次产生的数据都一样
#使用make_regression创建一个仿真数据库用于线性回归
#加载make_regression库
from sklearn.datasets import make_regression
# 生成特征矩阵 目标向量以及模型系数
features,target,coefficients = make_regression(n_samples= 100,
n_features= 3,
n_informative=3,
n_targets=1,
noise= 0.0,
coef= True,
random_state=1)
#查看特征矩阵和目标向量(查看前三行的数据和标签)
print('Feature Matrix\n',features[:3])
print('Target Vector\n',target[:3])
#运行结果
Feature Matrix
[[ 1.29322588 -0.61736206 -0.11044703]
[-2.793085 0.36633201 1.93752881]
[ 0.80186103 -0.18656977 0.0465673 ]]
Target Vector
[-10.37865986 25.5124503 19.67705609]
make_classification参数说明
n_samples:表示数据样本点个数,默认值100
n_features:用来控制生成目标向量的特征的数量
n_informative:用来控制生成目标向量的特征的数量
n_redundant:冗余信息,informative特征的随机线性组合
n_classes:分类类别
weights: 列表类型,权重比
random_state:随机状态若为固定值则每次产生的数据都一样
#使用ake_classification创建一个仿真数据库用于分类
#加载库
from sklearn.datasets import make_classification
#生成特征矩阵和目标向量
features,target =make_classification(n_samples= 100,
n_features= 3,
n_informative= 3,
n_redundant=0,
n_classes=2,
weights=[.25,.75], #25%属于第一个分类,75%属于第二个分类
random_state=1)
# 查看特征矩阵和目标向量
print('Feature Matrix\n',features[:3])
print('Target Vector\n',target[:3])
#运行结果
Feature Matrix
[[ 1.06354768 -1.42632219 1.02163151]
[ 0.23156977 1.49535261 0.33251578]
[ 0.15972951 0.83533515 -0.40869554]]
Target Vector
[1 0 0]
make_blobs参数说明
n_samples:表示数据样本点个数,默认值100
n_features:表示数据的维度,默认值是2
centers:产生数据的中心点,默认值3
cluster_std:数据集的标准差,浮点数或者浮点数序列,默认值1.0
center_box:中心确定之后的数据边界,默认值(-10.0, 10.0)
shuffle :洗乱,默认值是True
random_state:官网解释是随机生成器的种子
#使用make_blobs创建一个数据集用于聚类
#加载库
from sklearn.datasets import make_blobs
#生成特征矩阵和目标向量
features, target = make_blobs(n_samples= 100,
n_features=2,
centers= 3,
cluster_std=0.5,
shuffle=True,
random_state=1)
# 查看特征矩阵和目标向量
print('Feature Matrix\n',features[:3])
print('Target Vector\n',target[:3])
#运行结果
Feature Matrix
[[ -1.22685609 3.25572052]
[ -9.57463218 -4.38310652]
[-10.71976941 -4.20558148]]
Target Vector
[0 1 1]
对于make_blobs,centers参数决定了要生成对少个聚类。使用matplotlib可视化,能将make_blobs生成的聚类可视化的显示出来。
#加载库
import matplotlib .pyplot as plt
#查看散点图
plt.scatter(features[:,0],features[:,1],c=target)
plt.show()
2.3 加载CSV文件
csv表示以逗号分隔的值。csv文件是一种比较简单的文本格式,广泛用于存储表格式的行列数据,可以直接使用excel软件打开。pandas提供了read_csv函数,用于读入csv文件,并得到一个DataFrame对象。此外,还提供了read_table函数,能够进一步读入使用其他分隔符的类csv文件。
书上是读取网址上的CSV文件(可以实时感知数据的变化),但是我打不开网址,就读取了本地一个CSV文件。
#加载库
import pandas as pd
#创建URL
#url= 'https://tinyurl.com/simulated_data' #书里这个网址打不开,
#加载数据集
dataframe =pd.read_csv("600000_2005.csv") #把引号中的换为自己CSV所在的路径即可
#查看前两行数据
dataframe.head(2)
#print(dataframe.head(2))
但是利用这种读取CSV文件时,会默认把第一行作为表头,有的CSV文件第一行不是表头就会出现错误,下面是几种特使形式CSV文件的处理:
(1) csv文件无名称行数据读取
源数据
方法一
#让pandas自动分配列名
df2=pd.read_csv('G:\\projects\\input\\\\test2.csv', header=None)
df2
默认从0开始
方法二
#为read_csv函数提供一个额外的参数,增加列名
df3=pd.read_csv('G:\\projects\\input\\test2.csv', names=['a', 'b', 'c', 'd', 'message'])
df3
方法三
指定索引列
names = ['a', 'b', 'c', 'd', 'message']
df4=pd.read_csv('G:\\projects\\input\\test2.csv', names=names, index_col='message')
df4
(2) 文本文件非逗号分隔符的数据读取
如果要导入的文本文件的分隔符不是简单的逗号,而是一些有规则但长度不确定的空白字符,此时可以使用read_table,并传入一个正则表达式作为分隔符参数。例如下面的文件,使用了一个或多个空格来分隔不同的值。
源数据
一个或多个空格可以使用正则表达式来表述:\s+。因此可以如下导入该文件。
df1=pd.read_table('G:\\projects\\input\\test3.txt', sep='\s+')
df1
(3) 忽略文件中的某些行(注释)
read_csv和read_table函数还有许多其他参数,可以控制导入的各种选项。例如,使用skiprows参数忽略文件中的某些行。test4.csv文件带有多行注释。
源数据
#使用skiprows参数忽略这些注释行。
df1=pd.read_csv('G:\\projects\\input\\test4.csv', skiprows=[0,2,3])
df1
(4) 空缺值判断
处理缺失值是导入数据过程的一个重要部分。通常,缺失值使用空字符串或者一些特定的表示方法。pandas在默认情况下识别一些常用的缺失值的表示形式,例如:NA或者NULL等等。如下文件中存在缺失值,包含空字符串以及特定表示方法两种情形。
源数据
df = pd.read_csv('G:\\projects\\input\\test5.csv')
df
结果
df1=pd.isnull(df)
df1
(5) 读入指定的行数
实际导入的数据文件往往规模都比较大,这个时候,如果能够先读一小部分进来,有利于分析判断导入过程是否正确。确认无误后,再按照一般的方式将文件导入进来。nrows参数可以控制读入的行数。下面要导入的文件共有19行。
df = pd.read_csv('G:\\projects\\input\\test6.csv', nrows=5)
df
pandas也提供了反向的操作,能够将DataFrame导出为csv这类格式的文件。使用to_csv函数
2.4 加载Excel文件
使用pandas中的read_excel函数即可加载excel文件
使用pandas库的read_excel来加载一个excel数据表
import pandas as pd
#创建一个URL
#url='https://tinyurl.com/simulated_excel'
#dataframe=pd.read_excel(url,sheetname=0,header=1)
#加载数据
dataframe=pd.read_excel('课程信息表.xlsx')
#查看前两行
dataframe.head(2)
pandas还提供了一种方法读取Excel文件
pandas通过 ExcelFile类型提供了对Excel文件的基本支持。ExcelFile类在内部使用xlrd 和openpyxl包来操作Excel文件,因此需要首先安装这两个包。 要导入Excel文件,首先需要创建ExcelFile类的实例:
xls = pd.ExcelFile('G:\\projects\\input\\mydata.xls')
#假设该文件中存在一个名为“mysheet”的表格,使用ExcelFile对象的parse方法来解析它,从而获得一个DataFrame对象。
df = xls.parse('mysheet')
df
同样的也可以使用to_excel函数对excel文件进行输出
2.5 加载JSON文件
JSON(JavaScript Object Notation)格式在Web中使用非常广泛,常用于前端网页的JavaScript脚本和后端Web服务器交换数据。和表格型的数据比较起来,JSON格式更加复杂和灵活,能够表达类似于树结构的数据。现存多种库和工具用于JSON格式数据的处理。对于常规的任务,使用Python语言内置的json模块是最为方便的。使用json模块之前首先导入它。
使用pandas中的read_json函数即可加载excel文件
import json
import pandas as pd
data = pd.read_json('G:\\projects\\input\\in.json')
此外,json模块的load函数能够导入JSON数据,返回值是一个dict对象。
with open('G:\\projects\\input\\in.json') as f:
j=json.load(f)
j
json模块的dump函数提供了反向的功能,将一个dict对象导出为JSON格式的文件。
with open('G:\\projects\\input\\in-1.json', 'w') as f:
json.dump(j,f)
查询SQL数据库
(1)关系型数据库
1. SQLite数据库
导入Python内置的sqlite3模块,然后创建一个内存数据库,获取数据库的连接
##创建连接
import sqlite3
con=sqlite3.connect(':memory:')
##创建数据库
query = """
...: CREATE TABLE test
...: (a VARCHAR(20), b VARCHAR(20),
...: c REAL, d INTEGER );"""
#执行上述创建数据库的语句
con.execute(query)
#提交执行结果
con.commit()
##向创建的数据库中插入数据
data =[('Atlanta','Georgia',1.25,6),
...: ('Tallahassee','Florida',2.6,3),
...: ('Sacramento','California',1.7,5)]
stmt="insert into test values(?,?,?,?)"
#批量插入
con.executemany(stmt,data)
##SQL查询数据(Pandas提供了一个便捷的方法)
import pandas.io.sql as sql
sql.read_sql_query('select * from test',con)
查询结果
2. MySQL数据库
需要在自己的电脑上提前安装Mysql数据库
##导入pymysql模块
import pymysql
##连接数据库(按照自己的数据库进行修改)
conn=pymysql.connect(host='localhost',user='root',password='',database='test',charset='utf8')
#得到一个可以执行的SQL语句的光标对象
cursor=conn.cursor()
#定义要执行的SQL语句
sql = 'CREATE TABLE B18041805_USER1 (id INT auto_increment PRIMARY KEY ,name CHAR(10) NOT NULL UNIQUE,age TINYINT NOT NULL)ENGINE=innodb DEFAULT CHARSET=utf8;'
#执行sql语句
cursor.execute(sql)
#提交执行结果
conn.commit()
##插入数据
data=[(1,'明','20'),(2,'红','21'), (3,'黑','23')]
stmt="insert into b18041805_user1 VALUES(?,?,?)"
cursor.executemany("insert into b18041805_user1 VALUES(%s,%s,%s)",data)
conn.commit()
#SQL查询数据
import pandas.io.sql as sql
sql.read_sql_query('select * from b18041805_user1', conn)
##关闭光标对象
cursor.close()
##关闭数据库连接
conn.close()
执行结果
(2)非关系型数据库
主要讲述mongodb数据库
同样的需要实现在自己的电脑上安装mongodb数据库
mongodb的安装包
百度网盘:https://pan.baidu.com/s/1G3Z1gCc3zrqoROehLb0uMw
提取码:7yx9
事先启动mongodb数据库
mongod.exe --dbpath .
通过Python的模块pymongo与服务端进行交互,从而实现数据进出MongoDB数据库。首先需要导入客户类,并创建实例
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
#一个MongoDB实例能够支持多个独立的数据库。使用pymongo模块,可以通过类似于dict访问元素的语法访问MongoDB实例中的一个数据库。
db = client['test-database']
#collection是MongoDB数据库中的一种数据结构,用于表示一组文档(Document)。一个collection可以粗略地认为大体上类似于关系型数据库的一张表。在pymongo获取一个collection的语法同样适用类似于dict元素访问的方式。
collection = db['test-collection']
#MongoDB中数据库和collection的使用是惰性的。也就是说,只有当首个文档插入其中的时候,数据库和collection才会真正被创建出来。 数据在MongoDB数据库中是以文档(Document)的方式存储和使用的。文档是一种类似于JSON风格的数据结构。在pymongo以dict来表示文档。例如,下面的代码表示博客中的一篇文章。其中,datetime.datetime类型的值在存储时会自动转换为适当的存储格式。
import datetime
post = {"author": "Mike",
...: "text": "My first blog post!",
...: "tags": ["mongodb", "python", "pymongo"],
...: "date": datetime.datetime.utcnow()}
#在数据库中名为posts的collection中插入一篇文章。这个操作使用insert_one方法,并且会自动生成文档的id。
posts = db['posts']
post_id = posts.insert_one(post).inserted_id
#在首篇文章插入之后,名为posts的collection才会实际被创建出来。为了验证这一点,可以列出数据库中的所有collection。
db.collection_names(include_system_collections=False)
#pymongo提供了find_one方法,用于查询数据库中的一篇文档。例如,这里使用find_one方法查询posts中的一篇文章。
posts.find_one()
#find_one方法支持过滤条件,例如,需要查询指定作者的文章
posts.find_one({"author": "Mike"})
执行结果
第2章完工!!!