Source code for solarforecastarbiter.io.fetch.rtc

"""Collection of code for requesting and parsing Data from the DOE
RTC pv-dashboard hosted by Sandia National Laboratories
"""
import logging


import pandas as pd
import requests

DOE_RTC_API_URL = "https://pv-dashboard.sandia.gov/api/v1.0/location/{location}/data/{data_type}/start/{start}/end/{end}/key/{api_key}" # NOQA
logger = logging.getLogger(__name__)


[docs]def request_doe_rtc_data(location, data_type, start, end, api_key): """Makes a request to DOE RTC pv dashboard with the provided parameters. Parameters ---------- location: string Name of the DOE RTC location. data_type: string 'system' or 'weather' api_key: string The Api key for accessing the RTC pv dashboard API. start: datetime Beginning of the period for which to request data. end: datetime End of the period for which to request data. Returns ------- DataFrame DataFrame parsed from the json response. """ request_url = DOE_RTC_API_URL.format( location=location, start=start.strftime('%Y-%m-%d'), end=end.strftime('%Y-%m-%d'), data_type=data_type, api_key=api_key) r = requests.get(request_url) resp = r.json() if 'access' in resp and resp['access'] == 'denied': raise ValueError('Invalid DOE RTC API key') else: return pd.DataFrame(resp)
[docs]def fetch_doe_rtc(location, api_key, start, end): """ Requests and concatenates data from the DOE RTC pv dashboard API into a single dataframe. Parameters ---------- location: string Name of the DOE RTC location. api_key: string The Api key for accessing the DOE RTC API. start: datetime Beginning of the period for which to request data. end: datetime End of the period for which to request data. Returns ------- pandas.DataFrame With data from start to end. Index is a datetime-index NOT localized but in the timezone for the location """ data_types = ['system', 'weather'] dfs = [] for data_type in data_types: df = request_doe_rtc_data(location, data_type, start, end, api_key) if df.empty: continue df.index = pd.to_datetime(df['TmStamp'], unit='ms', utc=False) df = df.drop('TmStamp', axis=1) # Append the datatype to the end of AmbientTemp so we can differentiate # system from weather temperatures df = df.rename(columns={'AmbientTemp': f'AmbientTemp_{data_type}'}) dfs.append(df) try: data = pd.concat(dfs, axis=1) except ValueError: # empty data return pd.DataFrame() return data