76 lines
2.8 KiB
Python
76 lines
2.8 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
|
|
|
|
|
|
def load_dataframe(
|
|
table_name: str, start_date: datetime | None = None, end_date: datetime | None = None
|
|
) -> pd.DataFrame:
|
|
"""
|
|
:param table_name: the name of the table to load data from
|
|
:param start_date: the start date for the data
|
|
:param end_date: the end date for the data
|
|
|
|
:returns: a pandas DataFrame containing the data
|
|
"""
|
|
|
|
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]:
|
|
"""
|
|
:param data_frame: a pandas DataFrame containing the data
|
|
:param columns: a list of column names to use
|
|
:param top: the number of top (most seen) numbers to return
|
|
|
|
:returns: a list of the most common numbers
|
|
"""
|
|
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]:
|
|
"""
|
|
:param data_frame: a pandas DataFrame containing the data
|
|
:param columns: a list of column names to use
|
|
:param bottom: the number of bottom (least seen) numbers to return
|
|
|
|
:returns: a list of the least common numbers
|
|
"""
|
|
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:]]))
|