步骤

1.获得数据
2.清洗保存数据
3.读取数据并可视化
4.得出结论

首先,简单说下国民彩票双色球的规则:选6位数字作为红球和1位数字作为篮球组成一注彩票,红球的区间是1~33,蓝球的区间是1 ~ 16。篮球+红球与开奖号码相同的个数决定中奖的金额。
其中的单式,复式等玩法就不展开了,这里主要复习爬虫和可视化

1.获取数据

毋庸置疑,有数据才能分析。这里的数据来源有两个:一是自己写爬虫获取,二是到 Kaggle 下载,作者已经把数据上传到Kaggle了,下载即用。
这里简单说下Kaggle, 这个网站有各种各样的数据,而且都是处理好的(波斯顿房价、绝地求生等相关数据),上面的数据都是提供给机器学习的。

回到正题,获取数据的网址:http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html

首先打开网址看看相关的访问规则

这里可以看到开奖号码的HTML源码。这样的标签获取起来有点麻烦,不过问题不大

下面我们再开看看页面切换,URL会有什么变化

作者切换了几页发现,在URL中控制页码的就是其中的 ‘list_’,这里就好办了。
下面我们可以来写敲代码写爬虫了

 res = requests.get(url1,headers = headers)soup = BeautifulSoup(res.text,'lxml')item = soup.find_all('td',{'style':'padding-left:10px;'})

这里爬虫的基础request,BeautifuleSoup就不过多展开了。
上文说到的HTML源码获取起来很麻烦,因为它都在不同的标签并且红球和篮球的标签是一样的,不同的就是属性。作者尝试过按属性来获取篮球,但是不知道为什么没有返回数据。所以先把整个大的标签拿下来。

for num in item:a = num.find_all('em')[0].get_text()red_one.append(a)a = num.find_all('em')[1].get_text()red_two.append(a)a = num.find_all('em')[2].get_text()red_three.append(a)a = num.find_all('em')[3].get_text()red_four.append(a)a = num.find_all('em')[4].get_text()red_five.append(a)a = num.find_all('em')[5].get_text()red_six.append(a)a = num.find_all('em')[6].get_text()blue.append(a)

可以看到这里是按List的位置来获取红球的每一位和篮球。获取有更好的方法,可以下方留言一起探讨!

2.清洗保存数据

这里用到比较实用和强大的一个库 Pandas,因为把数据存为CSV格式,方便后面的可视化
下面来看代码实现:

dataframe=pd.DataFrame({'red_one':red_one,'red_two':red_two,'red_three':red_three,'red_four':red_four,'red_five':red_five,'red_six':red_six,'blue':blue})
dataframe.to_csv('data.csv',sep=',')

比较简单,下面来看看成功保存的数据长什么样:

一共获取了2400+条数据左右,大概是2003年到2019年8月的数据

3,数据可视化分析

这里用到一个库 matplotlib
下面我们把每一位的数据以条形图来展示。因为代码有重复性,所以这里就贴蓝球的

import pandas as pd
import matplotlib.pyplot as plt# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['KaiTi']
# 读取数据并去掉第一列
datasets = pd.read_csv(r'data.csv')
x_data = datasets['date']
data = datasets.iloc[:,1:]# 查看篮球各数字的个数
num_data = data['blue'].value_counts()
print(num_data)
# 横坐标,这里以打印出来的为准
x = ['12','11','9','16','14','7','1','15','13','5','6','10','3','4','2','8']
bar = plt.bar(x,num_data,color = 'blue')
plt.xlabel('号码',fontsize = 15)
plt.ylabel('频率/次',fontsize = 15)
plt.title('篮球',fontsize = 20)
# 在条形图上标注次数
for num in bar :height = num.get_height()plt.text(num.get_x() + num.get_width() / 2, height + 1, str(height), ha="center", va="bottom")
plt.show()

下面来看画出来的各位数字的详情:

红球第一位:

红球第二位:

红球第三位:

红球第四位:

红球第五位:

红球第六位:

蓝球:

4.得出结论

从红球的图中可以看到中奖号码的出现频率分布情况,相信读者都能一眼看出来。这里就不费篇幅了。
蓝色球的中奖号码分布比较均匀,所以没啥结论。

5.完整代码

获取数据:

from bs4 import BeautifulSoup
import requests
import pandas as pd
import time
# 控制页码
url = ['http://kaijiang.zhcw.com/zhcw/html/ssq/list_{}.html'.format(str(i)) for i in range (1,123,1)]
#url = 'http://kaijiang.zhcw.com/zhcw/html/ssq/list_4.html'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36','Host':'kaijiang.zhcw.com','Upgrade-Insecure-Requests':'1'
}
# 一列表的方式分开存取每一位数据
red_one = []
red_two = []
red_three = []
red_four = []
red_five = []
red_six = []
blue = []
def get_text(url1):res = requests.get(url1,headers = headers)soup = BeautifulSoup(res.text,'lxml')item = soup.find_all('td',{'style':'padding-left:10px;'})for num in item:a = num.find_all('em')[0].get_text()red_one.append(a)a = num.find_all('em')[1].get_text()red_two.append(a)a = num.find_all('em')[2].get_text()red_three.append(a)a = num.find_all('em')[3].get_text()red_four.append(a)a = num.find_all('em')[4].get_text()red_five.append(a)a = num.find_all('em')[5].get_text()red_six.append(a)a = num.find_all('em')[6].get_text()blue.append(a)# 存为CSVdataframe = pd.DataFrame({'red_one':red_one,'red_two':red_two,'red_three':red_three,'red_four':red_four,'red_five':red_five,'red_six':red_six,'blue':blue})dataframe.to_csv('data.csv',sep=',')time.sleep(2)print('成功一次')
# 按页数循环控制
for url1 in url:get_text(url1)print("结束")

