EVolve-Intelligence-Backend / app /data /synthetic_bms.py
Demonicade's picture
Upload folder using huggingface_hub
2d7db98 verified
Raw
History Blame Contribute Delete
2.82 kB
import numpy as np
import pandas as pd
from datetime import datetime, timedelta
VEHICLE_IDS = ["EV-FRT-001", "EV-FRT-002", "EV-FRT-003", "EV-LM-004", "EV-LM-005",
"EV-BUS-006", "EV-MIN-007", "EV-MIN-008", "EV-CST-009", "EV-CST-010"]
def generate_bms_history(vehicle_id: str, days: int = 365, seed: int = None) -> pd.DataFrame:
if seed is not None:
np.random.seed(seed)
# Vehicle profile influences degradation
profiles = {
"EV-FRT-001": {"base_temp": 32, "fast_charge_freq": 0.05, "cycles_per_day": 1.2},
"EV-FRT-002": {"base_temp": 34, "fast_charge_freq": 0.10, "cycles_per_day": 1.4},
"EV-FRT-003": {"base_temp": 30, "fast_charge_freq": 0.03, "cycles_per_day": 1.0},
"EV-LM-004": {"base_temp": 28, "fast_charge_freq": 0.20, "cycles_per_day": 2.0},
"EV-LM-005": {"base_temp": 29, "fast_charge_freq": 0.15, "cycles_per_day": 1.8},
"EV-BUS-006": {"base_temp": 35, "fast_charge_freq": 0.02, "cycles_per_day": 1.0},
"EV-MIN-007": {"base_temp": 38, "fast_charge_freq": 0.08, "cycles_per_day": 1.6},
"EV-MIN-008": {"base_temp": 40, "fast_charge_freq": 0.12, "cycles_per_day": 1.7},
"EV-CST-009": {"base_temp": 33, "fast_charge_freq": 0.06, "cycles_per_day": 1.3},
"EV-CST-010": {"base_temp": 31, "fast_charge_freq": 0.04, "cycles_per_day": 1.1},
}
profile = profiles.get(vehicle_id, profiles["EV-FRT-001"])
records = []
start = datetime.utcnow() - timedelta(days=days)
cycle_count = 0
for i in range(days):
timestamp = start + timedelta(days=i)
# Daily reading (one representative point per day)
temp = profile['base_temp'] + np.random.normal(0, 3)
if np.random.random() < 0.02:
temp += np.random.uniform(8, 18) # thermal event
cycle_count += profile['cycles_per_day'] + np.random.normal(0, 0.1)
soc = np.random.uniform(30, 90)
# Fast charge event
is_fast_charge = np.random.random() < profile['fast_charge_freq']
current = np.random.uniform(-80, 120)
if is_fast_charge:
current = np.random.uniform(200, 320)
voltage = 350 + (100 - soc) * 0.8 + np.random.normal(0, 2)
records.append({
"timestamp": timestamp,
"vehicle_id": vehicle_id,
"soc": round(soc, 1),
"voltage": round(voltage, 1),
"current": round(current, 1),
"temperature": round(temp, 1),
"cycle_count": int(cycle_count),
"odometer_km": round(cycle_count * np.random.uniform(80, 120), 1)
})
return pd.DataFrame(records)
def get_all_bms_data() -> dict:
data = {}
for vid in VEHICLE_IDS:
data[vid] = generate_bms_history(vid, days=365, seed=hash(vid) % 10000)
return data