Python分析一下双色球,中大奖指日可待

一、需求简介

之前偶然见到一位网友提出了关于双色球数据的分析需求,感觉颇有趣味,便着手操作了一番。如下为某双色球发布站的页面,可以看到每期会产生红/蓝两种颜色的数字,其中红球为 33 选 6,蓝球为 16 选 1,一共是从 49 个球中选 7 个。假如想对某一色号球下注,比如红1 球,要先分析一下该球以往的产出情况。
在这里插入图片描述
可以从以下 3 个方面来分析,以史明鉴,看看最新一期是否值得选取该球:

1、遗漏情况

统计遗漏 n 期后命中的次数,如上图:遗漏 1 期后中的次数有 2 次,遗漏 2 期后中的次数有 1 次,遗漏 5 期后中的次数有 2 次,遗漏 7 期后中的次数有 1 次。
在这里插入图片描述

2、连续重号情况

如图,连续重号 3 期的有 1 次。
在这里插入图片描述

3、重号前的遗漏情况

如图,重号前遗漏 2 期的有 1 次。
在这里插入图片描述

二、源数据

节选源数据如下,数据是以 html 表格形式储存的,<td> 标签中 class=“yl01” 表示未命中,class=“chartBall01” 表示命中红球,class=“chartBall02” 表示命中蓝球(文末获取近 100 期数据样本)。

					<tr><td class="c_fbf5e3 bd_rt_a">2021090</td><td class="yl01" style="font-size:xx-small">1</td><td class="yl01" style="font-size:xx-small">1</td><td class="yl01" style="font-size:xx-small">8</td><td class="yl01" style="font-size:xx-small">2</td><td class="chartBall01">05</td><td class="chartBall01">06</td><td class="yl01" style="font-size:xx-small">1</td><td class="yl01" style="font-size:xx-small">4</td><td class="yl01" style="font-size:xx-small">6</td><td class="yl01" style="font-size:xx-small">4</td><td class="yl01" style="font-size:xx-small">5</td><td class="chartBall01">12</td><td class="yl01" style="font-size:xx-small">1</td><td class="chartBall01">14</td><td class="yl01" style="font-size:xx-small">2</td><td class="yl01" style="font-size:xx-small">2</td><td class="yl01" style="font-size:xx-small">13</td><td class="yl01" style="font-size:xx-small">9</td><td class="yl01" style="font-size:xx-small">2</td><td class="yl01" style="font-size:xx-small">5</td><td class="yl01" style="font-size:xx-small">6</td><td class="yl01" style="font-size:xx-small">9</td><td class="yl01" style="font-size:xx-small">1</td><td class="yl01" style="font-size:xx-small">1</td><td class="yl01" style="font-size:xx-small">7</td><td class="yl01" style="font-size:xx-small">2</td><td class="chartBall01">27</td><td class="chartBall01">28</td><td class="yl01" style="font-size:xx-small">4</td><td class="yl01" style="font-size:xx-small">13</td><td class="yl01" style="font-size:xx-small">12</td><td class="yl01" style="font-size:xx-small">8</td><td class="yl01" style="font-size:xx-small">7</td><td class="v_line"></td><td class="yl01" style="font-size:xx-small">4</td><td class="yl01" style="font-size:xx-small">5</td><td class="yl01" style="font-size:xx-small">42</td><td class="yl01" style="font-size:xx-small">3</td><td class="yl01" style="font-size:xx-small">8</td><td class="yl01" style="font-size:xx-small">2</td><td class="yl01" style="font-size:xx-small">16</td><td class="chartBall02">08</td><td class="yl01" style="font-size:xx-small">10</td><td class="yl01" style="font-size:xx-small">13</td><td class="yl01" style="font-size:xx-small">54</td><td class="yl01" style="font-size:xx-small">1</td><td class="yl01" style="font-size:xx-small">11</td><td class="yl01" style="font-size:xx-small">31</td><td class="yl01" style="font-size:xx-small">18</td><td class="yl01" style="font-size:xx-small">25</td></tr><tr><td class="c_fbf5e3 bd_rt_a">2021091</td><td class="yl01" style="font-size:xx-small">2</td><td class="yl01" style="font-size:xx-small">2</td><td class="yl01" style="font-size:xx-small">9</td><td class="chartBall01">04</td><td class="yl01" style="font-size:xx-small">1</td><td class="chartBall01">06</td><td class="yl01" style="font-size:xx-small">2</td><td class="yl01" style="font-size:xx-small">5</td><td class="yl01" style="font-size:xx-small">7</td><td class="yl01" style="font-size:xx-small">5</td><td class="yl01" style="font-size:xx-small">6</td><td class="yl01" style="font-size:xx-small">1</td><td class="yl01" style="font-size:xx-small">2</td><td class="yl01" style="font-size:xx-small">1</td><td class="yl01" style="font-size:xx-small">3</td><td class="chartBall01">16</td><td class="yl01" style="font-size:xx-small">14</td><td class="yl01" style="font-size:xx-small">10</td><td class="yl01" style="font-size:xx-small">3</td><td class="yl01" style="font-size:xx-small">6</td><td class="yl01" style="font-size:xx-small">7</td><td class="yl01" style="font-size:xx-small">10</td><td class="yl01" style="font-size:xx-small">2</td><td class="chartBall01">24</td><td class="yl01" style="font-size:xx-small">8</td><td class="chartBall01">26</td><td class="yl01" style="font-size:xx-small">1</td><td class="yl01" style="font-size:xx-small">1</td><td class="yl01" style="font-size:xx-small">5</td><td class="yl01" style="font-size:xx-small">14</td><td class="yl01" style="font-size:xx-small">13</td><td class="yl01" style="font-size:xx-small">9</td><td class="chartBall01">33</td><td class="v_line"></td><td class="yl01" style="font-size:xx-small">5</td><td class="yl01" style="font-size:xx-small">6</td><td class="yl01" style="font-size:xx-small">43</td><td class="yl01" style="font-size:xx-small">4</td><td class="yl01" style="font-size:xx-small">9</td><td class="yl01" style="font-size:xx-small">3</td><td class="yl01" style="font-size:xx-small">17</td><td class="yl01" style="font-size:xx-small">1</td><td class="yl01" style="font-size:xx-small">11</td><td class="yl01" style="font-size:xx-small">14</td><td class="yl01" style="font-size:xx-small">55</td><td class="yl01" style="font-size:xx-small">2</td><td class="yl01" style="font-size:xx-small">12</td><td class="yl01" style="font-size:xx-small">32</td><td class="yl01" style="font-size:xx-small">19</td><td class="chartBall02">16</td></tr>

