import json import requests import numpy as np import pandas as pd import datetime as dt # Predico instance URL. Switch BASE_URL to the environment you want to use: # - Playground: https://playground.predico.inesctec.pt # - Production: https://predico.inesctec.pt BASE_URL = "https://predico.inesctec.pt" API_URL = f"{BASE_URL}/api/v1" # Authenticate via `/token` endpoint access_token = "your_access_token_here" headers = { 'Authorization': f'Bearer {access_token}', 'Accept': 'application/json' } # Challenge resource name. resource_name = "wind_farm_1" # Get challenges target resource identifier (UUID) # (this is also available via the /market/challenge/ endpoint ) response = requests.get( url=f"{API_URL}/user/resource", params={'resource_name': resource_name}, headers=headers, timeout=30 ) # Check if the request was successful if response.status_code == 200: resources = response.json() else: print("Failed to retrieve resource data.") print(f"Status code: {response.status_code}") exit() # Get resource ID (UUID): resource_id = resources["data"][0]["id"] print("Resource ID:", resource_id) # Create a random 72h submission (random values): # Generate datetime values for the challenge period: start_datetime = dt.datetime.now(dt.timezone.utc) + dt.timedelta(hours=1) # from 1h ahead from now end_datetime = start_datetime + dt.timedelta(hours=71) # to 71h ahead # Ensure we only work with quarter-hourly intervals start_datetime = start_datetime.replace(minute=0, second=0, microsecond=0) end_datetime = end_datetime.replace(minute=0, second=0, microsecond=0) # Generate a range of datetime values with 15-minute intervals datetime_range = pd.date_range(start=start_datetime, end=end_datetime, freq='15min') datetime_range = [x.strftime("%Y-%m-%dT%H:%M:%SZ") for x in datetime_range] # Generate random Q50 (median) values, then derive Q10/Q90 around it so that # Q10 <= Q50 <= Q90 holds at every timestamp (as required by the API). q50 = np.random.uniform(low=0.1, high=0.9, size=len(datetime_range)) quantile_values = { "q10": [round(float(x), 3) for x in np.clip(q50 - 0.1, 0.0, 1.0)], "q50": [round(float(x), 3) for x in q50], "q90": [round(float(x), 3) for x in np.clip(q50 + 0.1, 0.0, 1.0)], } # Prepare submissions for the three quantiles Q10, Q50, Q90: submission_list = [] for qt in ["q50", "q10", "q90"]: qt_forec = pd.DataFrame({ 'datetime': datetime_range, 'value': quantile_values[qt], }) submission_list.append({ "variable": qt, "forecasts": qt_forec.to_dict(orient="records") }) # Your submissions: print("Submission List:") for i, submission in enumerate(submission_list): print("-"*79) print(f"Submission #{i+1}") print(json.dumps(submission, indent=3)) # Submit the forecasts: for submission in submission_list: response = requests.post(url=f"{API_URL}/market/continuous-forecasts/{resource_id}", json=submission, headers=headers, timeout=30) # Check if the request was successful if response.status_code == 201: print(f"Response: {response.json()}") print(f"Forecast submission successful for {submission['variable']} quantile.") else: print(f"Failed to submit forecast for {submission['variable']} quantile.") print(f"Status code: {response.status_code}") print(f"Response: {response.content}")