From 7233d08527ee094fa51d4a9ab75626a5f8b517b3 Mon Sep 17 00:00:00 2001 From: Mark Kors Date: Thu, 13 Nov 2025 15:54:03 +0100 Subject: [PATCH] graph and email in windows script added --- prijs_voorspelling_windows.png | Bin 0 -> 81617 bytes voorspel_advanced.py | 179 +++++++++++++++++++++++---------- 2 files changed, 128 insertions(+), 51 deletions(-) create mode 100644 prijs_voorspelling_windows.png diff --git a/prijs_voorspelling_windows.png b/prijs_voorspelling_windows.png new file mode 100644 index 0000000000000000000000000000000000000000..29cd6ac82d529a80b7179b9b675dbe319cdf1bdf GIT binary patch literal 81617 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
=4BXlQmpeAJ%g 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

^_3<-}6|5@`|?a7!Hph|lj796C? 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 bEnI2tDse|=Ky(*!yA#Ju4RZfDd+UDyoGMtP literal 0 HcmV?d00001 diff --git a/voorspel_advanced.py b/voorspel_advanced.py index acbc957..b1a4d28 100644 --- a/voorspel_advanced.py +++ b/voorspel_advanced.py @@ -4,13 +4,33 @@ import xgboost as xgb import mysql.connector from mysql.connector import Error from datetime import datetime, timedelta -import holidays # NIEUW: importeer holidays +import holidays + +# --- NIEUW: Imports voor grafiek en e-mail --- +import matplotlib.pyplot as plt +import smtplib +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +from email.mime.image import MIMEImage + +# --- NIEUW: Zorgt dat matplotlib werkt zonder GUI (bv. in terminal) --- +plt.switch_backend('Agg') # --- CONFIGURATIE --- -# BELANGRIJK: Verwijs naar je NIEUWE model MODEL_FILE = 'price_forecast_model_v1_5.json' TARGET = 'gemiddelde_prijs' -AANTAL_UUR_VOORSPELLEN = 72 # Hoeveel uur vooruit wil je kijken? +AANTAL_UUR_VOORSPELLEN = 72 +GRAFIEK_BESTAND = 'prijs_voorspelling_windows.png' # Tijdelijk bestand + +# --- NIEUW: E-mail Configuratie --- +# VUL DIT IN MET JE EIGEN GEGEVENS +EMAIL_CONFIG = { + 'smtp_server': '192.168.178.201', # Bv. 'smtp.gmail.com' + 'smtp_port': 587, + 'sender': 'sftpuser@markkors.nl', + 'password': 'Aae8-G9yFU5j', # Voeg hier het wachtwoord toe als dat nodig is + 'receiver': 'mark@markkors.nl' +} DB_CONFIG = { 'host': '192.168.178.201', @@ -20,29 +40,26 @@ DB_CONFIG = { 'port': 3307 } -# NIEUW: Haal de lijst van features uit je model -# We hoeven de lijst niet meer handmatig te typen! +# --- Model laden --- try: print(f"Laden van model: {MODEL_FILE}...") model = xgb.XGBRegressor() model.load_model(MODEL_FILE) - FEATURES = model.feature_names_in_ # Pakt automatisch alle feature-namen + FEATURES = model.feature_names_in_ print(f"āœ… Model succesvol geladen (verwacht {len(FEATURES)} features).") except FileNotFoundError: print(f"āŒ Fout: Model bestand '{MODEL_FILE}' niet gevonden.") - print("Heb je het 'v1_5' model al getraind en opgeslagen?") + print(" Heb je het 'v1_5' model al getraind en opgeslagen op Windows?") exit() except Exception as e: print(f"āŒ Fout bij laden model: {e}") exit() -# Maak de feestdagen-checker klaar nl_holidays = holidays.Netherlands(years=[datetime.now().year, datetime.now().year + 1]) +# --- Functie: haal_data_uit_database (onveranderd) --- def haal_data_uit_database(conn): - # ... (Deze functie is 100% IDENTIEK aan je vorige script) - # ... (Kopieer de 'haal_data_uit_database' functie hier) print("šŸ’¾ Data ophalen uit MySQL...") query_hist = """ @@ -52,7 +69,7 @@ def haal_data_uit_database(conn): p_avg.gemiddelde_prijs FROM amersfoort_weer_uurlijks AS w - LEFT JOIN -- <--- DE OPLOSSING + LEFT JOIN (SELECT datetime, AVG(price) AS gemiddelde_prijs FROM dynamic_price_data GROUP BY datetime) AS p_avg ON w.datum_tijd = p_avg.datetime @@ -82,13 +99,9 @@ def haal_data_uit_database(conn): print(f"āœ… {len(hist_df)} uur historie geladen.") print(f"āœ… {len(toekomst_df)} uur toekomstig weer geladen.") - # --- OPLOSSING HIER --- - # Vul 'gaten' in de historische prijsdata ALLEEN op hist_df hist_df['gemiddelde_prijs'] = hist_df['gemiddelde_prijs'].ffill() hist_df['gemiddelde_prijs'] = hist_df['gemiddelde_prijs'].bfill() - # --- EINDE OPLOSSING --- - # Combineer nu de gevulde historie met de lege toekomst combined_df = pd.concat([hist_df, toekomst_df]) return combined_df.sort_index() @@ -97,52 +110,84 @@ def haal_data_uit_database(conn): print(f"āŒ Fout bij ophalen data: {e}") return None - +# --- Functie: maak_features_voor_uur (onveranderd) --- def maak_features_voor_uur(df, timestamp): - """ - MAAK FEATURES v1.5 - Deze functie is compleet VERNIEUWD - """ features = {} - - # Haal data op van het specifieke uur data_nu = df.loc[timestamp] - # 1. Tijd-features (simpel) features['maand'] = timestamp.month features['dag_van_het_jaar'] = timestamp.dayofyear - - # 2. Feestdag feature features['is_feestdag'] = 1 if timestamp in nl_holidays else 0 - # 3. Weer-features weer_cols = ['temperatuur', 'gevoelstemperatuur', 'neerslag', 'wind_richting', 'wind_snelheid', 'bewolking', 'luchtdruk', 'luchtvochtigheid'] for col in weer_cols: features[col] = data_nu[col] - # 4. Lag-features features['prijs_1u_geleden'] = df.loc[timestamp - timedelta(hours=1)]['gemiddelde_prijs'] features['prijs_24u_geleden'] = df.loc[timestamp - timedelta(hours=24)]['gemiddelde_prijs'] - # 5. Rolling-features features['temp_avg_3u'] = df.loc[timestamp - timedelta(hours=2) : timestamp]['temperatuur'].mean() features['prijs_avg_6u'] = df.loc[timestamp - timedelta(hours=5) : timestamp]['gemiddelde_prijs'].mean() - # 6. ONE-HOT ENCODING (Handmatig) - # Voeg alle 7 'dag_' kolommen toe, en zet de juiste op 1 for dag in range(7): features[f'dag_{dag}'] = 1 if timestamp.dayofweek == dag else 0 - # Voeg alle 24 'uur_' kolommen toe, en zet de juiste op 1 for uur in range(24): features[f'uur_{uur}'] = 1 if timestamp.hour == uur else 0 - # Converteer naar een DataFrame en gebruik de volgorde van het model return pd.DataFrame([features], columns=FEATURES) +# --- NIEUW: Functie om de e-mail te bouwen en te versturen --- +def send_email_with_graph(image_path, result_df): + print("\nšŸ“¬ E-mail opstellen...") + + msg = MIMEMultipart() + msg['Subject'] = f"Prijsvoorspelling (Windows Test) {datetime.now().strftime('%Y-%m-%d')}" + msg['From'] = EMAIL_CONFIG['sender'] + msg['To'] = EMAIL_CONFIG['receiver'] -# --- START VAN HET SCRIPT --- -# (Dit deel is weer 100% identiek aan je vorige script) + laagste_prijs = result_df['Voorspelde_Prijs'].min() + hoogste_prijs = result_df['Voorspelde_Prijs'].max() + + body = f""" +Hallo, + +Dit is een test van het Windows script. +Hier is de prijsvoorspelling voor de komende {len(result_df)} uur. + +Laagste prijs: {laagste_prijs:.4f} +Hoogste prijs: {hoogste_prijs:.4f} + +Volledige voorspelling: +{result_df.to_string()} +""" + msg.attach(MIMEText(body, 'plain')) + + try: + with open(image_path, 'rb') as f: + img_attach = MIMEImage(f.read(), name='voorspelling.png') + msg.attach(img_attach) + print("āœ… Grafiek bijgevoegd.") + except Exception as e: + print(f"āŒ Kon grafiek-bestand niet lezen: {e}") + return + + try: + print(f"Verbinding maken met SMTP server: {EMAIL_CONFIG['smtp_server']}...") + server = smtplib.SMTP(EMAIL_CONFIG['smtp_server'], EMAIL_CONFIG['smtp_port']) + server.starttls() + server.login(EMAIL_CONFIG['sender'], EMAIL_CONFIG['password']) + + print("Inloggen succesvol. E-mail verzenden...") + server.sendmail(EMAIL_CONFIG['sender'], EMAIL_CONFIG['receiver'], msg.as_string()) + server.quit() + print("āœ… E-mail succesvol verzonden.") + except Exception as e: + print(f"āŒ Fout bij verzenden e-mail: {e}") + print(" Controleer je EMAIL_CONFIG (server, poort, e-mail en App-wachtwoord)") + +# --- START VAN HET SCRIPT (Aangepast) --- try: conn = mysql.connector.connect(**DB_CONFIG) werk_df = haal_data_uit_database(conn) @@ -150,25 +195,57 @@ try: if werk_df is not None: te_voorspellen_tijden = werk_df[werk_df['gemiddelde_prijs'].isnull()].index - print(f"\n🧠 Start iteratieve voorspelling voor {len(te_voorspellen_tijden)} uur...") - voorspellingen = [] - - for timestamp in te_voorspellen_tijden: - features_nu = maak_features_voor_uur(werk_df, timestamp) - voorspelde_prijs = model.predict(features_nu)[0] - werk_df.loc[timestamp, 'gemiddelde_prijs'] = voorspelde_prijs - voorspellingen.append(voorspelde_prijs) + if len(te_voorspellen_tijden) == 0: + print("\nDatabase is al up-to-date. Geen voorspelling nodig.") + else: + print(f"\n🧠 Start iteratieve voorspelling voor {len(te_voorspellen_tijden)} uur...") + voorspellingen = [] - print("\n" + "="*70) - pd.set_option('display.max_rows', None) # Zorg dat we alles printen - print(f"--- VOORSPELDE PRIJZEN (komende {len(te_voorspellen_tijden)} uur) ---") - - resultaat_df = pd.DataFrame({ - 'Voorspelde_Prijs': voorspellingen - }, index=te_voorspellen_tijden) - - print(resultaat_df) - print("="*70) + for timestamp in te_voorspellen_tijden: + features_nu = maak_features_voor_uur(werk_df, timestamp) + voorspelde_prijs = model.predict(features_nu)[0] + werk_df.loc[timestamp, 'gemiddelde_prijs'] = voorspelde_prijs + voorspellingen.append(voorspelde_prijs) + + print("\n" + "="*70) + pd.set_option('display.max_rows', None) + print(f"--- VOORSPELDE PRIJZEN (komende {len(te_voorspellen_tijden)} uur) ---") + + resultaat_df = pd.DataFrame({ + 'Voorspelde_Prijs': voorspellingen + }, index=te_voorspellen_tijden) + + print(resultaat_df) + print("="*70) + + # --- NIEUW: Grafiek maken en e-mailen --- + print("\nšŸ“Š Grafiek genereren...") + try: + fig, ax = plt.subplots(figsize=(15, 8)) + resultaat_df.plot( + ax=ax, + title=f'Energieprijs Voorspelling ({len(resultaat_df)} uur vooruit)', + legend=False, + grid=True, + style='.-' + ) + ax.set_ylabel('Voorspelde Prijs') + ax.set_xlabel('Datum en Tijd') + + laagste_prijs = resultaat_df['Voorspelde_Prijs'].min() + hoogste_prijs = resultaat_df['Voorspelde_Prijs'].max() + ax.axhline(laagste_prijs, color='green', linestyle='--', linewidth=0.8) + ax.axhline(hoogste_prijs, color='red', linestyle='--', linewidth=0.8) + + plt.savefig(GRAFIEK_BESTAND) + plt.close(fig) # Geheugen vrijgeven + print(f"āœ… Grafiek opgeslagen als: {GRAFIEK_BESTAND}") + + send_email_with_graph(GRAFIEK_BESTAND, resultaat_df) + + except Exception as e: + print(f"āŒ Fout bij genereren van grafiek: {e}") + # --- EINDE NIEUWE BLOK --- except Error as e: print(f"āŒ Fout met MySQL verbinding: {e}")