三、解析实现

1、数据结构

为了便于表示球的命中与颜色、数值,我们可以按以下规则映射:
在这里插入图片描述
那么先用美丽汤把需要的内容捞出来,把所有 <td> 标签中表示名字与色号的内容取出,按上述规则映射表示。

soup = BeautifulSoup(res_table, "html.parser")
item_lst = []
for td in soup.find_all('td'):cls = td['class'][0]num = td.stringif cls in ['yl01', 'chartBall01', 'chartBall02']:item_lst.append('-'.join([cls, num]))
print(item_lst[:10])

输出前 10 个预览如下:

[‘yl01-3’, ‘yl01-5’, ‘chartBall01-03’, ‘yl01-5’, ‘yl01-1’, ‘yl01-5’, ‘chartBall01-07’, ‘yl01-9’, ‘yl01-6’, ‘yl01-6’]

但这仅仅是一个超长列表,在此基础上处理起来还找不到头绪,至少要转变成和网页上结构一致的矩阵才好理解吧,那么可以想到利用 numpy 矩阵。先是用 np.array 将普通列表转为 numpy 数组,再利用 reshape 将一维数组转为二维数组,即 100 期 X 49 个球的矩阵。

array = np.array(item_lst).reshape(100, 49)

如图,numpy 矩阵的每一行与原页面结构对应。
在这里插入图片描述
但我们想要进行的是纵向比较分析,比较各期之间的关系,所以还需要再对矩阵进行行列转置。

