import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
# Set random seed for reproducibility
np.random.seed(2025)
# Depot location (Hamburg Hauptbahnhof)
depot = {
'name': 'QuickBite Depot',
'lat': 53.5511,
'lon': 10.0063
}
# Generate 120 delivery locations across Hamburg
# Hamburg spans roughly: lat 53.45-53.65, lon 9.85-10.15
def generate_hamburg_deliveries(n=120):
deliveries = []
# Create realistic clusters (residential areas, business districts)
clusters = [
{'lat': 53.5511, 'lon': 10.0063, 'n': 30, 'type': 'city_center'}, # Altstadt
{'lat': 53.5534, 'lon': 9.9700, 'n': 25, 'type': 'residential'}, # Altona
{'lat': 53.5753, 'lon': 10.0153, 'n': 18, 'type': 'residential'}, # Eppendorf
{'lat': 53.5580, 'lon': 10.0742, 'n': 20, 'type': 'business'}, # Wandsbek
{'lat': 53.5252, 'lon': 9.9350, 'n': 12, 'type': 'residential'}, # Bahrenfeld
{'lat': 53.5440, 'lon': 10.0465, 'n': 15, 'type': 'business'}, # HafenCity
]
delivery_id = 1
for cluster in clusters:
for i in range(cluster['n']):
# Add random variation around cluster center
lat = np.random.normal(cluster['lat'], 0.008)
lon = np.random.normal(cluster['lon'], 0.012)
# Determine time window based on cluster type
if cluster['type'] == 'business':
# Business districts: More lunch orders
hour = np.random.choice([12, 13, 18, 19], p=[0.4, 0.3, 0.2, 0.1])
else:
# Residential: More dinner orders
hour = np.random.choice([12, 13, 18, 19], p=[0.1, 0.2, 0.4, 0.3])
minute = np.random.randint(0, 60)
# Time window: ±15 minutes from requested time
requested_time = f"{hour:02d}:{minute:02d}"
window_start = f"{hour:02d}:{max(0, minute-15):02d}"
window_end_min = minute + 15
window_end_hour = hour + (window_end_min // 60)
window_end_min = window_end_min % 60
window_end = f"{window_end_hour:02d}:{window_end_min:02d}"
deliveries.append({
'delivery_id': delivery_id,
'lat': lat,
'lon': lon,
'area': cluster['type'],
'requested_time': requested_time,
'window_start': window_start,
'window_end': window_end,
'order_value': np.random.normal(35, 10)
})
delivery_id += 1
return pd.DataFrame(deliveries)
# Generate delivery data
deliveries_df = generate_hamburg_deliveries(120)
# Display first 10 deliveries
print("QUICKBITE DELIVERY DATA - Tuesday, Nov 19, 2024")
print("=" * 80)
print(deliveries_df.head(10).to_string(index=False))
print(f"\n... and {len(deliveries_df) - 10} more deliveries")
print("\n" + "=" * 80)
print(f"Total deliveries: {len(deliveries_df)}")
print(f"Total order value: €{deliveries_df['order_value'].sum():.2f}")