Files

72 lines
3.0 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# WVLottopy megamil: Matteo DiBiagio
from fractions import Fraction as frac
from math import comb
import pandas as pd
import requests
from collections import Counter
def get_data():
# previous records which have since been removed from wvlottery.com's database
df_old = pd.read_excel('./excel_lotto_records/lotto_megamil.xlsx')
salvaged = df_old[['Date', 'Numbers', 'MB']]
url = 'https://gateway.loyalty.wvlottery.com/services/jackpot/api/v1/jackpot-results?gameId=20&jackpotStatus=PAYABLE&size=500&sort=externalId,drawDate,desc&page='
header = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
}
# Get web data, the new site pulls past draws from json 500 at a time
web = {'Date': [], 'Numbers': [], 'MB': []}
page = 0
while True:
r = requests.get(url + str(page), headers=header)
data = r.json()
for x in data['content']:
web['Date'].append(x['drawingDate'])
web['Numbers'].append('–'.join(str(n['data']) for n in x['resultData'] if n['type'] == 'REGULAR'))
web['MB'].append([n['data'] for n in x['resultData'] if n['type'] == 'SPECIAL'][0])
if data['last']:
break
page += 1
dfs = [pd.DataFrame(web)]
pd.set_option('display.max_rows', None)
# Specifies no max rows, otherwise only shows 10 records
df = pd.concat([dfs[0], salvaged], ignore_index=True)
df2 = df[['Date', 'Numbers', 'MB']]
date = list(df2['Date'])
nums = list(df2['Numbers'].astype('str'))
MBs = list(df2['MB'].astype('int'))
return date, nums, MBs
date, nums, MBs = get_data()
# Formatting
# Site numbers come split by – and the excel records by - so it splits on both
hyphenfree = []
for x in nums:
hyphenfree.append(x.replace('–',', ').replace('-',', '))
splitlist = ", ".join(hyphenfree)
sep = splitlist.split(", ")
# Only count numbers that can still be called, the ball ranges have changed over the years
# so the old records have some numbers that dont exist in the game anymore
sep = [x for x in sep if x.isdigit() and 1 <= int(x) <= 70]
MBs = [x for x in MBs if 1 <= x <= 24]
for n in range(0, 70):
most_common= Counter(sep).most_common(5)
likely_nums = [v[0] for v in most_common]
frequency = [v[-1] for v in most_common]
for n in range(0, 25):
most_common_mb = Counter(MBs).most_common(1)
MB = [v[0] for v in most_common_mb]
frequency_mb = [v[-1] for v in most_common_mb]
sorted_nums = sorted(likely_nums, key=lambda x: (len(x), x))
# Chance = 1 / every possible ticket, 70 choose 5 white balls times 24 mega balls = 290472336
# every ticket has the same odds, the forecast just goes with the numbers that get called the most
Chance = frac(1, comb(70, 5) * 24)
Forecast = str(" - ".join(sorted_nums))
print(f"Likely numbers are . . . {Forecast} MB: {MB}\n"
f"With percent chance of winning being {Chance}")