array_T = array.T  # 矩阵转置,一个元素对应一列

在这里插入图片描述
此时,array_T 中的每一个元素即表示某一色号的近 100 期情况。如果想看红1 球,则是 array_T[0];如果想看红2 球,则是 array_T[1];如果想看蓝1 球,则是 array_T[33](因为红球总共有 33 个,故第一个蓝球列的索引为 33)。为了便于选球,我们可以写一个映射方法:

def trans_col(txt):  # 翻译列索引号,如红1=0,红33=32,蓝1=33,蓝16=48if "红" in txt:col = int(txt.replace('红', '')) - 1else:col = int(txt.replace('蓝', '')) + 32return col

接下来就可以正式开始实现统计分析的需求啦!

2、遗漏统计

将转置矩阵和指定色号球所在列传入,获取该列后加入一个结束标记,因至少要出现 1 次未命中 +1 次命中才判定为遗漏 1 期,所以从该列的第二项数据开始判断,若其不等于前一项的值,且当前项为命中,则记录前一项的值(遗漏期数)。之后将记录列表中的表示遗漏的标记 yl01 去除,仅保留期数。

def fun_miss(array, col):  # 统计该列中遗漏后命中的次数line = array[col].tolist()order_grp = []for i, v in enumerate(line):if i > 0:if v != line[i - 1] and 'chart' in v:order_grp.append(line[i - 1])order_grp = [i.replace('yl01-', '') for i in order_grp]c = dict(Counter(order_grp))result = sorted(c.items(), key=lambda x: int(x[0]))for i in result:print(f"遗漏{i[0]}期后中的次数有{i[1]}次")fun_miss(array_T, trans_col("红1"))  # 执行

在这里插入图片描述
统计排序后输出如下:

遗漏1期后中的次数有4次
遗漏2期后中的次数有2次
遗漏3期后中的次数有3次
遗漏5期后中的次数有2次
遗漏7期后中的次数有2次
遗漏8期后中的次数有1次
遗漏9期后中的次数有2次
遗漏13期后中的次数有1次

3、连续重号统计

与遗漏统计相同,传入两个参数,先确定要选取的色号列。当前项等于前一项,且当前项为命中时表示重号,连续重号时 count 计数 +1,当出现不满足重号条件时表示连续重号中断,记录连续次数,并将计数清零,待下一轮重号出现时重新计数。

def fun_repeat(array, col):  # 统计该列中的重号次数line = array[col].tolist()count_grp = []count = 0for i, v in enumerate(line):if i > 0:if v == line[i-1] and 'chart' in v:count += 1elif count > 0:count_grp.append(count)count = 0c = dict(Counter(count_grp))result = sorted(c.items(), key=lambda x: x[0])for i in result:print(f"连续重号{i[0]}次的有{i[1]}次")fun_repeat(wt, trans_col("红2"))  # 执行

在这里插入图片描述
统计排序后输出如下:

连续重号1次的有1次
连续重号2次的有1次

4、重号前的遗漏统计

因要出现重号+遗漏才算入,所以至少从第三项数据开始判定。

def fun_return(array, col):  # 统计该列中重号前的遗漏次数line = array[col].tolist()order_grp = []for i, v in enumerate(line):if i > 1:if v == line[i - 1] and v != line[i - 2] and 'chart' in v:order_grp.append(line[i - 2])order_grp = [i.replace('yl01-', '') for i in order_grp]c = dict(Counter(order_grp))result = sorted(c.items(), key=lambda x: int(x[0]))for i in result:print(f"重号前遗漏{i[0]}期的有{i[1]}次")fun_return(wt, trans_col("红1"))  # 执行

