def create(cls, site_config): """Create a new site Args: site_config (dict): config for site to create Returns: str: the site id for the newly created site Raises: rebase.InvalidUsageError: if site_config is missing some required fields Example:: >>> site_config = { 'latitude': 51, 'longitude': 7 } >>> site_id = rb.Site.create(site_config) >>> print(site_id) 4ab82692-3944-4069-9cbb-f9c59513c1c3 """ path = '{}/site/create'.format(cls.base_path) json_site = json.dumps(site_config) response = api_request.post(path, data=json_site) return response.json()
def train(model_id, start_date, end_date): """Trigger the training for a specific model Args: model_id (str): the id of the model start_date (datetime): the start date of training period end_date (datetime): the end date of training period Returns: str: - Example:: from datetime import datetime model_id = 'd9ed55d2-4c7f-4486-a55d-fba8cb2c8791' start_date = datetime(2020, 2, 3, 0, 0) end_date = datetime(2021, 1, 4, 0, 0) rb.train(model_id, start_date, end_date) """ path = 'platform/v1/model/train/{}'.format(model_id) data = { 'start_date': start_date, 'end_date': end_date } r = api_request.post(path, data=json.dumps(data)) if r.status_code != 200: raise Exception(f"Error starting train for model {model_id}: {r.content.decode('utf-8')}") return r.content.decode('utf-8')
def create(cls, packages): path = '{}/layer/create'.format(cls.base_path) data = json.dumps({'packages': packages}) response = api_request.post(path, data=data) if response.status_code == 400: raise InvalidInputError(response.text) return response.json()
def create(site_id, model): """Create a new model for the specified site Args: site_id (str): the id of the site model (class): the model class to create Returns: str: - Example:: class MyModel(rb.Model): # your code ... site_id = '4ab82692-3944-4069-9cbb-f9c59513c1c3' rb.create(site_id, MyModel) """ data = dill.dumps(model, recurse=True) params = {'model_name': model.__name__} path = 'platform/v1/model/custom/create/{}'.format(site_id) r = api_request.post(path, params=params, data=data) if r.status_code != 200: raise Exception(f"Error creating model for site {site_id}: {r.content.decode('utf-8')}") return r.json()
def update(model_id, model): """Update an existing model for a specified site Args: site_id (str): the id of the site model (class): the model class to create Returns: str: - Example:: class MyNewModel(rb.Model): # your code ... model_id = '4ab82692-3944-4069-9cbb-f9c59513c1c3' rb.update(model_id, MyNewModel) """ data = dill.dumps(model, recurse=True) params = {'model_name': model.__name__} path = 'platform/v1/model/custom/update/{}'.format(model_id) r = api_request.post(path, params=params, data=data) if r.status_code == 200: print('Ok, updated model {}'.format(model_id)) else: raise Exception('Failed updating model {}'.format(model_id))
def deploy(cls, pred): print("Deploying {}".format(pred.name)) path = 'platform/v1/site/train/{}'.format(pred.site_id) response = api_request.post(path) if response.status_code == 200: print("Success!") else: print("Failed")
def hyperparam_search(model_id, params={}, hyperparams={}, n_trials=10, compute_params={}): path = 'platform/v1/model/hyperparam_search/{}'.format(model_id) params['model_id'] = model_id params['api_key'] = rb.api_key data = { 'params': params, 'hyperparams': hyperparams, 'n_trials': n_trials, 'compute_params': compute_params } r = api_request.post(path, data=json.dumps(data)) if r.status_code != 200: raise Exception(f"Error starting hyperparam_search for model {model_id}: {r.content.decode('utf-8')}") return r.json()
def report_result(model_id, job_name=None, params={}, score=None, exception=None): path = 'platform/v1/model/hyperparam_result/{}'.format(model_id) params['model_id'] = model_id params['api_key'] = rb.api_key data = { 'job_name': job_name, 'params': params, 'score': score, 'exception': exception } r = api_request.post(path, data=json.dumps(data)) if r.status_code != 200: raise Exception(f"Error reporting hyperparam result for model {model_id}: {r.content.decode('utf-8')}") return r.json()
def upload_single_forecast(self, ref_time, df_ref_time): to_iso = lambda d : d.strftime('%Y%m%dT%H:%M:%SZ') data = { 'ref_time': to_iso(ref_time), 'valid_time': [to_iso(d) for d in df_ref_time.index], 'forecast': df_ref_time['forecast'].values.tolist() } path = 'platform/v1/model/custom/forecast/upload/{}'.format(self.model_id) r = api_request.post(path, data=json.dumps(data)) if r.status_code != 200: raise Exception(f'Failed uploading forecast: model_id: {self.model_id}', r.status_code) return True
def upload(cls, site_id, df): """Upload observed data for your site. This data is used when training a model. Args: site_id (str): id of site to upload data for df (pandas.DataFrame): DataFrame with the following format :: >>> valid_time observation 0 2020-01-22 00:00:00+00:00 126.3 1 2020-01-22 00:15:00+00:00 122.7 . ... ... n-1 2020-10-17 23:30:00+00:00 169.2 n 2020-10-17 23:45:00+00:00 176.6 Example:: >>> import pandas as pd >>> site_id = '4ab82692-3944-4069-9cbb-f9c59513c1c3' >>> df = pd.read_csv('example_data.csv') >>> rb.Site.upload(site_id, df) Success! """ path = '{}/site/measurement/upload_2/{}'.format(cls.base_path, site_id) df = df.dropna() data = { 'valid_time': pd.to_datetime(df['valid_time']).dt.strftime( '%Y-%m-%dT%H:%M:%SZ').values.tolist(), 'measurement': df['observation'].values.tolist(), 'type': 'ProductionPower' } response = api_request.post(path, data=json.dumps(data)) if response.status_code == 200: print("Success! Data from {} to {} was uploaded.".format( df.iloc[0]['valid_time'], df.iloc[-1]['valid_time'])) else: print(response.status_code)
def train(cls, site_id): """Start training for your site Args: site_id (str): id of site to train Raises: rebase.TrainingNotReadyError : if you have not uploaded observation data to train on for this site Example:: >>> site_id = '4ab82692-3944-4069-9cbb-f9c59513c1c3' >>> rb.Site.train(site_id) """ path = '{}/site/train/{}'.format(cls.base_path, site_id) response = api_request.post(path) if response.status_code == 200: print("Success! Queued training for site: {}".format(site_id)) else: raise Exception('Failed for site: {}. API status code: {}'.format( site_id, response.status_code))
def upload_trained_model(self, model_trained): path = 'platform/v1/model/custom/upload/trained/{}'.format(self.model_id) r = api_request.post(path, data=dill.dumps(model_trained)) if r.status_code != 200: raise Exception('Failed uploading trained model', r.status_code)