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:]]))