Python机器学习手册(二)

第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章完工!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值