在这里插入图片描述
统计排序后输出如下:

重号前遗漏2期的有1次

四、小结

源数据自取:度盘,提取码:1gla
完整分析代码如下:

from bs4 import BeautifulSoup
import numpy as np
from collections import Counterdef get_array(res_table):  # 获取转置矩阵soup = BeautifulSoup(res_table, "html.parser")item_lst = []for td in soup.find_all('td'):cls = td['class'][0]num = td.stringif cls in ['yl01', 'chartBall01', 'chartBall02']:item_lst.append('-'.join([cls, num]))array = np.array(item_lst).reshape(100, 49)array_T = array.Treturn array_Tdef trans_col(txt):  # 翻译列索引号,如红1=0,红33=32,蓝1=33,蓝16=48if "红" in txt:col = int(txt.replace('红', '')) - 1else:col = int(txt.replace('蓝', '')) + 32return coldef fun_miss(array, col):  # 统计该列中遗漏后命中的次数line = array[col].tolist()order_grp = []for i, v in enumerate(line):if i > 0:if v != line[i - 1] and 'chart' in v:order_grp.append(line[i - 1])order_grp = [i.replace('yl01-', '') for i in order_grp]c = dict(Counter(order_grp))result = sorted(c.items(), key=lambda x: int(x[0]))for i in result:print(f"遗漏{i[0]}期后中的次数有{i[1]}次")def fun_repeat(array, col):  # 统计该列中的重号次数line = array[col].tolist()count_grp = []count = 0for i, v in enumerate(line):if i > 0:if v == line[i-1] and 'chart' in v:count += 1elif count > 0:count_grp.append(count)count = 0c = dict(Counter(count_grp))result = sorted(c.items(), key=lambda x: x[0])for i in result:print(f"连续重号{i[0]}次的有{i[1]}次")def fun_return(array, col):  # 统计该列中重号前的遗漏次数line = array[col].tolist()order_grp = []for i, v in enumerate(line):if i > 1:if v == line[i - 1] and v != line[i - 2] and 'chart' in v:order_grp.append(line[i - 2])order_grp = [i.replace('yl01-', '') for i in order_grp]c = dict(Counter(order_grp))result = sorted(c.items(), key=lambda x: int(x[0]))for i in result:print(f"重号前遗漏{i[0]}期的有{i[1]}次")if __name__ == '__main__':with open("res_table.txt", "r", encoding="utf-8-sig") as f:r = f.read()wt = get_array(r, 100)choose = "红1"fun_miss(wt, trans_col(choose))fun_repeat(wt, trans_col(choose))fun_return(wt, trans_col(choose))

emmmm…不过如此看来,单单分析一个球是不够滴,还要和其他色号深入对比,有兴趣的同学自己尝试吧哈哈哈!~这里是我命由天不由我的 Seon塞翁,下篇再见!

温馨提示:赌博有风险,本文仅做数据处理技术讨论,不构成任何资金投入建议!不要怪我标题党啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18519.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新中国福彩分析大数据分析大师拥有双色球数据展示微信小程序源码支持双色球数据分析多个接口

demo软件园每日更新资源,请看到最后就能获取你想要的: 1.最新中国福彩分析大数据分析大师拥有双色球数据展示微信小程序源码支持双色球数据分析多个接口 福彩大数据分析小程序&#xff0c;数据来自于中国福利彩票 拥有双色球数据展示 双色球数据分析多个接口 数据有每日奖金和…

足球大数据分析大小球胜平负的技巧与经验实例附分析软件

前阵子熬夜看欧冠&#xff0c;利物浦 3-0 击败巴萨晋级决赛&#xff0c;赛后一个同为球迷的朋友问我“现在大数据能分析足球比赛的胜平负或者大小球吗&#xff1f;” 我一听&#xff0c;没有做很肯定的回答。早些世界杯的时候&#xff0c;百度体育运用大数据的技术预测过&…

