Spaces:
Running
Running
| """ | |
| One-time script used to generate data/price_curves.json | |
| Generate 30 days of realistic ISO New England-style hourly price data. | |
| Run: python data/generate_prices.py | |
| Output: data/price_curves.json | |
| """ | |
| import json | |
| import math | |
| import random | |
| random.seed(12345) | |
| def generate_day(day_type: str = "weekday") -> list[float]: | |
| """Generate 24 hourly prices for one day.""" | |
| prices = [] | |
| for hour in range(24): | |
| # Base time-of-use price | |
| if hour < 6: # overnight off-peak | |
| base = 0.035 + random.gauss(0, 0.005) | |
| elif hour < 8: # morning ramp | |
| base = 0.07 + random.gauss(0, 0.008) | |
| elif hour < 12: # morning peak | |
| base = 0.16 + random.gauss(0, 0.020) + (0.05 if day_type == "weekday" else 0) | |
| elif hour < 14: # midday moderate | |
| base = 0.10 + random.gauss(0, 0.012) | |
| elif hour < 17: # afternoon | |
| base = 0.12 + random.gauss(0, 0.015) | |
| elif hour < 21: # evening super-peak | |
| base = 0.22 + random.gauss(0, 0.025) + (0.08 if day_type == "weekday" else 0.02) | |
| elif hour < 23: # evening wind-down | |
| base = 0.09 + random.gauss(0, 0.010) | |
| else: # late night | |
| base = 0.04 + random.gauss(0, 0.006) | |
| # Seasonal variation (summer = higher peaks) | |
| season_mult = 1.0 | |
| prices.append(round(max(0.02, base * season_mult), 4)) | |
| return prices | |
| # Generate 30 days: 22 weekdays + 8 weekend days | |
| days = [] | |
| day_types = (["weekday"] * 5 + ["weekend"] * 2) * 5 # 5 weeks → 35 days → take 30 | |
| for i, dt in enumerate(day_types[:30]): | |
| day_data = { | |
| "day": i + 1, | |
| "day_type": dt, | |
| "prices_usd_per_kwh": generate_day(dt), | |
| "source": "synthetic_iso_new_england_style", | |
| "region": "ISONE", | |
| "currency": "USD", | |
| } | |
| days.append(day_data) | |
| output = { | |
| "description": "30 days of synthetic ISO New England-style hourly electricity price data", | |
| "units": "USD/kWh", | |
| "hours_per_day": 24, | |
| "days": days, | |
| } | |
| with open("price_curves.json", "w") as f: | |
| json.dump(output, f, indent=2) | |
| print(f"Generated {len(days)} days of price data -> data/price_curves.json") | |