import pandas as pd import numpy as np from itertools import combinations def generate_features(df, candidate_numbers=None): """ Generate simple frequency/recency features for each number 1–50 """ numbers = list(range(1, 51)) if candidate_numbers is None else candidate_numbers draws = df[["n1", "n2", "n3", "n4", "n5", "n6"]].values.tolist() features = [] labels = [] # Flatten draws for idx, row in df.iterrows(): draw_nums = set(row[["n1", "n2", "n3", "n4", "n5", "n6"]].tolist()) for n in numbers: # Label: 1 if number in this draw, else 0 label = 1 if n in draw_nums else 0 labels.append(label) # Features last_seen = -1 for back, prev in enumerate(draws[:idx][::-1], 1): if n in prev: last_seen = back break freq_50 = sum([1 for prev in draws[max(0, idx-50):idx] if n in prev]) freq_200 = sum([1 for prev in draws[max(0, idx-200):idx] if n in prev]) features.append([n, freq_50, freq_200, last_seen if last_seen != -1 else 999]) X = pd.DataFrame(features, columns=["number", "freq50", "freq200", "recency"]) y = np.array(labels) return X, y def pick_top15(all_numbers_df): """ Return top 15 numbers sorted by score """ top15 = all_numbers_df.sort_values("score", ascending=False).head(15)["number"].tolist() return sorted(top15) def generate_system15_csv(top15, output_path="system15.csv"): """ Generate all 5005 combinations of 15 numbers into a CSV """ combos = list(combinations(top15, 6)) df = pd.DataFrame(combos, columns=[f"n{i}" for i in range(1, 7)]) df.to_csv(output_path, index=False) return output_path