XT.COM 直播间第106期 | VGO XT.COM AMA 专场

举办方&#xff1a;XT.COM 嘉宾&#xff1a;Lalin Hugo - 创始人 奖励&#xff1a;100 USDT提问奖励&#xff5e; 时间&#xff1a;11月23日 17:00&#xff08;UTC 8&#xff09; AMA直播间&#xff1a; XT.COM官方电报英文社区 XT.COM官方电报中文社区 AMA详情&#x…

微信直播聊天室架构演进

聊天室概述 随着直播和类直播场景在微信内的增长&#xff0c;业务对临时消息通道的需求日益增长&#xff0c;聊天室组件应运而生。聊天室组件是一个基于房间的临时消息信道&#xff0c;主要提供消息收发、在线状态统计等功能。 1500w在线的挑战 视频号直播上线后&#xff0c;在…

XT.COM直播间第109期 | CDT XT.COM AMA 专场

举办方&#xff1a;XT.COM 嘉宾&#xff1a;Kelyan - CheckDot CTO 奖励&#xff1a;100 USDT提问奖励&#xff5e; 时间&#xff1a;11月29日 15:00&#xff08;UTC 8&#xff09; AMA直播间&#xff1a; XT.COM官方电报英文社区 XT.COM官方电报中文社区 AMA详情&…

入门与 Follow GPT 的路径分析:LLM 道阻且长,行则将至

动手点关注 干货不迷路 作为 CEO&#xff0c;Sam 将 OpenAI 的内部氛围组织的很好&#xff0c;有位 OpenAI 的前员工告诉拾象团队&#xff0c;当 2018 年 GPT-2 的论文被驳回时&#xff0c;Sam 在团队周会上将拒信的内容朗读给所有员工&#xff0c;并告诉大家在通往成功的路上总…

【ChatGPT】如何入门GPT并快速follow当前的大语言模型LLM进展?

如何入门GPT并快速follow当前的大语言模型LLM进展? 自从去年chatGPT悄悄发布,OpenAI发布的GPT系列工作也变得炙手可热,而基于此,各家公司/实验室百家争鸣,纷纷发布自己的工作,可以说每天都有新的进展。 在当前的情况下,要如何入门GPT系列生成模型,并快速跟进SOTA进展…

ChatGPT 的技术和算法需要支撑怎样的架构和基础设施?

ChatGPT的技术和算法需要一些特定的基础设施和架构的支持&#xff0c;以确保它的性能和可靠性。 以下是支撑ChatGPT的可能的架构和基础设施&#xff1a; 1. 大数据处理与高速缓存&#xff1a;ChatGPT需要处理大量的输入数据&#xff0c;这些数据需要经过处理和优化&#xff0c…

自己动手做chatgpt:解析gpt底层模型transformer的输入处理

前面我们完成了一些基本概念&#xff0c;如果你对深度学习的基本原理还不了解&#xff0c;你可以通过这里获得更多信息&#xff0c;由于深度学习的教程汗牛充栋&#xff0c;因此我在这里不会重复&#xff0c;而是集中精力到chatgpt模型原理的分析&#xff0c;实现和实践上。Cha…

成功获取QQ音乐的MV视频(内含视频接口)

1.跨域接口 webpack.base.conf.js文件&#xff1a; const devWebpackConfig merge(baseWebpackConfig, { ...devServer: {clientLogLevel: warning,...watchOptions: {poll: config.dev.poll,},before(app) {app.get(/api/getPlaySongVkey, function (req, res) {var url h…

音乐 组件 (音频, 视频)

目的功能: axios 请求获取歌曲的 url 以及 封面照片切换歌曲歌单的展示 演示: 网易云音乐接口 github地址 https://github.com/Binaryify/NeteaseCloudMusicApi安装 git clone gitgithub.com:Binaryify/NeteaseCloudMusicApi.git在他的目录下 npm install运行 node ap…

