用python来预测大乐透(仅供参考~)

废话不多说,先从获取历史开奖数据开始

我们从中国体彩网爬取历史开奖数据。

由于网站属于静态网页,很容易就能获取到想要的内容,所以爬取过程就不详细介绍。
直接上代码:

import requests
from bs4 import BeautifulSoup as bs
import threading
import queue



class get_history(threading.Thread):
    def __init__(self,task_q,result_q):
        super().__init__()
        self.task_queue=task_q
        self.result_queue=result_q


    def run(self):
        while True:
            if not self.task_queue.empty():
                page=self.task_queue.get()
                one_result=self.crawl(page)
                self.result_queue.put(one_result)
                self.task_queue.task_done()
                print('##第{}页爬取完毕~~~~~'.format(page))
            else:
                break


    def crawl(self,page):
        url = 'http://www.lottery.gov.cn/historykj/history_{}.jspx?_ltype=dlt'.format(page)
        headers = {
            'user-agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 75.0.3770.142Safari / 537.36',
            'Upgrade-Insecure-Requests': '1',
            'Host': 'www.lottery.gov.cn'
        }
        r = requests.get(url, headers=headers)
        text = bs(r.text, 'lxml')
        result = text.find_all('div', class_='result')
        result = result[0].find_all('tbody')
        result = result[0].find_all('td')
        result_list = []
        for item in result:
            result_list.append(item.get_text())
        one_page=[]
        one_page.append([result_list[19]] + result_list[0:8])
        for i in range(1, 20):
            open_data = result_list[19 + (20 * i)]
            number_list = result_list[20 + (20 * (i - 1)):21 + (20 * (i - 1)) + 7]
#            print([open_data] + number_list)
            one_page.append([open_data] + number_list)
        return one_page


if __name__ == '__main__':
    task_queue=queue.Queue()
    result_queue=queue.Queue()
    for i in range(1,94):
        task_queue.put(i)


    crawl=get_history(task_queue,result_queue)
    crawl.setDaemon(True)
    crawl.start()

    task_queue.join()



    with open('history.txt','a') as f :

        while not result_queue.empty():
            for one in result_queue.get():
                one_line=''
                for item in one:
                    one_line+=item
                f.write(one_line+'\n')

由于最近多线程和队列用的比较多,所以这里一开始就也想用多线程+队列,但是后来发现,因为本身网页就是静态的获取数据非常简单,加上总共也才90多页,根本不需要多线程,单线程就能很快爬完。既然写了就当作对多线程和队列的巩固练习吧~

将爬取到的数据保存到history.txt
在这里插入图片描述
总共获取到了1860条数据,每条就是一期开奖结果,相当于1860期,从2007年到2019年十二年来的开奖数据。

有了数据,接下来就是先对历史开奖数据进行简单的分析

利用pyecharts进行可视化分析

from collections import Counter
from pyecharts.charts import Bar,Page
from pyecharts import options as opts

def number_analyse():
    red_balls = []
    blue_balls = []
    with open('history.txt', 'r') as  f:
        for i in range(1860):
            oneLine_data = f.readline().strip()
            red_balls.extend([int(oneLine_data[15 + (2 * i):15 + (2 * (i + 1))]) for i in range(5)])
            blue_balls.append(int(oneLine_data[-4:-2]))
            blue_balls.append(int(oneLine_data[-2:]))

    red_counter = Counter(red_balls)
    blue_counter = Counter(blue_balls)
    print(red_balls)
    print(blue_balls)
    print(red_counter)
    print(blue_counter)
    print(red_counter.most_common())
    print(blue_counter.most_common())
    red_dict={}
    blue_dict={}
    for i in red_counter.most_common():#使用collections模块的counter统计红球和蓝球各个号码的出现次数
        red_dict['{}'.format(i[0])]=i[1]
    for j in blue_counter.most_common():
        blue_dict['{}'.format(j[0])]=j[1]

    print(red_dict)
    print(blue_dict)

    red_list=sorted(red_counter.most_common(),key=lambda number:number[0])#对红蓝球号码和次数重新进行排序
    blue_list=sorted(blue_counter.most_common(),key=lambda number:number[0])
    print(red_list)
    print(blue_list)

    red_bar=Bar()
    red_x=['{}'.format(str(x[0])) for x in red_list]
    red_y=['{}'.format(str(x[1])) for x in red_list]
    red_bar.add_xaxis(red_x)
    red_bar.add_yaxis('红色球出现次数',red_y)
    red_bar.set_global_opts(title_opts=opts.TitleOpts(title='大乐透彩票',subtitle='近12年数据'),toolbox_opts=opts.ToolboxOpts()
                            ,yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value}/次")),
                            xaxis_opts=opts.AxisOpts(name='开奖号码'))
    red_bar.set_series_opts(markpoint_opts=opts.MarkPointOpts(
        data=[opts.MarkPointItem(type_='max',name='最大值'),opts.MarkPointItem(type_='min',name='最小值')]
    ))


    blue_bar=Bar()
    blue_x=['{}'.format(str(x[0])) for x in blue_list]
    blue_y=['{}'.format(str(x[1])) for x in blue_list]
    blue_bar.add_xaxis(blue_x)
    blue_bar.add_yaxis('蓝色球出现次数',blue_y,itemstyle_opts=opts.ItemStyleOpts(color='blue'))
    blue_bar.set_global_opts(title_opts=opts.TitleOpts(title='大乐透彩票',subtitle='近12年数据'),toolbox_opts=opts.ToolboxOpts()
                            ,yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value}/次")),
                            xaxis_opts=opts.AxisOpts(name='开奖号码'))
    blue_bar.set_series_opts(markpoint_opts=opts.MarkPointOpts(
        data=[opts.MarkPointItem(type_='max',name='最大值'),opts.MarkPointItem(type_='min',name='最小值')]
    ))

    page=Page(page_title='大乐透历史开奖数据分析',interval=3)
    page.add(red_bar,blue_bar)
    page.render('大乐透历史开奖数据分析.html')

