Python · Verbrauchsdaten-Generierung
Code
import pandas as pd import numpy as np from datetime import datetime, timedelta np.random.seed(505) LKW_COUNT = 150 WOCHEN = 52 # --- Fahrzeug-Basisprofile --- fahrzeuge = [] for i in range(LKW_COUNT): baujahr = np.random.choice([2018,2019,2020,2021,2022,2023], p=[0.08,0.12,0.20,0.25,0.20,0.15]) motortyp = np.random.choice(['Euro6d', 'Euro6e'], p=[0.6, 0.4]) basis_verbrauch = np.random.normal(30.5, 2.0) # l/100km if baujahr <= 2019: basis_verbrauch += 1.5 # Ältere verbrauchen mehr # Anomalien: 12% der Fahrzeuge haben ein verstecktes Problem hat_anomalie = np.random.random() < 0.12 anomalie_typ = None anomalie_start_woche = None if hat_anomalie: anomalie_typ = np.random.choice([ 'injektor_defekt', # +3-5 l/100km 'turbo_undicht', # +2-4 l/100km 'luftfilter_verstopft', # +1.5-3 l/100km 'reifendruck_niedrig', # +1-2 l/100km 'tempomat_defekt', # +2-3 l/100km (ungleichmäßig) ]) anomalie_start_woche = np.random.randint(10, 40) fahrzeuge.append({ 'lkw_id': f'LKW-{i+1:03d}', 'baujahr': baujahr, 'motortyp': motortyp, 'basis_l100': basis_verbrauch, 'hat_anomalie': hat_anomalie, 'anomalie_typ': anomalie_typ, 'anomalie_start': anomalie_start_woche, }) # --- Wochenweise Verbrauchsdaten --- records = [] for fzg in fahrzeuge: for woche in range(1, WOCHEN + 1): km = np.random.normal(2200, 400) beladung = np.random.normal(18, 4) autobahn_anteil = np.random.uniform(0.3, 0.85) hoehenmeter = np.random.exponential(800) temperatur = 10 + 12 * np.sin((woche - 12) / 52 * 2 * np.pi) # Verbrauchsmodell: physikbasiert verbrauch = fzg['basis_l100'] verbrauch += beladung * 0.12 # Beladungseffekt verbrauch -= autobahn_anteil * 2.5 # Autobahn effizienter verbrauch += hoehenmeter / 1000 * 1.8 # Höhenmeter-Effekt verbrauch += (20 - temperatur) * 0.04 # Kälte-Effekt verbrauch *= np.random.lognormal(0, 0.04) # Anomalie einfügen anomalie_aktiv = False if fzg['hat_anomalie'] and woche >= fzg['anomalie_start']: anomalie_aktiv = True wochen_seit_start = woche - fzg['anomalie_start'] if fzg['anomalie_typ'] == 'injektor_defekt': verbrauch += 3.0 + wochen_seit_start * 0.15 elif fzg['anomalie_typ'] == 'turbo_undicht': verbrauch += 2.5 + wochen_seit_start * 0.08 elif fzg['anomalie_typ'] == 'luftfilter_verstopft': verbrauch += 1.5 + wochen_seit_start * 0.12 elif fzg['anomalie_typ'] == 'reifendruck_niedrig': verbrauch += np.random.uniform(1.0, 2.0) elif fzg['anomalie_typ'] == 'tempomat_defekt': verbrauch += np.random.uniform(1.5, 4.0) liter_gesamt = verbrauch / 100 * km records.append({ 'kw': woche, 'lkw_id': fzg['lkw_id'], 'baujahr': fzg['baujahr'], 'km': round(km), 'beladung_t': round(beladung, 1), 'autobahn_anteil': round(autobahn_anteil, 2), 'hoehenmeter': round(hoehenmeter), 'temperatur_c': round(temperatur, 1), 'liter_gesamt': round(liter_gesamt, 1), 'l_100km': round(verbrauch, 2), 'anomalie_aktiv': anomalie_aktiv, }) df = pd.DataFrame(records) print(f"Dataset: {len(df):,} Wochen-Records") print(f"Fahrzeuge: {df['lkw_id'].nunique()}") print(f"Ø Verbrauch: {df['l_100km'].mean():.1f} l/100km") print(f"Anomalie-Wochen: {df['anomalie_aktiv'].sum():,}")