可视化代码:

import pandas as pd
import matplotlib.pyplot as plt# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['KaiTi']
# 读取数据并去掉第一列
datasets = pd.read_csv(r'data.csv')
x_data = datasets['date']
data = datasets.iloc[:,1:]# 查看篮球各数字的个数
num_data = data['blue'].value_counts()
print(num_data)
# 横坐标,这里以打印出来的为准
x = ['12','11','9','16','14','7','1','15','13','5','6','10','3','4','2','8']
bar = plt.bar(x,num_data,color = 'blue')
plt.xlabel('号码',fontsize = 15)
plt.ylabel('频率/次',fontsize = 15)
plt.title('篮球',fontsize = 20)
# 在条形图上标注次数
for num in bar :height = num.get_height()plt.text(num.get_x() + num.get_width() / 2, height + 1, str(height), ha="center", va="bottom")
plt.show()

6.总结

双色球的随机性很强,几乎无法预测。当然,作者认为这里的图中中奖号码的分布情况,对于真实购买双色球有一定的参考性,总比自己瞎蒙好吧!
本文仅是对爬虫、pandas、matplotlib基础知识的复习和运用。
对于预测双色球,下一篇会以机器学习的方法来尝试。
感谢阅读!

Matplotlib可视化预测双色球相关推荐

  1. matplotlib可视化_使用Matplotlib改善可视化设计的5个魔术技巧

    matplotlib可视化 It is impossible to know everything, no matter how much our experience has increased o ...

  2. 数据科学 IPython 笔记本 8.3 Matplotlib 可视化

    8.3 Matplotlib 可视化 原文:Visualization with Matplotlib 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册> ...

  3. Python访问街区所有节点最短路径问题,并结合matplotlib可视化

    Python访问街区所有节点最短路径问题,并结合matplotlib可视化 1. 效果图 2. 源码 2.1 5个点全排列(递归+非递归算法) 2.2 python遍历全路径计算距离+matplot可 ...

  4. Python使用matplotlib可视化多个不同颜色的折线图、通过FontProperties为可视化图像配置中文字体可视化、并指定字体大小

    Python使用matplotlib可视化多个不同颜色的折线图.通过FontProperties为可视化图像配置中文字体可视化.并指定字体大小 目录

  5. Python使用matplotlib可视化气泡图、并使用encircle函数自定义多边形圈定可视化图像中的指定区域(Bubble plot with Encircling)

    Python使用matplotlib可视化气泡图.并使用encircle函数自定义多边形圈定可视化图像中的指定区域(Bubble plot with Encircling) 目录

  6. Python使用matplotlib可视化散点图、使用seaborn中的lmplot函数可视化不同分组散点图的最优线性回归拟合曲线(Scatter plot with regression line)

    Python使用matplotlib可视化散点图.使用seaborn中的lmplot函数可视化不同分组散点图的最优线性回归拟合曲线(Scatter plot with linear regressio ...

  7. Python使用matplotlib可视化散点图、使用seaborn中的lmplot函数使用多子图可视化不同分组的散点图最优拟合线性回归曲线

    Python使用matplotlib可视化散点图.使用seaborn中的lmplot函数使用多子图可视化不同分组的散点图最优拟合线性回归曲线(Each regression line in its o ...

  8. Python使用matplotlib可视化散点图、并在可视化图像的底部和右边添加边缘直方图、自定义边缘直方图的色彩(Marginal Histogram)

    Python使用matplotlib可视化散点图.并在可视化图像的底部和右边添加边缘直方图.自定义边缘直方图的色彩(Marginal Histogram) 目录

  9. Python使用matplotlib可视化相关性分析热力图图heatmap、使用seaborn中的heatmap函数可视化相关性热力图(Correllogram)

    Python使用matplotlib可视化相关性分析热力图图heatmap.使用seaborn中的heatmap函数可视化相关性热力图(Correllogram) 目录

最新文章

  1. 三、垃圾收集之判断对象是否存活
  2. 通道注意力改进ECANet
  3. 面试可能遇到的问题总结【二】
  4. OpenCV图像翻转:flip()函数的使用
  5. javascript设计思维
  6. mysql日活统计函数_如何通过简化日活模型,预估一个产品的日活(DAU)?
  7. plsql中文乱码 显示问号
  8. routeChangeSuccess
  9. poj3463 最短路和次短路 计数
  10. GCC的缺陷,由匿名对象引起的内存泄漏
  11. linux初识到入门_系统
  12. 网络安全隐患,中国应发展自已的核心技术
  13. STM32F4开发-新建工程
  14. 图像彩色化方法(基于颜色传递、颜色扩展)
  15. 菜菜的刷题日记 | 215. 数组中的第K个最大元素
  16. grabber.start()获取摄像头数据异常
  17. Python中的字符串下标
  18. linux教程第五版课后答案第六章,linux基础及应用第六章练习题
  19. 物流计算机流程图,物流管理流程图.doc
  20. CSS3实现倒影效果

热门文章

  1. 戴尔电脑遭香港高校联合抵制
  2. Kay-2023.4.18
  3. 第三次自考第一阶段总结
  4. shiro实现APP、web统一登录认证和权限管理
  5. 发现一款比较强大的web打印工具HttpPrinter
  6. MySQL 分表方案及中间件介绍
  7. 《An End-to-End Neural Network for Image Cropping by Learning Composition from Aesthetic Photos》
  8. Web漏洞之SSRF攻击汇总
  9. 暴雪机器人消防_消防机器人技术在消防中的使用
  10. Windows下 YOLOv5配置、部署、及遇到的问题