最后将图表保存到“大乐透历史开奖数据分析.html”,然后使用浏览器打开
在这里插入图片描述
可以看到红色球中出现次数最多的是29,总共出现了352次,出现最少的是16,共出现了208次。

在这里插入图片描述
而蓝色球出现最多的是10,共出现343次,出现最少的是1,共出现292次。

最后通过sklearn模块的SVR模型对历史开奖数据进行深度学习,然后使用训练完的模型进行开奖预测

关于sklearn的使用参考这篇文章:https://blog.csdn.net/lilianforever/article/details/53780613

一组开奖号码有7个数字,所以分别建立了7个模型,每个位置的开奖号码为一个模型,使用每期的开奖日期和期数当作特征值,每个位置的开奖号码数字为标签直对模型进行训练。
之后对每个模型分别输入下一期开奖日期和期号进行预测每个位置的号码,然后将7个号码组合起来就是最后预测的开奖号码。

from sklearn import svm

def forecast():
    data=[]
    period=[]
    first_num=[]
    second_num=[]
    third_num=[]
    fourth_num=[]
    fifth_num=[]
    sixth_num=[]
    seventh_num=[]

    with open('history.txt', 'r') as  f:
        for i in range(1860):
            oneLine_data = f.readline().strip()
            data.append(int(oneLine_data[0:10].replace('-','')))
            period.append(int(oneLine_data[10:15]))
            first_num.append(int(oneLine_data[15:17]))
            second_num.append(int(oneLine_data[17:19]))
            third_num.append(int(oneLine_data[19:21]))
            fourth_num.append(int(oneLine_data[21:23]))
            fifth_num.append(int(oneLine_data[23:25]))
            sixth_num.append(int(oneLine_data[25:27]))
            seventh_num.append(int(oneLine_data[27:29]))
    # print(data)
    # print(period)
    # print(first_num)
    # print(second_num)
    # print(third_num)
    # print(fourth_num)
    # print(fifth_num)
    # print(sixth_num)
    # print(seventh_num)
    x=[]
    for j in range(len(data)):
        x.append([data[j],period[j]])

    first_model=svm.SVR(gamma='auto')
    second_model=svm.SVR(gamma='auto')
    third_model=svm.SVR(gamma='auto')
    fourth_model=svm.SVR(gamma='auto')
    fifth_model=svm.SVR(gamma='auto')
    sixth_model=svm.SVR(gamma='auto')
    seventh_model=svm.SVR(gamma='auto')
    model_list=[first_model,second_model,third_model,fourth_model,fifth_model,sixth_model,seventh_model]
    y_list=[first_num,second_num,third_num,fourth_num,fifth_num,sixth_num,seventh_num]
    for k in range(7):
        model_list[k].fit(x,y_list[k])
    res_list=[]
    for model in model_list:
        res=model.predict([[20190803,19089]]).tolist()
        res_list.append(res)

    print(res_list)
    #res=first_model.predict([[20190729,19087]])
    #print(res)
forecast()

得到下期的预测号码:
在这里插入图片描述
关于深度学习,我也没学过,对于一些算法、原理我也暂时还不是很懂。这里只是稍微了解了一下就选了个模型直接进行使用。如果要更加严谨的操作,需要对多个模型进行交叉验证,选择出最优模型,和对模型做进一步调优,这里就不折腾了(其实是还不会)

