Skip to content

Commit 8b61973

Browse files
committed
add alberta power
1 parent 33c24e9 commit 8b61973

File tree

3 files changed

+59
-7
lines changed

3 files changed

+59
-7
lines changed

dweather_client/client.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from timezonefinder import TimezoneFinder
1313
from dweather_client import gridded_datasets
1414
from dweather_client.storms_datasets import IbtracsDataset, AtcfDataset, SimulatedStormsDataset
15-
from dweather_client.ipfs_queries import StationDataset, YieldDatasets, AemoPowerDataset, AemoGasDataset
15+
from dweather_client.ipfs_queries import StationDataset, YieldDatasets, AemoPowerDataset, AemoGasDataset, AesoPowerDataset
1616
from dweather_client.ipfs_errors import *
1717
import ipfshttpclient
1818

@@ -238,9 +238,20 @@ def get_yield_history(commodity, state, county, dataset="sco-yearly", ipfs_timeo
238238
def get_power_history(ipfs_timeout=None):
239239
"""
240240
return:
241-
dict with datetime keys and values that are two member dicts with keys 'demand' and 'price'
241+
dict with datetime keys and values that are dicts with keys 'demand' and 'price'
242242
"""
243243
return AemoPowerDataset(ipfs_timeout=ipfs_timeout).get_data()
244244

245245
def get_gas_history(ipfs_timeout=None):
246+
"""
247+
return:
248+
dict with date keys and float values
249+
"""
246250
return AemoGasDataset(ipfs_timeout=ipfs_timeout).get_data()
251+
252+
def get_alberta_power_history(ipfs_timeout=None):
253+
"""
254+
return:
255+
dict with datetime keys and values that are dicts with keys 'price' 'ravg' and 'demand'
256+
"""
257+
return AesoPowerDataset(ipfs_timeout=ipfs_timeout).get_data()

dweather_client/ipfs_queries.py

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ def get_data(self, commodity, state, county):
412412
file_name = f"{self.head}/{commodity}-{state}-{county}.csv"
413413
return self.get_file_object(file_name).read().decode("utf-8")
414414

415-
class AemoDataset(IpfsDataset):
415+
class PowerDataset(IpfsDataset):
416416
"""
417417
Abstract class from which all AEMO datasets inherit
418418
"""
@@ -431,7 +431,10 @@ def get_date_range_from_metadata(self, h):
431431
return: list of [start_time, end_time]
432432
"""
433433
metadata = self.get_metadata(h)
434-
str_dates = (metadata["date_range"][0], metadata["date_range"][1])
434+
try:
435+
str_dates = (metadata["date_range"][0], metadata["date_range"][1])
436+
except KeyError:
437+
str_dates = (metadata["date range"][0], metadata["date range"][1])
435438
return [datetime.datetime.fromisoformat(dt) for dt in str_dates]
436439

437440
def get_data(self):
@@ -444,7 +447,7 @@ def get_data(self):
444447
ret_dict = {**ret_dict, **new_dict}
445448
return ret_dict
446449

447-
class AemoPowerDataset(AemoDataset):
450+
class AemoPowerDataset(PowerDataset):
448451
"""
449452
Instantiable class for AEMO Victoria power data
450453
"""
@@ -472,7 +475,7 @@ def extract_data_from_gz(self, date_range, ipfs_hash):
472475
return data_dict
473476

474477

475-
class AemoGasDataset(AemoDataset):
478+
class AemoGasDataset(PowerDataset):
476479
"""
477480
Instantiable class for AEMO Victoria gas data
478481
"""
@@ -494,3 +497,30 @@ def extract_data_from_gz(self, date_range, ipfs_hash):
494497
data_dict[date_itr] = float(day_data)
495498
date_itr = date_itr + datetime.timedelta(days=1)
496499
return data_dict
500+
501+
class AesoPowerDataset(PowerDataset):
502+
"""
503+
Instantiable class for AEMO Victoria gas data
504+
"""
505+
@property
506+
def dataset(self):
507+
return "alberta_power-hourly"
508+
509+
@property
510+
def data_file_name(self):
511+
return "aeso_update.gz"
512+
513+
def extract_data_from_gz(self, date_range, ipfs_hash):
514+
with gzip.open(self.get_file_object(f"{ipfs_hash}/{self.data_file_name}")) as gz:
515+
cell_text = gz.read().decode('utf-8')
516+
time_itr = date_range[0]
517+
data_dict = {}
518+
for year_data in cell_text.split('\n'):
519+
for hour_data in year_data.split(','):
520+
if not hour_data:
521+
price, ravg, demand = -9999, -9999, -9999
522+
else:
523+
price, ravg, demand = hour_data.split("_")
524+
data_dict[time_itr] = {"price": float(price), "ravg": float(ravg), "demand": float(demand)}
525+
time_itr = time_itr + datetime.timedelta(hours=1)
526+
return data_dict

dweather_client/tests/test_client.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from dweather_client.client import get_station_history, get_gridcell_history, get_tropical_storms,\
2-
get_yield_history, get_power_history, get_gas_history, GRIDDED_DATASETS
2+
get_yield_history, get_power_history, get_gas_history, get_alberta_power_history, GRIDDED_DATASETS
33
from dweather_client.aliases_and_units import snotel_to_ghcnd
44
import numpy as np
55
import pandas as pd
@@ -142,6 +142,17 @@ def test_gas():
142142

143143
assert date_diff.days + 1 == len(power_dict)
144144

145+
def test_aeso_power():
146+
power_dict = get_alberta_power_history(ipfs_timeout=IPFS_TIMEOUT)
147+
dict_length = len(power_dict)
148+
assert dict_length >= 188098
149+
150+
first_date, last_date = sorted(power_dict)[0], sorted(power_dict)[-1]
151+
time_diff = last_date - first_date
152+
time_diff_hours = time_diff.days * 24 + time_diff.seconds // 3600
153+
154+
assert time_diff_hours + 1 == len(power_dict)
155+
145156
''' TODO some tests for RTMA behavior to be integrated into the new system
146157
def test_lat_lon_to_grid():
147158
heads = http_client.get_heads()

0 commit comments

Comments
 (0)