Python · Touren-Datengenerierung
Code
import pandas as pd import numpy as np from datetime import datetime, timedelta np.random.seed(404) # --- Regionen / Hubs --- regionen = { 'HAM': (53.55, 9.99), 'BER': (52.52, 13.41), 'MUC': (48.14, 11.58), 'FRA': (50.11, 8.68), 'KOL': (50.94, 6.96), 'STR': (48.78, 9.18), 'DUS': (51.23, 6.78), 'DOR': (51.51, 7.47), 'HAN': (52.37, 9.74), 'LEI': (51.34, 12.37), 'NUR': (49.45, 11.08), 'BRE': (53.08, 8.81), 'DRE': (51.05, 13.74), 'ESS': (51.46, 7.01), 'KAR': (49.01, 8.40), 'MAN': (49.49, 8.47), 'AUG': (48.37, 10.90), 'KAS': (51.32, 9.50), 'WIE': (50.08, 8.24), 'KIE': (54.32, 10.14), # EU-Partner 'AMS': (52.37, 4.90), 'ROT': (51.93, 4.48), 'ANT': (51.22, 4.40), 'WIE_AT': (48.21, 16.37), 'PRA': (50.08, 14.44), 'WAR': (52.23, 21.01), 'MAI': (45.46, 9.19), 'LYO': (45.76, 4.84), } reg_names = list(regionen.keys()) # --- Bekannte Ungleichgewichte (realitätsnah) --- # Süd→Nord hat weniger Rückfracht als Nord→Süd # NL/BE→DE hat Überschuss, DE→Ost hat wenig Rückfracht touren = [] start_date = datetime(2024, 1, 1) for _ in range(42000): tag = start_date + timedelta(days=np.random.randint(0, 365)) wochentag = tag.weekday() lkw = f'LKW-{np.random.randint(1,151):03d}' # Hinfahrt: immer beladen start = np.random.choice(reg_names[:20]) # DE-Hubs ziel = np.random.choice(reg_names) while ziel == start: ziel = np.random.choice(reg_names) distanz = np.random.randint(150, 850) # Rückfahrt: Leerfahrt-Wahrscheinlichkeit abhängig von Relation leer_prob = 0.15 # Basis if ziel in ['WAR','PRA','DRE','LEI']: leer_prob += 0.20 # Ost: wenig Rückfracht if ziel in ['KIE','BRE']: leer_prob += 0.12 # Norddeutschland: dünn if ziel in ['LYO','MAI']: leer_prob += 0.15 # Südeuropa: Ungleichgewicht if wochentag == 4: leer_prob += 0.08 # Freitag: weniger Aufträge if wochentag == 0: leer_prob -= 0.05 # Montag: Rückstau ist_leer = np.random.random() < leer_prob leer_km = distanz * np.random.uniform(0.6, 1.0) if ist_leer else 0 touren.append({ 'datum': tag.date(), 'wochentag': wochentag, 'lkw_id': lkw, 'start': start, 'ziel': ziel, 'distanz_km': distanz, 'beladen': not ist_leer, 'leer_km': round(leer_km), 'diesel_liter': round(distanz * np.random.uniform(0.28, 0.35), 1), }) df = pd.DataFrame(touren) leer_quote = df['leer_km'].sum() / df['distanz_km'].sum() * 100 print(f"Touren: {len(df):,}") print(f"Leerfahrtquote: {leer_quote:.1f}%") print(f"Leerkilometer gesamt: {df['leer_km'].sum():,.0f} km")