之前有写过一篇“双色球数据爬取及写入数据库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,