最后

这个预测彩票其实并不靠谱,原因我想大家都懂的~,而且开奖号码跟期数和开奖日期并没有半点相关性,用开奖期数+开奖日期来进行深度学习和预测本来就是毫无意义的事情。就当是娱乐娱乐的同时巩固和练习相关的python知识。

但是偶尔花个8块10块买个几注彩票(千万不要沉迷~)还是可以的,万一哪天踩了狗屎运中了,说不定就此改变命运 ~,俗话说梦想还是要有的,万一实现了呢!

### 回答1: 大乐透是一种中国彩票,经常吸引着很多人的关注和参与。为了提高中奖的机会,一些人开始使用Python编程语言来开发预测大乐透号码的程序。 大乐透预测程序主要通过分析历史数据和统计学方法来预测下一期的中奖号码。首先,程序会收集大乐透的历史开奖数据,包括中奖号码、奖金等级以及开奖日期。然后,程序使用Python中的数据处理和分析库,对这些数据进行清洗和整理。 接下来,程序会运用数据分析方法,例如频率分析和概率模型,来寻找大乐透中的规律和趋势。例如,程序可以统计每个号码出现的频率,找出出现最多次数的号码,并根据这些数据进行预测。程序还可以分析每个号码在不同奖金等级中的中奖情况,进一步优化预测结果。 在预测过程中,程序还会考虑一些常见的号码组合模式,如连号、重号等。通过分析历史数据中这些模式的出现频率,程序能够判断它们在下一期中的可能性。 预测结果会以推荐号码的形式呈现给用户。用户可以根据这些推荐号码来选择购买彩票,增加中奖的概率。然而,需要明确的是,大乐透预测程序并不能完全准确地预测中奖号码,它只是通过分析历史数据来提供一些可能的参考。 总的来说,大乐透python预测程序通过利用Python编程语言以及数据分析方法,对历史数据进行分析和预测,帮助用户在购买彩票时做出更明智的选择,提高中奖的机会。 ### 回答2: 大乐透预测程序是使用Python编写的一种工具,旨在帮助用户预测大乐透彩票的开奖号码。这个程序的设计基于大乐透彩票的规则和历史数据分析。 首先,该程序会收集大乐透历史开奖数据。然后,它会对这些历史数据进行分析和处理,以发现可能的模式和规律。程序会使用数学和统计的方法,如概率分析、趋势分析等,来研究历史开奖号码的分布情况。 接下来,该程序会根据分析结果生成预测号码。它会通过对历史数据的分析,查找重复出现的组合、高频出现的数字等。然后,基于这些发现的模式,程序会生成一组有可能出现在下一期开奖号码中的数字。 需要明确的是,大乐透预测程序只是一种辅助工具,并不能保证100%准确地预测中奖号码。彩票的开奖结果是随机的,受到众多因素的影响。预测程序只能通过分析历史数据,找出一些有可能发生的模式,但不能保证这些模式一定会出现在未来的开奖号码中。 因此,使用大乐透预测程序的用户应该理性对待预测结果,不要将其作为购买彩票的唯一依据。同时,购买彩票应该注意风险,不能过度依赖于预测程序。与此同时,了解并遵守当地彩票相关规定,以合理的方式享受购彩乐趣。 ### 回答3: 大乐透是一种中国彩票游戏,参与者需要从1至35的红色球和1至12的蓝色球中选择号码,然后等待开奖结果。为了提高中奖几率,可以利用Python编写一个预测程序。 首先,我们需要收集大乐透历史开奖数据。可以通过网上彩票数据网站或者官方提供的开奖结果进行收集。将数据保存在合适的数据结构中,如列表或数组。 然后,可以使用Python的统计分析模块,如NumPy或Pandas,对历史数据进行分析。可以计算每个号码出现的频率,以及红球和蓝球的组合模式。 接下来,可以根据历史数据中出现频率较高的号码进行预测。可以根据红球和蓝球的频率,选择最有可能出现的号码进行投注。还可以根据历史数据中的模式,如连号或分布规律,进行预测。 在编写预测程序时,可以使用随机数生成器模块来模拟彩票机选号码的功能。通过随机选择历史数据中出现频率较高的号码,可以使得预测结果更加有趣和具有参考价值。 最后,需要注意的是,彩票是一种随机游戏,没有绝对的预测方法。即使利用Python编写了预测程序,也不能保证100%的中奖几率。因此,在参与彩票游戏时,还是要以娱乐为主,理性购买,并注意不要过度投注。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值