Files
Lottery_Project/lottery_predictor/analyze.py
T

63 lines
2.3 KiB
Python

from datetime import datetime
from collections import Counter
import pandas as pd
from sqlalchemy import select
from data.database import Base, dal, project_variables
import util.drawing as drawutil
import util.environment as envutil
project_variables = envutil.load_environment_variables()
def load_dataframe(
table_name: str, start_date: datetime | None = None, end_date: datetime | None = None
) -> pd.DataFrame:
"""connect to the database and load game data into a pandas dataframe"""
dal.connect()
session = dal.Session()
game_dict = drawutil.check_table_name(table_name=table_name)
if game_dict:
target_table = Base.metadata.tables.get(game_dict['db_table_name'])
if start_date is not None and end_date is not None:
sql_statement = (select(target_table)
.where(target_table.columns.draw_date >= start_date)
.where(target_table.columns.draw_date <= end_date))
elif start_date is not None and end_date is None:
sql_statement = (select(target_table).where(target_table.columns.draw_date >= start_date))
elif start_date is None and end_date is not None:
sql_statement = (select(target_table).where(target_table.columns.draw_date <= end_date))
else:
sql_statement = select(target_table)
return pd.read_sql(sql_statement, session.bind)
else:
raise ValueError('An invalid table name was provided')
def get_most_common_number(
data_frame: pd.DataFrame,
columns: list | None = None,
top: int = 1
) -> list[int]:
if columns is None:
columns = ['main_ball1', 'main_ball2', 'main_ball3', 'main_ball4', 'main_ball5']
flat_numbers = data_frame[columns].values.flatten()
counts = Counter(flat_numbers)
return [int(num) for num, _ in counts.most_common(top)]
def get_least_common_number(
data_frame: pd.DataFrame,
columns: list | None = None,
bottom: int = 1
) -> list[int]:
if columns is None:
columns = ['main_ball1', 'main_ball2', 'main_ball3', 'main_ball4', 'main_ball5']
flat_numbers = data_frame[columns].values.flatten()
counts = Counter(flat_numbers)
return list(reversed([int(num) for num, _ in counts.most_common()[-bottom:]]))