Python · Datengenerierung Reifenverschleiß
Code
import pandas as pd import numpy as np from datetime import datetime, timedelta np.random.seed(2024) # --- Fahrzeugflotte --- LKW_COUNT = 150 POSITIONEN = ['VL', 'VR', 'HL1', 'HL2', 'HR1', 'HR2', 'AL1', 'AL2', 'AR1', 'AR2'] # V=Vorne, H=Hinten, A=Auflieger # Streckenprofile: Jeder LKW hat ein dominantes Streckenprofil streckenprofile = { 'Autobahn-dominiert': {'ab_anteil': 0.75, 'verschleiss_faktor': 0.85}, 'Mischverkehr': {'ab_anteil': 0.50, 'verschleiss_faktor': 1.00}, 'Stadt-/Verteiler': {'ab_anteil': 0.20, 'verschleiss_faktor': 1.35}, 'Bergstrecken': {'ab_anteil': 0.55, 'verschleiss_faktor': 1.25}, } fahrzeuge = [] for i in range(LKW_COUNT): profil = np.random.choice(list(streckenprofile.keys()), p=[0.35, 0.30, 0.25, 0.10]) fahrzeuge.append({ 'lkw_id': f'LKW-{i+1:03d}', 'streckenprofil': profil, 'km_pro_woche': np.random.normal(2200, 400), 'avg_beladung_t': np.random.normal(18, 4), 'avg_geschwindigkeit': np.random.normal(72, 8), 'bremsvorgaenge_pro_100km': np.random.normal(45, 15), 'reifenmarke': np.random.choice(['Michelin', 'Continental', 'Bridgestone', 'Goodyear', 'Pirelli']), }) # --- Wochenweise Verschleißsimulation --- records = [] for fzg in fahrzeuge: profil = streckenprofile[fzg['streckenprofil']] for pos in POSITIONEN: # Position beeinflusst Verschleiß: Lenkachse > Antriebsachse > Auflieger pos_faktor = 1.0 if pos.startswith('V'): pos_faktor = 1.15 # Lenkung elif pos.startswith('H'): pos_faktor = 1.10 # Antrieb else: pos_faktor = 0.90 # Auflieger profiltiefe = 8.0 # mm Neuzustand reifen_alter_wochen = np.random.randint(0, 30) for woche in range(52): km = fzg['km_pro_woche'] * np.random.uniform(0.7, 1.3) beladung = fzg['avg_beladung_t'] * np.random.uniform(0.6, 1.2) # Verschleißformel: f(km, beladung, profil, position, alter) verschleiss_mm = ( km / 1000 * 0.035 * profil['verschleiss_faktor'] * pos_faktor * (1 + beladung / 100) * (1 + reifen_alter_wochen * 0.002) * np.random.lognormal(0, 0.12) ) profiltiefe = max(0.5, profiltiefe - verschleiss_mm) reifen_alter_wochen += 1 datum = datetime(2024, 1, 1) + timedelta(weeks=woche) records.append({ 'datum': datum.date(), 'kw': woche + 1, 'lkw_id': fzg['lkw_id'], 'position': pos, 'streckenprofil': fzg['streckenprofil'], 'reifenmarke': fzg['reifenmarke'], 'km_woche': round(km), 'beladung_t': round(beladung, 1), 'bremsvorgaenge': int(fzg['bremsvorgaenge_pro_100km'] * km / 100), 'profiltiefe_mm': round(profiltiefe, 2), 'reifen_alter_wochen': reifen_alter_wochen, }) # Reifenwechsel wenn unter 3mm (gesetzl. Minimum: 1.6mm) if profiltiefe < 3.0: profiltiefe = 8.0 reifen_alter_wochen = 0 df = pd.DataFrame(records) print(f"Dataset: {len(df):,} Messwerte") print(f"Fahrzeuge: {df['lkw_id'].nunique()}") print(f"Reifenwechsel erkannt: {(df['profiltiefe_mm'] == 8.0).sum():,}")