前言
雙色球是中國福利彩票的一種玩法。
紅球一共6組,每組從1-33中抽取一個,六個互相不重複。然後藍球是從1-16中抽取一個數字,這整個組成的雙色球
python從零基礎入門到實戰
今天,我們就用Python來統計一下各號碼的中獎概率,並視覺化展示。我本人,也會買概率最大的幾個號碼試試,中獎的話,我就刪號,並開始樸實無華有錢人的生活!!!
先是資料的來源,採集雙色球往期中獎資料
傳送求情
import requests # 資料請求 # 傳送請求的url地址 url = 'http://www.cwl.gov.cn/cwl_admin/kjxx/findDrawNotice' params = { 'name': 'ssq', 'issueCount': '', 'issueStart': '', 'issueEnd': '', 'dayStart': '2017-10-24', 'dayEnd': '2021-08-04', 'pageNo': page, } headers = { 'Referer': 'http://www.cwl.gov.cn/kjxx/ssq/kjgg/', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36' } response = requests.get(url=url, params=params, headers=headers) # <> 物件 200 請求成功 狀態碼
解析資料,for遍歷
for index in result: dit = { '期號': index['code'], '開獎日期': index['date'], '紅球': index['red'], '藍球': index['blue'], '一等獎中獎注數': index['prizegrades'][0]['typenum'], '一等獎中獎金額': index['prizegrades'][0]['typemoney'], '二等獎中獎注數': index['prizegrades'][1]['typenum'], '二等獎中獎金額': index['prizegrades'][1]['typemoney'], '三等獎中獎注數': index['prizegrades'][2]['typenum'], '三等獎中獎金額': index['prizegrades'][2]['typemoney'], '四等獎中獎注數': index['prizegrades'][3]['typenum'], '四等獎中獎金額': index['prizegrades'][3]['typemoney'], '五等獎中獎注數': index['prizegrades'][4]['typenum'], '五等獎中獎金額': index['prizegrades'][4]['typemoney'], '六等獎中獎注數': index['prizegrades'][5]['typenum'], '六等獎中獎金額': index['prizegrades'][5]['typemoney'], '一等獎中獎地區': index['content'], '獎池金額': index['poolmoney'] }
儲存資料
import csv # 內建模組 f = open('雙色球.csv', mode='a', encoding='utf-8', newline='') csv_writer = csv.DictWriter(f, fieldnames=['期號', '開獎日期', '紅球', '藍球', '一等獎中獎注數', '一等獎中獎金額', '二等獎中獎注數', '二等獎中獎金額', '三等獎中獎注數', '三等獎中獎金額', '四等獎中獎注數', '四等獎中獎金額', '五等獎中獎注數', '五等獎中獎金額', '六等獎中獎注數', '六等獎中獎金額', '一等獎中獎地區', '獎池金額']) csv_writer.writeheader() # 寫入表頭 csv_writer.writerow(dit) print(dit)
執行程式碼,這樣就得到了往期雙色球的資料了
現在開始,我們來分析這些資料
先匯入需要用到的模組
import pandas as pd from pyecharts.charts import * from sklearn.linear_model import LogisticRegression
讀取採集到的表格資料
data = pd.read_csv('雙色球.csv',encoding='utf-8', engine='python') data.head()
取資料,指定訓練集和測試集
def get_lotto_data(data, lotto, lotto_id): data['lotto_id'] = lotto_id X = [] Y = [] # 標籤and值 for s, p in zip(data['lotto_id'], data[lotto]): X.append([float(s)]) Y.append(float(p)) return X, Y
建立線性迴歸模型
def linear_model_test(X, Y, predict_value): regr = LogisticRegression() regr.fit(X, Y) predict_outcome = regr.predict(predict_value) predictions = {} predictions['intercept'] = regr.intercept_ predictions['coefficient'] = regr.coef_ predictions['predicted_value'] = predict_outcome return predictions
使用線性迴歸推測中獎號碼
def get_predicted_num(file, lotto, lotto_id): X, Y = get_lotto_data(file, lotto, lotto_id) predict_value = [[33]] result = linear_model_test(X, Y, predict_value) if lotto_id < 7: print(f'中獎第{lotto_id}個紅球為:', result['predicted_value'].astype('int64'), '號球') else: print('中獎藍球為:', result['predicted_value'].astype('int64'), '號球')
預測結果
get_predicted_num(data, 'r1', 1) # 預測紅1 get_predicted_num(data, 'r2', 2) # 預測紅2 get_predicted_num(data, 'r3', 3) # 預測紅3 get_predicted_num(data, 'r4', 4) # 預測紅4 get_predicted_num(data, 'r5', 5) # 預測紅5 get_predicted_num(data, 'r6', 6) # 預測紅6 get_predicted_num(data, '藍球', 7) # 預測藍7
視覺化展示
紅球中獎概率分佈圖
x = red_ball_count.index.tolist() y = red_ball_count.values.tolist() # 視覺化展示 pie = ( Pie() .add("" ,[list(z) for z in zip(x, y)] ) ) pie.render_notebook()
藍球中獎概率分佈圖
x = blue_ball_count.index.tolist() y = blue_ball_count.values.tolist() pie = ( Pie() .add("" ,[list(z) for z in zip(x, y)] ) ) pie.render_notebook()
藍球中獎次數分佈
from pyecharts import options as opts from pyecharts.charts import PictorialBar from pyecharts.globals import SymbolType c = ( PictorialBar() .add_xaxis(x) .add_yaxis( "", y, label_opts=opts.LabelOpts(is_show=False), symbol_size=18, symbol_repeat="fixed", symbol_offset=[0, 0], is_symbol_clip=True, ) .reversal_axis() .set_global_opts( title_opts=opts.TitleOpts(title='藍球中獎號碼'), xaxis_opts=opts.AxisOpts(is_show=False), yaxis_opts=opts.AxisOpts( axistick_opts=opts.AxisTickOpts(is_show=False), axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts(opacity=0) ), ), ) ) c.render_notebook()
中獎注數漏斗圖
x_data = df['中獎注數'].index.tolist() y_data = df['中獎注數'].values.tolist() c = ( Funnel() .add( "中獎注數漏斗圖", [list(z) for z in zip(x_data, y_data)], label_opts=opts.LabelOpts(position="inside"), ) .set_global_opts(title_opts=opts.TitleOpts(title="中獎注數漏斗圖")) ) c.render_notebook()
很真實,基數太大,一、二等獎的中獎數都看不見了