音乐聊天室小程序

真正的大师,永远都怀着一颗学徒的心&#xff01; 一、项目简介 今天推荐的这个项目是音乐聊天室&#xff0c;有小程序版&#xff0c;uniapp版和pc版&#xff0c;前后端均开源了&#xff0c;并且有详细的api和部署文档&#xff0c;可以学习了&#xff01; 二、实现功能 普通文字…

实验探索: ChatGPT是好的推荐系统吗?

TLDR&#xff1a; 之前我们简单测试了下ChatGPT作为推荐器在序列推荐和可解释推荐上的能力&#xff0c;即如何利用ChatGPT实现推荐模型的能力&#xff1f;今天再跟大家分享一篇通过实验来探究ChatGPT通用推荐能力的文章&#xff0c;其在评分预测、序列推荐、直接推荐、解释生成…

好货推荐——好用的ChatGPT

成果图如下&#xff1a; 这个是Microsoft Edge浏览器的一个扩展插件&#xff0c;然后我们下面来操作一下怎么获取并使用这个插件 然后回到管理扩展界面打开webtab 然后他就会自己弹出webtab界面如下图&#xff1a; 然后点击Chat AI即可使用了&#xff0c;不过现在要登录账号才能…

[Unity] 使用 Visual Effect Graph 制作射击枪焰特效

全程照抄油管视频 https://www.youtube.com/watch?vsgBbnF3r60U&ab_channelGabrielAguiarProd. 1. Mesh 制作 打开 Blender 新建一个圆环 进入编辑模式&#xff0c;全选&#xff0c;沿法向挤出&#xff0c;向内挤出 得到一个环 环的内径很小 选中一个面 选择光照贴图拼…

影视特效合成140多种枪火炸弹爆炸破视频素材 BigVFX Starter Pack

素材简介 这是一套特效合成视频素材&#xff0c;包含类别爆炸物&#xff0c;爆照冲击波&#xff0c;闪电&#xff0c;巨大的爆炸&#xff0c;流星坠落&#xff0c;破坏&#xff0c;光剑&#xff0c;光柱&#xff0c;闪电、倒塌&#xff0c;地面塌陷&#xff0c;爆炸&#xff0c…

如何给视频添加特效?快速制作特效视频

如何给视频添加特效&#xff1f;现如今几乎我们人人每天都在与短视频打交道&#xff0c;有些人在日常的生活中也会剪辑一些短视频。其实剪辑短视频并没有你想象中的那么困难。只是需要找到一款合适的软件就可以很快完成。在短视频剪辑中就有需要给短视频添加特效的操作&#xf…

免费开源剪辑软件Shotcut推荐和使用教程

shotcut是一个免费、开源、跨平台的视频编辑软件&#xff0c;功能丰富强大&#xff0c;能够满足绝大多数情况下对视频编辑的需求&#xff0c;下面看看它如何使用吧。 下载软件 去官网下载软件&#xff0c;支持Linux、MacOS和Windows平台。 下载地址 打开软件 不同的平台有不…

Mac精品应用推荐:专业的后期特效制作软件

什么是影视后期&#xff1f;影视后期具体指什么&#xff1f; 影视后期制作就是对拍摄完的影片或者软件制作的动画&#xff0c;做后期的处理&#xff0c;使其形成完整的影片&#xff0c;包括加特效&#xff0c;加文字&#xff0c;并且为影片制作声音等。后期软件具体可以分为平…

chatgpt赋能Python-python自动化办公真的有用吗_知乎

简介 如今&#xff0c;Python作为一种必学的编程语言&#xff0c;已经走进了各行各业的办公场景。Python自动化办公也逐渐成为了一个热门话题&#xff0c;很多人开始使用Python来进行一些机械化、重复性的办公工作&#xff0c;例如数据清洗、文本处理、文件管理、自动发送邮件…