Numbers4を過去のデータを元にストレートの予測を行います。(予測のアルゴリズムはとても簡易なものなのですが、一回につき70000回抽選を行った中から抽出しています)過去のデータはpaypay銀行, 楽天銀行からいただいております。ナンバーズ3よりさらんに複数回同じ数字が出るということは少ないようです。
例えばこんな状況で
今回のガジェットはこういう声に対応
「やはり、より大きな勝負を行うのはナンバーズ4かな。なんとか当たる数字を予測できないだろうか」
このガジェットでできることはこちら
- ナンバーズ4の過去の当選結果をまとめております。
- 直近5日の当選番号、複数回同じ数字が当選した回数、この2年間で未当選の数字の一覧を表示しております。
- 予測の数字を3つ表示します。
- 1つの日付について1行分のデータを保存します。(複数回予測を行っても最終の予測が保存されます)
- 今回は別途、自動的に当選番号を毎日取得できるプログラムも作りました。(オートメーターなどの自分のパソコン上で取得ファイルを更新できます)
注意点はこちら
予測のアルゴリズムはあくまでこちらで設定した簡易なものです。
評価(自己)
役立ち度 ★★★(平均)
効率化 ★★★★(良し)
ミス防止 ★★★(平均)
楽しさ ★★★★(良し)
操作 ★★★★(良し)
実行環境
使用環境 streamlit
使用言語 python
使用ライブラリ pandas、numpy、random、collections、datetime
コード
import pandas as pd
import numpy as np
import random
import collections
import streamlit as st
def get_win_times():
df = pd.read_csv('抽選結果.csv')
fivedays_result = df[:5]
num_of_lot = len(df)
win_times = df.groupby('抽せん数字').count().reset_index()
return win_times, num_of_lot, fivedays_result
def get_basic_info(win_times, num_of_lot):
max = win_times['抽せん日'].max()
bynum_of_win ={}
while max > 0:
bynum_of_win[f'{str(max)}回当選'] = len(win_times[win_times['抽せん日']==max])
max -=1
bynum_of_win['平均回数'] = round(win_times['抽せん日'].mean(), 2)
bynum_of_win['抽選回数'] = num_of_lot
basic_info = pd.DataFrame(bynum_of_win, index=['基本情報'])
return basic_info
def get_singlenum_info(win_times):
str_num = win_times['抽せん数字'].values.astype(str)
single_num = []
for i in str_num:
if len(i) == 1:
single_num.append(0)
single_num.append(0)
single_num.append(0)
single_num.append(int(i))
elif len(i) == 2:
single_num.append(0)
single_num.append(0)
single_num.append(int(i[0]))
single_num.append(int(i[1]))
elif len(i) == 3:
single_num.append(0)
single_num.append(int(i[0]))
single_num.append(int(i[1]))
single_num.append(int(i[2]))
else:
single_num.append(int(i[0]))
single_num.append(int(i[1]))
single_num.append(int(i[2]))
single_num.append(int(i[3]))
by_singlenum = {}
for i in range(10):
by_singlenum[f'{i}'] = single_num.count(i)
singlenum_info = pd.DataFrame(by_singlenum, index=['回数'])
singlenum_info['平均'] = singlenum_info.mean(axis=1)
return singlenum_info
def get_unselected_num(win_times):
unselected_num = [i for i in range(10000) if i not in win_times['抽せん数字'].values]
while len(unselected_num) < 9500:
unselected_num.append('*')
_matrix = np.array(unselected_num).reshape(25, 380)
matrix = pd.DataFrame(_matrix)
return matrix, unselected_num
def get_predict(unselected_num):
predict_list = []
for i in range(70000):
predict = random.choice(unselected_num)
if predict == '*':
pass
else:
predict_list.append(predict)
predict_result = [i for i in unselected_num if i not in predict_list]
while '*' in predict_result:
predict_result.remove('*')
if len(predict_result) > 3:
predict_result = [random.choice(predict_result) for i in range(3)]
else:
result_num = len(predict_result)
while result_num <= 3:
predict_result.append(0)
result_num += 1
return predict_result
def get_predict_df(next_lot_date, predict_result):
predict_dic ={}
for i in range(len(predict_result)):
predict_dic[f'{i+1}'] = predict_result[i]
_df = pd.DataFrame(predict_dic, index=[0])
_df['抽せん日'] = next_lot_date
predict_df = pd.read_csv('予測結果.csv')
predict_df = pd.concat([predict_df, _df])
predict_df = predict_df.sort_values('抽せん日')
predict_df = predict_df.drop_duplicates('抽せん日', keep='last')
return predict_df
win_times, num_of_lot, fivedays_result = get_win_times()
basic_info = get_basic_info(win_times, num_of_lot)
singlenum_info = get_singlenum_info(win_times)
matrix, unselected_num = get_unselected_num(win_times)
st.title('Numbers4 予測アプリ')
st.write('当選結果')
st.table(fivedays_result)
st.write('当選回数')
st.table(basic_info)
st.write('各数字出現情報')
st.table(singlenum_info)
st.write('未出現数字情報')
st.dataframe(matrix)
st.write('次回の数値を予測する')
next_lot_date =st.text_input('抽選日を入力してください', placeholder='YYYY/mm/dd')
if st.button('予測'):
predict_result = get_predict(unselected_num)
predict_df = get_predict_df(next_lot_date, predict_result)
st.dataframe(predict_df)
predict_df.to_csv('予測結果.csv', index=False)
st.write('上記で良いですか? 再予測は「予測」ボタンを再度押してください')
if st.button('YES'):
st.write('保存しました')
st.write('保存している予測結果')
if st.button('最新予測結果'):
saved_predict = pd.read_csv('予測結果.csv')
st.dataframe(saved_predict)
下記のコードを定期実行すれば当選番号を自動取得します。
import requests
from bs4 import BeautifulSoup
import pandas as pd
def main():
res = requests.get('https://takarakuji.rakuten.co.jp/backnumber/numbers4/')
soup = BeautifulSoup(res.text, 'html.parser')
elem_tbody = soup.find('tbody')
elems_td = elem_tbody.find_all('td')
date = elems_td[0].text
num = int(elems_td[1].text)
df = pd.read_csv('抽選結果.csv')
d = {
'抽せん日': date,
'抽せん数字': num
}
_df= pd.DataFrame(d, index=[0])
df = pd.concat([df, _df])
df = df.sort_values('抽せん日', ascending=False)
df = df.drop_duplicates('抽せん日').reset_index(drop=True)
df.to_csv('抽選結果.csv')
if __name__ == '__main__':
main()