一.项目介绍:

为了更好的观察京沪深的走向趋势,抛开大盘指数,对真实数据进行范围统计,从而得出市场表现

二.项目准备:

1.有数据库环境和python的环境

2.有获取的数据

3.python中导入我们用到的两个lib

import MySQLdb
import matplotlib.pyplot as plt

三.项目运行效果:

四.分部过程讲解

1.编写存储过程:

这里用的是select的嵌套,一般来说连接查询更快一些,我这里为了方便,调用结果就是此范围内的大于设定涨幅的统计结果,对此我只取了12条,后面的数据放在了rnc_1,rnc_2后面等等,方便调用

2.数据库提取表名并处理

由于为了书写方便,我存入的表为shares8-2等等字样,不想每次都在python中每次手动录入列表不同的日期,而使用kettle工具输出查询结果再调用过程繁琐复杂,所以我想到了在查询中截取表名作为列表中的数据参数

select table_name from information_schema.tables

此时所有表名都会列出来,但是有你不想要的表,所以我们使用where指定数据库,并使用正则regexp限定查找范围,经过排序发现排序是按照先后顺序一个字符一个字符的去查,出现了8-10等等会比8-2排在前面,因此我们使用str_to_date()函数将字符串的后面转换为日期,此时效果如下

因为要使用python处理,对此我们只需要查询截取的部位

select substr(table_name,7) from information_schema.tables
where table_schema= '{database}' and table_name regexp 'shares'
order by str_to_date(substr(table_name,7),'%m-%d') asc

对于从后面截取一部分日期可使用limit 初始位置,记录数

如将前面rnc函数改成rnc_1,rnc_1为 8-18到9-2的12条记录,即可以将SQL如下输出

SQL = f"""select substr(table_name,7) from information_schema.tables
where table_schema= '{database}' and table_name regexp 'shares'
order by str_to_date(substr(table_name,7),'%m-%d') asc limit 12,12"""

如图,此时调用存储过程rnc_1,Rise变量取值2.2,SQL后加了limit 12,12的结果

为了批量生成limit序列,并可控的放入到sql语句中,我们定义以下函数

# 定义 limit 分页操作的组数
limit_group = 12
list_m = []
list_n = []def limit_m(m):for k in range(0, m, limit_group):list_m.append(str(k))return list_mdef limit_n(n):for k in range(0, len(m)):list_n.append(f',{str(n)}')return list_nlimit = []
m = limit_m(601)
n = limit_n(limit_group)for i in range(0, len(m)):limit.append(m[i]+n[i])
print(limit)

['0,12', '12,12', '24,12', '36,12', '48,12', '60,12', '72,12', '84,12', '96,12', '108,12', '120,12', '132,12', '144,12', '156,12', '168,12', '180,12', '192,12', '204,12', '216,12', '228,12', '240,12', '252,12', '264,12', '276,12', '288,12', '300,12', '312,12', '324,12', '336,12', '348,12', '360,12', '372,12', '384,12', '396,12', '408,12', '420,12', '432,12', '444,12', '456,12', '468,12', '480,12', '492,12', '504,12', '516,12', '528,12', '540,12', '552,12', '564,12', '576,12', '588,12', '600,12']

对此将limit列表循环索引,即可获得分组后对应的分页结果

SQL = f"""select substr(table_name,7) from information_schema.tables
where table_schema= '{database}' and table_name regexp 'shares'
order by str_to_date(substr(table_name,7),'%m-%d') asc limit {limit[2]}"""

['9-5', '9-6', '9-7', '9-8', '9-9', '9-13', '9-14', '9-15', '9-16', '9-19', '9-20', '9-21']

3.数据库中抽取数据加载数据到python中

注释应该很明确了,可以加print()函数对载入的数据进行测试及调试

# _*_ coding:utf-8 _*_
# @Time    : 2022/9/13 22:26
# @Author  : ice_Seattle
# @File    : 股票离散涨幅数量对比.py
# @Software: PyCharmimport MySQLdb
import matplotlib.pyplot as plt
# 打开数据库连接
db = MySQLdb.connect("localhost", "root", "489000", "shares2022", charset='utf8')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取一条数据
version = cursor.fetchone()
print("Database version : %s " % version)
# 设置要查询>=Rise的股票的临界值
Rise = 5
sql = f"""CALL rnc_2('{Rise}')"""
cursor.execute(sql)
# SQL语句预处理,获取某个数据库中以shares所匹配到的所有表名,并将表的末端字符串转换为日期格式升序排序
SQL = f"""select substr(table_name,7) from information_schema.tables
where table_schema= '{database}' and table_name regexp 'shares'
order by str_to_date(substr(table_name,7),'%m-%d') asc limit {limit[2]}"""
cursor.execute(SQL)
list2 = []
for i in range(1, 10000):data = cursor.fetchone()# 因存储过程中查询嵌套的子查询为12条,所以数据为第13条时退出if data is None or i == 13:breakelse:# 此时循环每组元组的第一个索引存储到列表中,此处写循环是为了方便修改for j in range(1, 2):list2.append(data[j-1])
shares = list2
print(shares)
# 关闭数据库连接
db.close()

