ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

Numbers4 予測アプリ【python + streamlit】

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()