第2章 操作数据库
人工智能最重要的动力就是数据,没有充分数据的人工智能是毫无意义的,数据越大人工智能将越聪明,所以数据是非常重要的。因此整合各种数据的能力也是各种开发工具非常重视的,Python在这方面功能很强大。这一章我们将介绍如何利用Python存取数据库中的数据。
目前企业数据大都存储在数据库中,如MySQL、Oracle、DB2等关系型数据库,这些数据库目前使用非常广泛,由于其独特优势,未来还将大量使用;但随着数据量、数据种类的不断增长,目前非关系型数据库也越来越普及了,如MongoDB、Redis、HBase等等,这些数据库有时又称为NoSQL型数据库。所有这些数据是目前大数据的主要源头,因此,如何使用抽取、整合、处理及分析这些数据是非常重要。
这章主要内容:
操作MySQL
操作MongoDB
2.1 连接MySQL
Python使用MySQL非常简单,先导入python有关mysql的驱动模块,然后建立与数据库的连接即可。
以下通过实例来说明。
In [3]: import pandas as pd
In [4]: from pandas import DataFrame
In [5]: import MySQLdb
In [6]: conn= MySQLdb.connect(host='slave02',port=3306,user='feigu', passwd='feigu', db='testdb',charset='utf8')
In [7]: data= pd.read_sql('select * from stud_score', conn)
In [8]: df=DataFrame(data)
In [9]: df.count()
2.2 存取MongoDB
MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写。它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo可以有多个数据库,每个数据库中数据或文档被分组存储在数据集合(Collection)中。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。
以下通过一个实例来说明,如何连接mongodb,然后创建集合,并往集合中插入记录,并查询该条记录或文档。
In [2]: conn=MongoClient(host='localhost',port=27017)
In [3]: testdb=conn.testdb
In [4]: coll=testdb.items
In [5]:
item={
"type":"operation",
"itemno":"10000",
"contents":{
"python":"2.7.11",
"spark":"2.0"
},
"date":"201611"
}
In [6]: coll.insert(item)
In [7]: coll.find_one()
Out[7]:
{u'_id': ObjectId('5832b9bfeb0a1957669cdf68'),
u'contents': {u'python': u'2.7.11', u'spark': u'2.0'},
u'date': u'201611',
u'itemno': u'10000',
u'type': u'operation'}
当然也可同时往集合插入多条记录:
In [8]: item1=[{
...: "type":"operation",
...: "itemno":"20000",
...: "contents":{
...: "Hadoop":"2.7.0",
...: "HBase":"2.0"
...: },
...: "date":"201611"
...: } ,
...: {
...: "type":"operation",
...: "itemno":"30000",
...: "contents":{
...: "Jave":"1.8.0",
...: "Scala":"2.10.0"
...: },
...: "date":"201611"
...: }
In [9]: coll.insert(item1) ###插入多条记录
Out[9]: [ObjectId('5833c36ceb0a197a4306abea'), ObjectId('5833c36ceb0a197a4306abeb')]
In [10]: coll.find({"type":"operation"})
Out[10]: In [10]: for doc in coll.find({"type":"operation"}):
print doc ###查询多条记录
....:
{u'date': u'201611', u'itemno': u'10000', u'_id': ObjectId('5832b9bfeb0a1957669cdf68'), u'type': u'operation', u'contents': {u'python': u'2.7.11', u'spark': u'2.0'}}
{u'date': u'201611', u'itemno': u'20000', u'_id': ObjectId('5833c36ceb0a197a4306abea'), u'type': u'operation', u'contents': {u'HBase': u'2.0', u'Hadoop': u'2.7.0'}}
{u'date': u'201611', u'itemno': u'30000', u'_id': ObjectId('5833c36ceb0a197a4306abeb'), u'type': u'operation', u'contents': {u'Jave': u'1.8.0', u'Scala': u'2.10.0'}}
关系型数据可以使用DataFrame函数转换为DataFrame格式,Mongodb格式的数据能否转换?如果能,该如何转换呢?可以的,而且方式与关系型数据库类型,请看以下示例:
In [12]: from pandas import Series,DataFrame
In [13]: query1=coll.find({"type":"operation"}) ##定义查询结果
In [14]: column=['type','itemno','contents','date'] ##定义显示列名(关键字)
In [15]: df1=DataFrame(list(query1),columns=column)
In [16]: df1
Out[16]:
type itemno contents date
0 operation 10000 {u'python': u'2.7.11', u'spark': u'2.0'} 201611
1 operation 20000 {u'HBase': u'2.0', u'Hadoop': u'2.7.0'} 201611
2 operation 30000 {u'Jave': u'1.8.0', u'Scala': u'2.10.0'} 201611
Pingback引用通告: Python与人工智能 – 飞谷云人工智能