Python数据分析及可视化(Matplotlib, Plotly,random)实例:双色球根据往期数据产生随机号码

该博客介绍了如何从网站爬取双色球历史数据,存储为json、sqlite和Excel格式,然后进行数据分析,计算每个号码出现的概率,并通过Matplotlib和Plotly进行可视化。此外,还利用概率生成新的号码组合,并提供了一个交互式的选项菜单,允许用户选择执行不同的操作,如数据存储、图表生成和号码模拟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前有写过一篇“双色球数据爬取及写入数据库Sqlite、json和Excel表”,是通过网站提供的json网页把数据爬取并存储下来,今天就通过这个数据进行数据分析和可视化的练习。

首先我们先确定好我们的任务:

1.通过网站获取双色球最近100期的json数据并存储。
2.将json数据转为python的数据结构。
3.分析出100期双色球号码的概率。
4.将分析结果可视化,通过图标直观展示。
5.根据概率产生新的号码。
6.扩展功能:我们通过建立循环选择我们想要操作的步骤,而不是同时操作写入和展示。

为了完成以上任务我们需要代码执行以下操作:

1.通过requests获取数据,并通过json,sqlite3,xlwt模块进行数据存储(对上次写的文章的代码进行重构)
2.json.loads()将json数据转换为python数据结构
3.通过字典计算出号码概率
4.通过Matplotlib(折线图), Plotly(交互直方图)模块将数据可视化。
5.通过random.choices方法根据概率产生号码。

确定好了我们要做的任务及操作,就开始进行代码编写了,首先对之前的那篇文章代码进行重构,我们建一个Ssq_Data.py文件,导入所需的模块:

import requests,json,sqlite3,xlwt

我们先建立一个函数,用来获取双色球数据:

def get_information():

通过上篇文章我们知道网站提供了JSON格式的数据,可以直接申请获取100期的数据,然后通过json.loads将数据转换,所以我们这个函数如下:

def get_information():
    """Download the JSON data form url."""
    
    url = 'http://www.cwl.gov.cn/cwl_admin/front/cwlkj/search/kjxx/findDrawNotice?name=ssq&issueCount=100'
    response = requests.get(url)
    response.raise_for_status()
    data = json.loads(response.text).get('result')
    return data

(我的注释是用的英文,英文不太好有点中式,大家凑活看)
现在我们把这个函数写入json,sqlite3,xlwt文件中的代码进行重构,这里我们只展示写入json文件,其他两个大家自己发挥,所以我们先建立一个函数:

def json_data(json_data)():
    """Generate the json file according to the nearly 100 issues."""
    
    json_data = get_information()
    days = datetime.datetime.fromtimestamp(time.time()).strftime('(%Y%m%d)')
    with open('./datafiles/Ssq_data' + days +'.json', 'w',encoding='utf-8') as json_file:
        json.dump(json_data, json_file, indent=4, ensure_ascii=False)
    print("Data saved successfully")

解释下,通过datetime和time模块获取当前时间,导入模块:

import requests,json,sqlite3,xlwt,time,datetime

我们只需要年月日,所以通过.strftime(’(%Y%m%d)'转为日期,我们把这个日期添加到我们的文件命中,这样避免覆盖旧文件,以后可以把双色球的数据都累计起来。最后添加个print,成功后添加打印行。
同样的sqlite3,xlwt建立连个函数,命名方式也采取同样的方法,内容就不展示了,方法之前文章里有:

def sqlite_data(json_data):..
def xls_data(json_data):...

接下来,我们对这100期数据进行统计,得出每个号码出现的概率,函数如下:

def probability_data(json_data):
    """Count the probability of each number appearing."""
    
	json_data = get_information()
    red_num_frequency = {
   }
    blue_num_frequency = {
   }
    for entry in json_data:
        for number in entry['red'].split(","): # .split(): change str to list
            red_num_frequency[number] = red_num_frequency.get(number,0) +1   
        blue_num_frequency[entry['blue']] = blue_num_frequency.get(entry['blue'],0) + 1
    return red_num_frequency,blue_num_frequency

逐个分析下,首先建立两个字典分别为红号和蓝号,然后遍历我们的json_data,然后循环中再遍历每期的红号,每个号出现一次加1次,这样统计出来每个号出现的次数,同理蓝号也统计每个号的次数,最后返回两个字典,我们打印会出来如下结果:
在这里插入图片描述
每个号码出现的次数被我们统计出来了,但是我们也发现了并没有顺序排列,有点乱,虽然不影响我们用这个概率选号,但是会影响我们做图,所以我们重新对字典进行排序,函数如下:

def sorted_dict(dicnary):
    """Rearrange the DICT according to the key."""
    
    sorted_dict = {
   }
    for i in sorted(dicnary):
        sorted_dict[i] = dicnary[i]
    return sorted_dict

sorted(dicnary)会对字典的key进行排列,我们这样得到了重新排列的key,然后把key所属的值再重新赋予与它,这样就得到了重新排列的字典。

再下面就到了把我们把分析的数据可视化,进行直观的分析,这里我们做两个图,第一个我们通过Matplotlib模块作出折线图,所以导入模块并指定别名:

import matplotlib.pyplot as plt

然后建立函数,内容如下:

def lineChart(data):
    """Generated the line chart according to the recent 100 issues's probability."""
    
    data = probability_data(data)
    redx_lst = [1,2,3,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值