python+matlab:统计双色球出号分布

爬数据

据说有个妹妹通过抓纸团决定买彩票号,这个看起来既玄幻又可爱。
小姐姐我坐不住了,索性统计了一下历史中奖号码分布情况。
借助python抓数据,尝试了几组代码,给出一份能运行的,爬取双色球出号情况。代码如下:
源码来源:Python爬取彩票双色球并存到把数据excel表格里

import requests
import re
import xlwt
import time

def get_all_page():
    global all_page
    url = "http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html"
    reponse = requests.get(url=url)
    reponse.encoding='utf-8'
    html = reponse.text
    all_page = int(re.findall(r"class=\"pg\".*?<strong>(.*?)</strong>",html)[0])
    return all_page

def get_num():
    k = -1
    f = xlwt.Workbook(encoding='utf-8')
    sheet01 = f.add_sheet(u'sheel1', cell_overwrite_ok=True)

    for page_num in range(1,50):
        url = "http://kaijiang.zhcw.com/zhcw/html/ssq/list_"+str(page_num)+".html"
        reponse = requests.get(url=url)
        time.sleep(5)
        reponse.encoding = 'utf-8'
        html = reponse.text
        rule = r"<tr>.*?<td align=\"center\">(.*?)</td>.*?<td align=\"center\">(.*?)</td>.*?<td align=\"center\" style=\"padding-left:10px;\">.*?<em class=\"rr\">(.*?)</em>.*?<em class=\"rr\">(.*?)</em>.*?<em class=\"rr\">(.*?)</em>.*?<em class=\"rr\">(.*?)</em>.*?<em class=\"rr\">(.*?)</em>.*?<em class=\"rr\">(.*?)</em>.*?<em>(.*?)</em></td>"
        num = re.findall(rule, html, re.S | re.M)
        # f = xlwt.Workbook(encoding='utf-8')
        # sheet01 = f.add_sheet(u'sheel1', cell_overwrite_ok=True)
        sheet01.write(0, 0, "日期")
        sheet01.write(0, 1, "期数")
        sheet01.write(0, 2, "第一个红球")
        sheet01.write(0, 3, "第二个红球")
        sheet01.write(0, 4, "第三个红球")
        sheet01.write(0, 5, "第四个红球")
        sheet01.write(0, 6, "第五个红球")
        sheet01.write(0, 7, "第六个红球")
        sheet01.write(0, 8, "蓝球")
        print("正在写入第%s页" % (page_num))
        for i in range(0,len(num)):
         #   for i in range(0, len(num)):
            k += 1
            sheet01.write(k + 1, 0, num[i][0])
            sheet01.write(k + 1, 1, num[i][1])
            sheet01.write(k + 1, 2, num[i][2])
            sheet01.write(k + 1, 3, num[i][3])
            sheet01.write(k + 1, 4, num[i][4])
            sheet01.write(k + 1, 5, num[i][5])
            sheet01.write(k + 1, 6, num[i][6])
            sheet01.write(k + 1, 7, num[i][7])
            sheet01.write(k + 1, 8, num[i][8])
    f.save("双色球统计结果.xls")


if __name__ == '__main__':
    get_all_page()
    get_num()

excel数据转CSV

在这里插入图片描述

爬取到的数据如上所示,数据为2014.6.11到2018.9.23。
由于在matlab里边读取纯数据,因此只将后七列含有号码的数据保存,并且去掉表头。
我在读取excel时候,有数据而报空,因此,将其转为CSV格式。

这个CSV格式实在好用,之前制作数据集时候就感谢包罗万象的他:不仅保存数据,还能保存字符等等,这让ID和VALUE完美的结合在一起,跟MAP一样。

Matlab分析

表格数据纵列为每支出现的历史号码,我们试图观察每支具有怎样的规律。

猜想如下:设置人员会选取一些有纪念意义的数字(比如结婚纪念日呀,生日呀,还有大环境下有意义的数据,是不是很有成就感),并且按照高斯分布等某种模式发放号码:即这个理想值的发放频率比较大,而欧式空间离他越远,出现频率越低。

为了验证猜想,我用matlab分析了下,统计这几支出现的频率。
Matlab有一个专门统计频率的函数:tabulate,自行查找。
代码如下:

A=xlsread('D:\\Cat_Dog_CNN\\mydata3.csv');%你所保存的路径

subplot(2,4,1)
B = tabulate(A(1:112,1));
bar(B(:,1),B(:,3))
subplot(2,4,2)
B = tabulate(A(1:112,2));
bar(B(:,1),B(:,3)) 
subplot(2,4,3)
B = tabulate(A(1:112,3));
bar(B(:,1),B(:,3)) 
subplot(2,4,4)
B = tabulate(A(1:112,4));
bar(B(:,1),B(:,3)) 
subplot(2,4,5)
B = tabulate(A(1:112,5));
bar(B(:,1),B(:,3))
subplot(2,4,6)
B = tabulate(A(1:112,6));
bar(B(:,1),B(:,3)) 
subplot(2,4,7)
B = tabulate(A(1:112,7));
bar(B(:,1),B(:,3)) 

Matlab这块代码比较冗余,不过就几张图,也就一张一张画了。

千呼万唤始出来,犹抱琵琶半遮面。

在这里插入图片描述

仔细观察一下,前六支基本遵循高斯分布,可以参考[数字图像处理]常见噪声的分类与Matlab实现对比噪声。
有几支不完整的高斯分布,你可以说他是高斯分布的局部,也可以想象成瑞利分布、伽马分布等。

反思

彩票这件事,出号是人为设置的,所以谈不上什么自然规律。人为选取一个模型,然后出号。
下图是双色球从出现以来的统计结果,是不是大数据下,规律更明显了。
不过我们更感兴趣的是股票,里边的影响因素很多:除了close、open、max、min等数据,还有政治因素等等,我了解了一些K线的概念,也分析了现有的十几组模型,暂时感觉特别特别有用的数据:

在这里插入图片描述

1. 原始数据:close值,即当日收盘价格;
2. 差分值:N天作为小单位,统计均值差;
3. 均方差:分析数据分布离不开均方值,它能评估并预测数据动荡的方向和动荡幅度。

后边衍生的模型暂且不谈,如果在这边找到规律,那一定大喜大悲了。
在跑去人为干扰外,的确有很多可以挖掘的规律。
等出结果,我们再聊。

猜你喜欢

转载自blog.csdn.net/weixin_39437164/article/details/82849986