Files
Lotto-Tip-Generator/pattern_weighted_ai_generator.py
T

423 lines
16 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""
AI-GENERATOR MIT MUSTER-GEWICHTUNG
Erweitert den AI-Generator um explizite Muster-Gewichtung (NNMMHH, etc.)
Neue Features:
- Historische Muster-Analyse (NNMMHH, NMMHHH, etc.)
- Muster-Erfolgsquoten berechnen
- Muster-basierte Tip-Optimierung
- Pattern-Scoring für bessere Kombinationen
"""
import pandas as pd
import numpy as np
from collections import Counter, defaultdict
import random
class PatternWeightedAI:
def __init__(self, df):
self.df = df
self.pattern_frequencies = Counter()
self.pattern_success_rates = {}
self.optimal_patterns = []
# Analysiere historische Muster
self._analyze_historical_patterns()
def _analyze_historical_patterns(self):
"""Analysiert alle historischen Muster und deren Erfolgsquoten."""
print("\n🎨 MUSTER-ANALYSE GESTARTET...")
if len(self.df) == 0:
return
total_drawings = len(self.df)
for _, row in self.df.iterrows():
numbers = sorted([row['Z1'], row['Z2'], row['Z3'], row['Z4'], row['Z5'], row['Z6']])
pattern = self._get_pattern(numbers)
self.pattern_frequencies[pattern] += 1
# Berechne Erfolgsquoten
for pattern, count in self.pattern_frequencies.items():
success_rate = count / total_drawings
self.pattern_success_rates[pattern] = success_rate
# Identifiziere optimale Muster (Top 10)
self.optimal_patterns = [
pattern for pattern, _ in self.pattern_frequencies.most_common(10)
]
print("🎯 MUSTER-ERFOLGSQUOTEN:")
print("Pattern Häufigkeit Erfolgsrate Bewertung")
print("-" * 50)
for i, (pattern, count) in enumerate(self.pattern_frequencies.most_common(15)):
success_rate = self.pattern_success_rates[pattern]
if success_rate >= 0.08:
bewertung = "🏆 EXCELLENT"
elif success_rate >= 0.06:
bewertung = "🥇 SEHR GUT"
elif success_rate >= 0.04:
bewertung = "🥈 GUT"
elif success_rate >= 0.02:
bewertung = "🥉 DURCHSCHNITT"
else:
bewertung = "❌ SCHWACH"
print(f"{pattern:<10} {count:>8} {success_rate:>8.3f} {bewertung}")
def _get_pattern(self, numbers):
"""Konvertiert Zahlen zu N/M/H Muster."""
pattern = ""
for num in numbers:
if 1 <= num <= 16:
pattern += "N" # Niedrig
elif 17 <= num <= 32:
pattern += "M" # Mittel
else:
pattern += "H" # Hoch
return pattern
def calculate_pattern_weight(self, numbers):
"""Berechnet Gewichtung basierend auf Muster-Erfolgsquote."""
pattern = self._get_pattern(sorted(numbers))
# Basis-Gewichtung aus historischer Erfolgsquote
base_weight = self.pattern_success_rates.get(pattern, 0.01)
# Bonus für Top-Muster
if pattern in self.optimal_patterns[:5]:
bonus = 0.3
elif pattern in self.optimal_patterns[:10]:
bonus = 0.2
else:
bonus = 0.0
# Penalty für nie aufgetretene Muster
if pattern not in self.pattern_frequencies:
penalty = -0.2
else:
penalty = 0.0
final_weight = base_weight + bonus + penalty
return max(0.01, min(1.0, final_weight)) # Clamp 0.01-1.0
def get_pattern_recommendations(self):
"""Liefert Muster-Empfehlungen für Tip-Generierung."""
recommendations = {}
# Top 5 erfolgreichste Muster
recommendations['top_patterns'] = self.optimal_patterns[:5]
# Muster mit bester Erfolgsquote
if self.pattern_success_rates:
best_pattern = max(self.pattern_success_rates.items(), key=lambda x: x[1])
recommendations['best_pattern'] = best_pattern[0]
recommendations['best_success_rate'] = best_pattern[1]
# Muster-Statistiken
recommendations['total_patterns'] = len(self.pattern_frequencies)
recommendations['pattern_diversity'] = len([p for p, rate in self.pattern_success_rates.items() if rate >= 0.02])
return recommendations
def optimize_combination_for_pattern(self, target_pattern="NNMMHH"):
"""Optimiert Zahlen-Kombination für spezifisches Muster."""
# Definiere Bereiche
ranges = {
'N': list(range(1, 17)), # Niedrig: 1-16
'M': list(range(17, 33)), # Mittel: 17-32
'H': list(range(33, 50)) # Hoch: 33-49
}
# Parse target pattern
pattern_counts = Counter(target_pattern)
needed_n = pattern_counts.get('N', 0)
needed_m = pattern_counts.get('M', 0)
needed_h = pattern_counts.get('H', 0)
selected = []
# Wähle Zahlen für Muster
if needed_n > 0:
n_numbers = random.sample(ranges['N'], min(needed_n, len(ranges['N'])))
selected.extend(n_numbers)
if needed_m > 0:
m_numbers = random.sample(ranges['M'], min(needed_m, len(ranges['M'])))
selected.extend(m_numbers)
if needed_h > 0:
h_numbers = random.sample(ranges['H'], min(needed_h, len(ranges['H'])))
selected.extend(h_numbers)
# Auffüllen falls nötig
while len(selected) < 6:
all_ranges = ranges['N'] + ranges['M'] + ranges['H']
available = [n for n in all_ranges if n not in selected]
if available:
selected.append(random.choice(available))
else:
break
return sorted(selected[:6])
class EnhancedAIGenerator:
"""Erweitert den ursprünglichen AI-Generator um Muster-Gewichtung."""
def __init__(self, data_path):
self.data_path = data_path
self.df = None
self.pattern_ai = None
# Load data
self._load_data()
# Initialize Pattern AI
if self.df is not None and len(self.df) > 0:
self.pattern_ai = PatternWeightedAI(self.df)
def _load_data(self):
"""Lädt Daten."""
try:
self.df = pd.read_csv(self.data_path, sep=';')
if 'datum' in self.df.columns:
self.df['datum'] = pd.to_datetime(self.df['datum'], format='%Y-%m-%d', errors='coerce')
self.df = self.df.sort_values('datum')
print(f"✅ {len(self.df)} Ziehungen geladen")
except Exception as e:
print(f"❌ Fehler beim Laden: {e}")
self.df = pd.DataFrame()
def generate_pattern_optimized_tips(self, num_tips=10):
"""Generiert Tipps mit expliziter Muster-Gewichtung."""
if not self.pattern_ai:
print("❌ Pattern AI nicht verfügbar")
return []
print("\n🎨 PATTERN-OPTIMIERTE TIPP-GENERIERUNG")
print("=" * 60)
# Muster-Empfehlungen abrufen
recommendations = self.pattern_ai.get_pattern_recommendations()
print("🎯 MUSTER-EMPFEHLUNGEN:")
print(f" Bestes Muster: {recommendations.get('best_pattern', 'N/A')} ({recommendations.get('best_success_rate', 0)*100:.1f}%)")
print(f" Top 5 Muster: {', '.join(recommendations.get('top_patterns', [])[:5])}")
print(f" Pattern-Diversität: {recommendations.get('pattern_diversity', 0)} erfolgreiche Muster")
tips = []
print(f"\n🎲 GENERIERE {num_tips} PATTERN-OPTIMIERTE TIPPS:")
print("=" * 80)
print("Nr 6 Pattern-Numbers Pattern Weight Confidence Success-Rate")
print("-" * 80)
# Verschiedene Strategien für verschiedene Tipps
strategies = [
('best', "Bestes Muster"),
('top5', "Top 5 Rotation"),
('balanced', "Ausgewogene Muster"),
('diverse', "Diversifizierte Muster")
]
for i in range(1, num_tips + 1):
strategy = strategies[(i-1) % len(strategies)]
tip = self._generate_pattern_tip(i, strategy[0], recommendations)
tips.append(tip)
# Output
zahlen_str = '-'.join([f"{n:2}" for n in tip['numbers']])
success_rate = self.pattern_ai.pattern_success_rates.get(tip['pattern'], 0)
print(f"{i:2} {zahlen_str} {tip['pattern']:<8} {tip['pattern_weight']:.3f} {tip['confidence']:.3f} {success_rate:.3f}")
# Zusammenfassung
self._print_pattern_summary(tips)
return tips
def _generate_pattern_tip(self, tip_number, strategy, recommendations):
"""Generiert einzelnen pattern-optimierten Tipp."""
# Seed für Konsistenz
random.seed(42 + tip_number)
if strategy == 'best':
# Nutze bestes Muster
target_pattern = recommendations.get('best_pattern', 'NNMMHH')
elif strategy == 'top5':
# Rotiere durch Top 5
top_patterns = recommendations.get('top_patterns', ['NNMMHH'])
target_pattern = top_patterns[(tip_number - 1) % len(top_patterns)]
elif strategy == 'balanced':
# Ausgewogene beliebte Muster
balanced_patterns = ['NNMMHH', 'NMMHHH', 'NMMMHH', 'NNMHHH']
target_pattern = balanced_patterns[(tip_number - 1) % len(balanced_patterns)]
else: # diverse
# Diversifizierte Muster für Abdeckung
diverse_patterns = ['NNMMHH', 'MMHHHH', 'NNNNMM', 'NMHHHH', 'NNNMMH']
target_pattern = diverse_patterns[(tip_number - 1) % len(diverse_patterns)]
# Generiere Kombination für Ziel-Muster
numbers = self.pattern_ai.optimize_combination_for_pattern(target_pattern)
# Validiere und korrigiere falls nötig
actual_pattern = self.pattern_ai._get_pattern(numbers)
# Pattern Weight berechnen
pattern_weight = self.pattern_ai.calculate_pattern_weight(numbers)
# Confidence basierend auf Pattern Success Rate
success_rate = self.pattern_ai.pattern_success_rates.get(actual_pattern, 0.01)
confidence = pattern_weight * 0.6 + success_rate * 0.4
# Superzahl
superzahl = self._get_pattern_superzahl(tip_number)
return {
'tip_number': tip_number,
'numbers': numbers,
'pattern': actual_pattern,
'target_pattern': target_pattern,
'pattern_weight': pattern_weight,
'confidence': confidence,
'success_rate': success_rate,
'superzahl': superzahl,
'strategy': strategy
}
def _get_pattern_superzahl(self, tip_number):
"""Pattern-optimierte Superzahl."""
# Basis häufigste Superzahlen
frequent_sz = [7, 6, 3, 2, 0, 1, 4, 5, 8, 9]
# Tip-spezifische Auswahl
return frequent_sz[tip_number % len(frequent_sz)]
def _print_pattern_summary(self, tips):
"""Druckt Pattern-Zusammenfassung."""
print(f"\n🏆 PATTERN-OPTIMIERUNG ZUSAMMENFASSUNG:")
print("=" * 50)
# Pattern-Verteilung
pattern_dist = Counter([tip['pattern'] for tip in tips])
print("📊 PATTERN-VERTEILUNG:")
for pattern, count in pattern_dist.most_common():
avg_success = np.mean([self.pattern_ai.pattern_success_rates.get(pattern, 0)] * count)
print(f" {pattern}: {count}x (Ø Success: {avg_success:.3f})")
# Durchschnittliche Metriken
avg_weight = np.mean([tip['pattern_weight'] for tip in tips])
avg_confidence = np.mean([tip['confidence'] for tip in tips])
avg_success = np.mean([tip['success_rate'] for tip in tips])
print(f"\n📈 DURCHSCHNITTLICHE METRIKEN:")
print(f" Pattern-Weight: {avg_weight:.3f}")
print(f" Confidence: {avg_confidence:.3f}")
print(f" Success-Rate: {avg_success:.3f}")
# Beste Tipps
best_tip = max(tips, key=lambda x: x['confidence'])
print(f"\n⭐ BESTER PATTERN-TIPP:")
zahlen_str = '-'.join([f"{n:2}" for n in best_tip['numbers']])
print(f" Tipp {best_tip['tip_number']}: {zahlen_str}")
print(f" Pattern: {best_tip['pattern']} (Weight: {best_tip['pattern_weight']:.3f})")
print(f" Success-Rate: {best_tip['success_rate']:.3f}")
def demonstrate_pattern_weighting():
"""Demonstriert Pattern-Gewichtung mit Beispiel-Daten."""
print("🎨 PATTERN-GEWICHTUNG DEMONSTRATION")
print("=" * 50)
# Beispiel-Daten erstellen
sample_data = []
patterns_to_simulate = ['NNMMHH', 'NMMHHH', 'NMMMHH', 'NNMHHH', 'MMHHHH']
for i in range(100):
# Simuliere Ziehungen mit verschiedenen Mustern
pattern = random.choice(patterns_to_simulate)
numbers = []
for char in pattern:
if char == 'N':
numbers.append(random.randint(1, 16))
elif char == 'M':
numbers.append(random.randint(17, 32))
else: # 'H'
numbers.append(random.randint(33, 49))
# Sicherstellen dass alle Zahlen einzigartig sind
numbers = sorted(list(set(numbers)))
while len(numbers) < 6:
missing_range = random.choice(['N', 'M', 'H'])
if missing_range == 'N':
new_num = random.randint(1, 16)
elif missing_range == 'M':
new_num = random.randint(17, 32)
else:
new_num = random.randint(33, 49)
if new_num not in numbers:
numbers.append(new_num)
numbers.sort()
numbers = numbers[:6]
sample_data.append({
'Z1': numbers[0], 'Z2': numbers[1], 'Z3': numbers[2],
'Z4': numbers[3], 'Z5': numbers[4], 'Z6': numbers[5],
'SZ': random.randint(0, 9)
})
# DataFrame erstellen
df_sample = pd.DataFrame(sample_data)
# Enhanced AI Generator mit Pattern-Gewichtung
print("\n🚀 STARTE PATTERN-GEWICHTETEN GENERATOR...")
# Simuliere Generator
generator = EnhancedAIGenerator.__new__(EnhancedAIGenerator)
generator.df = df_sample
generator.pattern_ai = PatternWeightedAI(df_sample)
# Generiere pattern-optimierte Tipps
pattern_tips = generator.generate_pattern_optimized_tips(8)
print(f"\n💡 PATTERN-GEWICHTUNG ERKLÄRT:")
print("=" * 40)
print("🎯 Jede Kombination wird bewertet basierend auf:")
print(" 1. Historischer Erfolgsquote des Musters")
print(" 2. Bonus für Top-5 erfolgreichste Muster")
print(" 3. Penalty für nie aufgetretene Muster")
print(" 4. Kombinierte Pattern-Weight für finalen Score")
return pattern_tips
def main():
"""Hauptfunktion für Pattern-gewichteten Generator."""
data_path = "/Users/sebastianfrohlich/Library/Mobile Documents/com~apple~CloudDocs/Jupyter Notebooks/AlleLottozahlen.csv"
try:
# Versuche mit echten Daten
generator = EnhancedAIGenerator(data_path)
if generator.pattern_ai and len(generator.df) > 0:
pattern_tips = generator.generate_pattern_optimized_tips(10)
else:
print("🔄 Echte Daten nicht verfügbar - verwende Demo...")
pattern_tips = demonstrate_pattern_weighting()
except Exception as e:
print(f"⚠️ Fallback zu Demo-Modus: {e}")
pattern_tips = demonstrate_pattern_weighting()
if __name__ == "__main__":
main()