利用MySQL,Oracle进行Python的数据分析
-
:MySQL数据库的思想以及操作流程:
- 数据库是一种关系型数据库
在Java语言或者其他计算机语言作为后台开发来讲,数据库的’关系’体现在one to one manyto one many to many(有中间表产生) one to many - 在Python数据分析,人工智能技术领域不是以上理解
是将数据通过numpy,pandas,matplotlib进行数据分析
体现在数据的发布思想,将数据发布给客户,人工智能设备–作为数据集
- 数据库是一种关系型数据库
-
MySQL数据库实战
- 只能满足小型企业级的开发,对于数据集不是很适合,数据存储量较大,数据比较安全
- Oracle–针对大数据/人工智能利用很多
- 数据库分为DDL,DCL.DML语句:
DML : 数据库操作语言(Data Maniplulation Language)–用于检索或者修改数据
DDL : 数据库定义语言(Data Defination Language)–用于定义数据的结构
DCL : 数据库控制语言(Data Control Language)–用于数据库用户的权限–DBA
- MySQL企业级的安装流程,以及企业版本的选择
- MySQL分为 客户端 和 服务器端 --MySQL自身按照携带基于DOS的客户端和服务器端
- 注意事项:
- 用户名和密码的设置 root root
- 端口默认:3306,Oracle默认:5521
- 编码格式:默认英文,手动修改UTF8(数据库里没有’-'数据库里面没有特殊字符)
- 出现乱码问题:
进入MySQL目录下面,找到my.ini文件,此文件可以修改MySQL的配置信息–重新启动MySQLservice服务
- MySQL的卸载(难点)
1) 进入控制面板,删除MySQL安装程序包
2) 进入安装目录,删除MySQL文件
3) 进入系统C盘的,win/用户下面找MySQL的字样,全部删除
4) 在cmd窗口:regedit进入注册表
5) 建议删除回收站
回收站的文件属于系统不再加载的文件–可以不用删除–盗版
回收站里的文件属于系统加载文件–需要删除–激活
学习mysql
-
show databases 表示的是显示当前所有数据库!—目的是什么、?查看切换数据库
shop:数据库—问题:在shop下面建一个表User—操作?
注意:mysql必须先有数据库,再有表!
use shop 切换到当前的shop数据库下面建立表 语法 :use 数据名称 -
CRUD操作
mysql> create table user(id int primary key auto_increment,name char(12),sex varchar(2),age int);
ERROR 1050 (42S01): Table ‘user’ already exists
mysql> create table UserPython(id int primary key auto_increment,name char(12),sex varchar(2),age int);
Query OK, 0 rows affected (0.02 sec)
讲解 :char () 和 varchar()----都是字符串操作
- varchar数据类型执行数据的速度快!但是会给磁盘产生垃圾磁盘!----数据库回收磁盘碎片,会造成内存浪费!
mysql自身内存不大,不建议使用!但是在Oracle里面建议使用Varchar–因为Oracle追求读写速度! - char类型执行效率较快!但是不产生磁盘垃圾碎片!
适合mysql用
mysql> show tables;
+----------------+
| Tables_in_shop |
+----------------+
| adminuser |
| billitem |
| category |
| categorysecond |
| message |
| orderitem |
| orders |
| product |
| shopcartitem |
| student |
| user |
| userpython |
+----------------+
12 rows in set (0.05 sec)
mysql> insert into UserPython(id,name,sex,age)value(1001,'zhangsan','男',30);
- mysql插入值有 3种方式
-
insert into UserPython(id,name,sex,age)value(1001,‘zhangsan’,‘男’,30);
此写法:是将字段和 值就行一一匹配对应,数据安全、数据好维护等–效率高!
sql底层只执行一次匹配字段 -
insert into UserPython values(2,‘zhangsan’,‘m’,30);
此写法:是将字段和 值不是匹配对应,数据不是很安全、数据不好维护等–效率高!
sql底层只能寻找和 key 有关系的values —执行2次以上匹配–不建议 -
insert into UserPython values(‘zhangsan’,‘m’,30);
此写法:必须满足id是具有主键Primary key机制 ,然后通过id主键去自动匹配数据库的字段对应的value
- select * from UserPython;
备注:在sql优化/查询里面,尽量不要使用* ----*会将数据库的列columns全部加载!
Query OK, 1 row affected (0.01 sec)
mysql> select * from UserPython;
+----+----------+------+------+
| id | name | sex | age |
+----+----------+------+------+
| 1 | zhangsan | m | 30 |
+----+----------+------+------+
1 row in set (0.00 sec)
mysql> insert into UserPython values(2,'zhangsan','m',30);
Query OK, 1 row affected (0.01 sec)
mysql> select * from UserPython;
+----+----------+------+------+
| id | name | sex | age |
+----+----------+------+------+
| 1 | zhangsan | m | 30 |
| 2 | zhangsan | m | 30 |
+----+----------+------+------+
2 rows in set (0.00 sec)
实现MySQLClient操作数据分析案例
# 导包/模块
import os;
import pandas;
import MySQLdb;
# 连接数据库
connection = MySQLdb.connect(
host='localhost',
user='root',
passwd='root',
db='python',
charset='utf8'
);
#导入数据到MySQL。遍历目录,把里面的所有数据入库
rootDir="C:\\ZhangTao\\python课件\\0808\\测试数据\\";
# 定义一个exeSQL输出SQL执行结果
def exeSQL(sql):
print("exeSQL: " + sql)
connection.query(sql);
for fileName in os.listdir(rootDir):
print(fileName)
path = os.path.join(rootDir, fileName)
if ".txt" in fileName:
path = path.replace("\\", "\\\\");
#拿到文件名中的时间字段
datetime = fileName[0:8];
tableName = "订购明细" + datetime;
#建表、导入数据到表中
exeSQL("drop table if exists " + tableName)
exeSQL("create table " + tableName + "(订单编号 int, 订购日期 datetime, 用户ID int, 产品 char(8), `单价(元)` int, 数量 int, 订购金额 int);");
#mysql将数据导入表的固定语句
exeSQL("LOAD DATA LOCAL INFILE '" + path + "' INTO TABLE `" + tableName + "` CHARACTER SET 'UTF8' COLUMNS TERMINATED BY ',' LINES TERMINATED BY '\\n' IGNORE 1 ROWS;");
#建立日订购统计表
exeSQL("create table if not exists 日订购统计表(统计日期 date, 订购用户数 int, 订购次数 int, 人均订购金额 double, 订购总额 double);");
exeSQL("delete from 日订购统计表 where 统计日期='" + datetime + "';");
exeSQL("insert into 日订购统计表 select '" + datetime + "', count(distinct 用户ID), count(用户ID), sum(订购金额)/count(distinct 用户ID), sum(订购金额) from `" + tableName + "`;");
statDay = pandas.read_sql('select * from 日订购统计表;', con=connection);
#关闭数据库
connection.close();
print('\n日订购统计表数据如下:');
print(statDay);
#绘图
font = {
'family' : 'SimHei'
}
matplotlib.rc('font', **font);
# 1.折线图
plot1 = plt.plot(statDay['统计日期'], statDay['订购用户数']);
plt.show();
plot2 = plt.plot(statDay['统计日期'], statDay['订购次数']);
plt.show();
plot3 = plt.plot(statDay['统计日期'], statDay['人均订购金额']);
plt.show();
plt.legend(('订购用户数', '订购次数', '人均订购金额'))
# 2.柱状图
x=statDay['统计日期']
x_labels=['0901','0902','0903','0904','0905','0906','0907','0908']
y=statDay['订购总额']
plt.bar(x,y,width=0.5)
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.xticks(x,x_labels)
#修改x坐标
plt.xlabel('统计日期')
#修改y坐标
plt.ylabel('订购总额')
#添加标题
plt.title('柱状图')
plt.show()
# 3.饼状图
price=statDay['订购总额']
prices=sum(statDay['订购总额'])
price_perc=price/prices
#添加名称
labels=['0901','0902','0903','0904','0905','0906','0907','0908']
#添加颜色
colors=['blue','red','blue','red','blue','red','blue','red']
#绘制饼状图 pie
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
# labels 名称 colors:颜色,explode=分裂 autopct显示百分比
paches,texts,autotexts=plt.pie(price_perc,labels=labels,colors=colors,autopct='%0.1f%%')
#设置饼状图中的字体颜色
for text in autotexts:
text.set_color('white')
#设置字体大小
for text in texts+autotexts:
text.set_fontsize(20)
plt.show()