4.matplotlib可视化处理

# 以figure外框,axes内框创建多维窗口
fig, ax = plt.subplots()
# 计算平均值
means = sum(sorted(rise_num)[1:-1])/len(rise_num[1:-1])
b = ax.bar(shares, rise_num, label='{}'.format(means))
for a, b in zip(shares, rise_num):ax.text(a, b+1, b, ha='center', va='bottom')plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False   # 用来正常显示负号
plt.ylabel(f"市场当日涨幅大于{Rise}的股票数量")
plt.title(f"市场当日涨幅大于{Rise}的数量对比")
# 条形图默认宽为0.8,因使用了zip此处不需要矫,xs这条可以不用,所以这里+0.0
xs = [i + 0.0 for i, _ in enumerate(shares)]
# 使名字标记x轴,位置在x轴上条形中心
plt.xticks(xs, shares)
plt.plot(shares, rise_num, 'o')
plt.plot(xs, rise_num, 'k-.')  # 黑色虚线
plt.legend()
# 保存图片
plt.savefig(f'{shares[0]}~{shares[-1]}涨幅大于{Rise}股票数量.png')
plt.show()

五.完整代码:

# _*_ coding:utf-8 _*_
# @Time    : 2022/9/13 22:26
# @Author  : ice_Seattle
# @File    : 股票离散涨幅数量对比.py
# @Software: PyCharmimport MySQLdb
import matplotlib.pyplot as plt
# 打开数据库连接
db = MySQLdb.connect("localhost", "root", "489000", "shares2022", charset='utf8')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取一条数据
version = cursor.fetchone()
print("Database version : %s " % version)
# 设置要查询>=Rise的股票的临界值
Rise = 5
sql = f"""CALL rnc_2('{Rise}')"""
cursor.execute(sql)
# 定义列表, 循环下标
list1 = []
for i in range(1, 10000):data = cursor.fetchone()if data is None:breakelse:for j in range(1, 13):list1.append(data[j-1])
rise_num = list1
# 定义变量,将数据库名赋给所定义的变量
database = 'shares2022'
# 定义 limit 分页操作的组数
limit_group = 12
list_m = []
list_n = []def limit_m(m):for k in range(0, m, limit_group):list_m.append(str(k))return list_mdef limit_n(n):for k in range(0, len(m)):list_n.append(f',{str(n)}')return list_nlimit = []
m = limit_m(601)
n = limit_n(limit_group)for i in range(0, len(m)):limit.append(m[i]+n[i])
print(limit)
# SQL语句预处理,获取某个数据库中以shares所匹配到的所有表名,并将表的末端字符串转换为日期格式升序排序
SQL = f"""select substr(table_name,7) from information_schema.tables
where table_schema= '{database}' and table_name regexp 'shares'
order by str_to_date(substr(table_name,7),'%m-%d') asc limit {limit[2]}"""
cursor.execute(SQL)
list2 = []
for i in range(1, 10000):data = cursor.fetchone()# 因存储过程中查询嵌套的子查询为12条,所以数据为第13条时退出if data is None or i == 13:breakelse:# 此时循环每组元组的第一个索引存储到列表中,此处写循环是为了方便修改for j in range(1, 2):list2.append(data[j-1])
shares = list2
print(shares)
# 关闭数据库连接
db.close()# 以figure外框,axes内框创建多维窗口
fig, ax = plt.subplots()
# 计算平均值
means = sum(sorted(rise_num)[1:-1])/len(rise_num[1:-1])
b = ax.bar(shares, rise_num, label='{}'.format(means))
for a, b in zip(shares, rise_num):ax.text(a, b+1, b, ha='center', va='bottom')plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False   # 用来正常显示负号
plt.ylabel(f"市场当日涨幅大于{Rise}的股票数量")
plt.title(f"市场当日涨幅大于{Rise}的数量对比")
# 条形图默认宽为0.8,因使用了zip此处不需要矫,xs这条可以不用,所以这里+0.0
xs = [i + 0.0 for i, _ in enumerate(shares)]
# 使名字标记x轴,位置在x轴上条形中心
plt.xticks(xs, shares)
plt.plot(shares, rise_num, 'o')
plt.plot(xs, rise_num, 'k-.')  # 黑色虚线
plt.legend()
# 保存图片
plt.savefig(f'{shares[0]}~{shares[-1]}涨幅大于{Rise}股票数量.png')
plt.show()

