Python · Auftrags-Datengenerierung
Code
import pandas as pd import numpy as np from datetime import datetime, timedelta np.random.seed(606) # --- Kundenprofile mit individuellem Bestellverhalten --- kunden = [] branchen = ['Automotive', 'FMCG', 'Baustoffe', 'Pharma', 'Chemie', 'Lebensmittel', 'E-Commerce', 'Maschinenbau'] for i in range(43): branche = np.random.choice(branchen) # Jeder Kunde hat individuelle Saisonalität saison_peak = np.random.choice(['Q1','Q2','Q3','Q4'], p=[0.15,0.20,0.25,0.40]) # Q4 häufigster Peak basis_auftraege_woche = np.random.uniform(8, 45) wochentag_muster = np.random.dirichlet(np.ones(5) * 2) # Mo-Fr Verteilung kunden.append({ 'kunde_id': f'K-{i+1:03d}', 'branche': branche, 'basis_woche': basis_auftraege_woche, 'saison_peak': saison_peak, 'wochentag_muster': wochentag_muster, 'trend': np.random.normal(0.002, 0.004), # Wöchentlicher Trend 'volatilitaet': np.random.uniform(0.10, 0.35), }) # --- 104 Wochen (2 Jahre) Auftragsdaten --- records = [] start = datetime(2023, 1, 2) for kunde in kunden: for woche in range(104): datum = start + timedelta(weeks=woche) monat = datum.month quartal = (monat - 1) // 3 + 1 # Saisonalität saison_faktor = 1.0 peak_q = int(kunde['saison_peak'][1]) if quartal == peak_q: saison_faktor = 1.45 elif abs(quartal - peak_q) == 1: saison_faktor = 1.15 elif abs(quartal - peak_q) == 2: saison_faktor = 0.75 # Trend trend_faktor = 1 + kunde['trend'] * woche # Wochenvolumen vol = kunde['basis_woche'] * saison_faktor * trend_faktor vol *= np.random.lognormal(0, kunde['volatilitaet']) vol = max(1, vol) # Aufschlüsselung nach Wochentag for wt in range(5): tages_vol = vol * kunde['wochentag_muster'][wt] auftraege = max(0, int(np.random.poisson(tages_vol))) if auftraege > 0: records.append({ 'datum': (datum + timedelta(days=wt)).date(), 'kw': woche + 1, 'wochentag': wt, 'kunde_id': kunde['kunde_id'], 'branche': kunde['branche'], 'auftraege': auftraege, 'tonnen': round(auftraege * np.random.uniform(8, 22), 1), 'quartal': quartal, }) df = pd.DataFrame(records) print(f"Aufträge: {df['auftraege'].sum():,}") print(f"Kunden: {df['kunde_id'].nunique()}") print(f"Zeitraum: {df['datum'].min()} bis {df['datum'].max()}") print(f"Ø Aufträge/Woche: {df.groupby('kw')['auftraege'].sum().mean():.0f}")