aboutsummaryrefslogtreecommitdiff
path: root/server/services/get_data.py
diff options
context:
space:
mode:
Diffstat (limited to 'server/services/get_data.py')
-rw-r--r--server/services/get_data.py67
1 files changed, 48 insertions, 19 deletions
diff --git a/server/services/get_data.py b/server/services/get_data.py
index 1b446c6..3014ea1 100644
--- a/server/services/get_data.py
+++ b/server/services/get_data.py
@@ -11,12 +11,16 @@ MARKET_CLASSES: Dict[str, Type] = {
"NYISO": NYISO,
}
+
def get_iso_instance(market: str):
market = market.upper()
if market not in MARKET_CLASSES:
- raise ValueError(f"Unsupported market '{market}'. Supported: {list(MARKET_CLASSES.keys())}")
+ raise ValueError(
+ f"Unsupported market '{market}'. Supported: {list(MARKET_CLASSES.keys())}"
+ )
return MARKET_CLASSES[market]()
+
def update_market_data():
db: Session = SessionLocal()
@@ -24,20 +28,30 @@ def update_market_data():
print(f"Processing {market_name}")
iso = get_iso_instance(market_name)
- # --- Real-Time Data (5 min) ---
- last_realtime = db.query(MarketDataDB)\
- .filter(MarketDataDB.market == market_name, MarketDataDB.type == "REALTIME")\
- .order_by(MarketDataDB.timestamp.desc())\
+ last_realtime = (
+ db.query(MarketDataDB)
+ .filter(MarketDataDB.market == market_name, MarketDataDB.type == "REALTIME")
+ .order_by(MarketDataDB.timestamp.desc())
.first()
+ )
- if not last_realtime or (datetime.now(UTC) - last_realtime.timestamp.replace(tzinfo=UTC) > timedelta(minutes=5)):
+ if not last_realtime or (
+ datetime.now(UTC) - last_realtime.timestamp.replace(tzinfo=UTC)
+ > timedelta(minutes=5)
+ ):
print(f"Getting realtime data for {market_name}")
df = iso.get_lmp(date="latest", market="REAL_TIME_5_MIN", locations="ALL")
- df["Interval Start"] = df["Interval Start"].dt.tz_convert('UTC')
- grouped = df.groupby("Interval Start")[["LMP", "Energy", "Congestion", "Loss"]].mean().reset_index()
+ df["Interval Start"] = df["Interval Start"].dt.tz_convert("UTC")
+ grouped = (
+ df.groupby("Interval Start")[["LMP", "Energy", "Congestion", "Loss"]]
+ .mean()
+ .reset_index()
+ )
for _, row in grouped.iterrows():
- if last_realtime and row["Interval Start"] <= last_realtime.timestamp.replace(tzinfo=UTC):
+ if last_realtime and row[
+ "Interval Start"
+ ] <= last_realtime.timestamp.replace(tzinfo=UTC):
continue # Skip old data
entry = MarketDataDB(
timestamp=row["Interval Start"],
@@ -50,24 +64,38 @@ def update_market_data():
)
db.add(entry)
- # --- Day-Ahead Hourly Data (1 hour) ---
- last_dayahead = db.query(MarketDataDB)\
- .filter(MarketDataDB.market == market_name, MarketDataDB.type == "DAYAHEAD")\
- .order_by(MarketDataDB.timestamp.desc())\
+ last_dayahead = (
+ db.query(MarketDataDB)
+ .filter(MarketDataDB.market == market_name, MarketDataDB.type == "DAYAHEAD")
+ .order_by(MarketDataDB.timestamp.desc())
.first()
+ )
- if not last_dayahead or (datetime.now(UTC) - last_dayahead.timestamp.replace(tzinfo=UTC) > timedelta(hours=1)):
+ if not last_dayahead or (
+ datetime.now(UTC) - last_dayahead.timestamp.replace(tzinfo=UTC)
+ > timedelta(hours=1)
+ ):
print(f"Getting day-ahead data for {market_name}")
now_utc = datetime.now(UTC)
day_ahead_date = now_utc.date()
- if now_utc.hour >= 18: # After 6PM UTC, markets usually publish next day's data
+ if (
+ now_utc.hour >= 18
+ ): # After 6PM UTC, markets usually publish next day's data
day_ahead_date += timedelta(days=1)
- df = iso.get_lmp(date=day_ahead_date, market="DAY_AHEAD_HOURLY", locations="ALL")
- df["Interval Start"] = df["Interval Start"].dt.tz_convert('UTC')
- grouped = df.groupby("Interval Start")[["LMP", "Energy", "Congestion", "Loss"]].mean().reset_index()
+ df = iso.get_lmp(
+ date=day_ahead_date, market="DAY_AHEAD_HOURLY", locations="ALL"
+ )
+ df["Interval Start"] = df["Interval Start"].dt.tz_convert("UTC")
+ grouped = (
+ df.groupby("Interval Start")[["LMP", "Energy", "Congestion", "Loss"]]
+ .mean()
+ .reset_index()
+ )
for _, row in grouped.iterrows():
- if last_dayahead and row["Interval Start"] <= last_dayahead.timestamp.replace(tzinfo=UTC):
+ if last_dayahead and row[
+ "Interval Start"
+ ] <= last_dayahead.timestamp.replace(tzinfo=UTC):
continue
entry = MarketDataDB(
timestamp=row["Interval Start"],
@@ -83,5 +111,6 @@ def update_market_data():
db.commit()
db.close()
+
if __name__ == "__main__":
update_market_data()