diff --git a/lottery_predictor/analyze.py b/lottery_predictor/analyze.py new file mode 100644 index 0000000..5302e88 --- /dev/null +++ b/lottery_predictor/analyze.py @@ -0,0 +1,52 @@ +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 + + +def load_dataframe(table_name: str, use_rule_change_date: bool = True) -> 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: + start_date = game_dict['rule_date'] if use_rule_change_date else None + target_table = Base.metadata.tables.get(game_dict['db_table_name']) + if start_date is not None: + sql_statement = select(target_table).where(target_table.columns.draw_date >= start_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 [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([num for num, _ in counts.most_common()[-bottom:]])) +