matplotlib直方图统计mysql数据库中的股票离散涨幅数量情况相关推荐

  1. SQL:统计一个数据库中所有表记录的数量

    最近公司的数据库发现有表的数据被弄掉了,有些数据表记录为0,于是想找出此数据库中到底有哪些数据表的记录都为0以缩小分析范围,可使用如下的SQL Statement: CREATE   TABLE    ...

  2. jsp写入mysql数据库乱码_JSP写入MySQL数据库中出现乱码问题笔记

    1.在数据库链接字符串上要形如:jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8(注意要加chara ...

  3. python excel模板 生成excel表格_python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图...

    python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 #coding=utf-8 from openpyxl importload_workbookfro ...

  4. 用 Python selenium爬取股票新闻并存入mysql数据库中带翻页功能demo可下载

    用 Python selenium爬取实时股票新闻并存入mysql数据库中 1.分析需求 2.创建表 3.分析需要爬取的网页内容 4.python里面selenium进行爬虫操作 1.添加包 2.连接 ...

  5. mysql数据库特征_如何掌握MySQL数据库中动态表的特征

    以下的文章主要介绍的是如何正确掌握MySQL数据库中动态表的特征,可以说动态表在MySQL数据库中使用频率还是很大的,所以MySQL数据库中动态表的掌握也是一件很重要的事情,以下就是文章的具体内容. ...

  6. mysql数据库中到底能建多少张表?(单实例下单个库)

    单实例mysql数据库中到底能建多少张表? 业务两个同学今天就这个问题过来探讨,他们的诉求是: 1. 一个用户的表要全部放到一个数据库中. 2. 预计1000个用户每个用户初步规划1000张表. 这1 ...

  7. python爬取玉米、小麦、水稻信息数据到本地为网页形式和mysql数据库中

    1.创建Scrapy项目 scrapy startproject ExGrain 2.进入项目目录,使用命令genspider创建Spider scrapy genspider exgrain ex- ...

  8. MySQL数据库中arg函数_【松勤教育】MySQL之常用函数介绍

    mysql函数: MySQL数据库中提供了很丰富的函数.MySQL函数包括聚集函数.字符串函数.日期和时间函数.条件判断函数.系统信息函数.加密函数.格式化函数等.通过这些函数,可以简化用户的操作.下 ...

  9. 在MySql数据库中创建数据库dbjava,数据表book,字段包括bno,bname,price,count(编号、书名、单价、数量)。 利用JDBC连接数据库dbjava,实现数据表的增删 改查

    题目 1.在MySql数据库中创建数据库dbjava,数据表book,字段包括bno,bname,price,count(编号.书名.单价.数量). 2.利用JDBC连接数据库dbjava,实现数据表 ...

最新文章

  1. 如何测量PN中的耗散层两边的电位差?
  2. python学习音频-Python学习笔记--音频处理
  3. ArcGIS怎样获取重分类后各类所占的像元个数
  4. 轩逸车联网功能怎么用_北斗已建设完成,那“北斗导航”怎么用?“短报文功能”怎么用?...
  5. Python字典(Dictionary)的setdefault()方法的详解,字典中的赋值技巧
  6. Atitit office Ooxml excel标准的主要内容 目录 1.1. 物理存储 zip+文件夹包+xml 1 1.2. Package Structure 1 1.3. 内容部分 1
  7. 推荐几个很好的资源下载网站
  8. 宏基aspire拆机触摸_宏基(acer)Aspire 4930G拆机教程
  9. D3D11 自由视角相机
  10. 抖音多闪背后的AI和社交
  11. 2022软考[嵌入式系统设计师]大纲
  12. 升级wamp的php版本,Wamp升级PHP版本
  13. 员工辞职的真正原因:更想远离这样的领导,而不是这家公司
  14. python练习39:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
  15. 如何用手机APP实现PLC远程监控
  16. 2021高考成绩特长生查询,2021高考体育生分数怎么算 体育四项评分标准及分值一览表...
  17. 怎么查看CAD图纸并更改图纸背景颜色?
  18. 通过windows官网工具制作win10启动盘并安装win10系统
  19. 统计并输出空格或回车、数字字符和其他字符的个数。
  20. 3G门户手机浏览器试用感受

热门文章

  1. C++资源之不完全导引 [下] / 曾毅 陶文
  2. Matlab中disp函数的使用
  3. Linux 目录结构及主要内容
  4. 国标流媒体-H265摄像头如何实现网页直播
  5. HTML-CSS-JavaScript综合
  6. html 设置距离左边,js怎样设置div层左边距 及与顶部边距
  7. 徐萌:我的豆瓣、微软、搜狗产品之路
  8. 容易保:这些保险常识你都了解吗?
  9. 第015封“情书”泥什么意思?houdini Mandelbrot曼德布罗特集合)
  10. C# 加密狗 超级狗 加密程序 程序授权示例 程序授权验证