Estrazione Offerte Pubbliche GME [Python]

Un tutorial su come estrarre passo dopo passo le Offerte Pubbliche GME con l'SDK Python.

Artesian ti permette di avere un accesso semplice allo storico dei dati .

Vediamo passo passo come procedere.

Obiettivo

Estrarre i dati di un GME Public Offer Market Data.

I dati e i link di riferimento sono fittizi, creati appositamente per questo case. In Artesian è possibile estrarre qualsiasi dato che sia riconducibile a una Time Serie.

Vediamo passo per passo come procedere.

Importazione delle librerie e configurazione di Artesian

La prima cosa da fare per poter utilizzare tutte le funzionalità di Artesian è autenticarsi. Per fare ciò dobbiamo installare l’sdk di Artesian nell’ambiente python utilizzato, tramite il comando “pip install artesian-SDK”, e successivamente importare la libreria di base più una serie di moduli che saranno necessari per istanziare l’autenticazione verso Artesian (linea 6 dello script) e successivamente per leggere i dati.

Una volta importate le librerie necessarie, possiamo configurare Artesian, inserendo il link necessario e l’api-key.

Per poter estrarre questi due dati importanti, si può far riferimento al tutorial “Come Configure Artesian Python SDK“. 

Terminata la configurazione di Artesian, possiamo configurare il GME Public Offer Service (linea 8).

				
					from Artesian import ArtesianConfig
from Artesian.GMEPublicOffers import *
import math
import pandas as pd

cfg = ArtesianConfig("https://arkive.artesian.cloud/{tenantName}/", "{api-key}")

qs = GMEPublicOfferService(cfg)
				
			


La creazione dell'estrazione GME Public Offer

Una volta configurato Artesian e il GME Public Offer Service, possiamo iniziare a pensare a quali dati vogliamo estrarre e a come li vogliamo estrarre.

L’informazione di base da avere per poter effettuare una estrazione da Artesian, nel caso delle GME Public Offers, è la “Data” di interesse, il “Purpose” e lo “Status”. Sarà possibile estrarre solo un giorno alla volta in quanto i dati corrispondono a quelli grezzi condivisi dal GME, essendo la mole di informazioni importante è stato necessario limitare la dimensione dei dati scaricati.

Sempre a causa della quantità di dati ritornati, la chiamata è stata paginata, occorre quindi settare un numero consono di record per ogni pagina e effettuare la chiamata in maniera iterativa fino a quando non si saranno scaricati tutti i record disponibili. 

Come metadati della chiamata per poter gestire tale processo è possibile usare Page, PageSize e Count

Riporto di seguito un esempio di estrazione dei dati utilizzando la paginazione.

				
					records = qs.createQuery()\
    .forPurpose(Purpose.OFF)\
    .forStatus(Status.ACC)\
    .forDate("2022-05-10")\
    .withPagination(1,10) \
    .execute()

pages = math.ceil(records["Count"]/1000)
res = []

for i in range(1,pages+1):
    off = qs.createQuery()\
        .forPurpose(Purpose.OFF)\
        .forStatus(Status.ACC)\
        .forDate("2022-05-10")\
        .withPagination(i,1000) \
        .execute()
    res.append(off["Data"])

flat_list = [x for xs in res for x in xs]

pd.DataFrame(flat_list)
				
			

Altre opzioni per l'estrazione dei dati

 

Oltre a quelle menzionate precedentemente, ci sono altre possibili opzioni di estrazione per le GME Public Offers:

“Purpose” : rappresenta il tipo di offerta, se BID oppure OFFER.

“Status” : lo Status fa riferimento allo stato dell’offerta, i possibili valori sono: “ACC”, “REJ”, “INC”, “REP”, “REV”, “SUB”.

“Operator” : è l’operatore (l’azienda) a cui appartengono gli impianti che hanno offertato sul GME.

“Unit” : sono le unità di produzione o consumo di energia. 

“Market” :  è mercato dell’energia a cui si è interessati, i possibili valori sono “MRR”, “MGP”, “MSD”, “MB”, “MI”, …

“Scope” : la sua valorizzazione corrisponde a quanto presente nelle offerte, è in ogni caso possibile aiutarsi tramite i suggerimenti dell’SDK.

“BAType” la sua valorizzazione corrisponde a quanto presente nelle offerte, è in ogni caso possibile aiutarsi tramite i suggerimenti dell’SDK.

“Zone” : è la zona elettrica di cui si vogliono avere le informazioni.

“UnitType” : è il tipo di unità a cui si vuol fare riferimento, se di “Produzione” o di “Consumo”.

“GenerationType” : è un metadato aggiuntivo che se fornito dal cliente può essere mappato per lui a sistema, rappresenta la tipologia di Combustibile a cui un Impianto è associato. 

				
					.forDate("2020-04-01")
.forPurpose(Purpose.BID)
.forStatus(Status.ACC)
.forOperator(["Operator_1","Operator_2"])
.forUnit(["UP_1", "UP_2"])
.forMarket([Market.MGP])
.forScope([Scope.ACC, Scope.RS])
.forBAType([BAType.NETT, BAType.NERV])
.forZone([Zone.NORD])
.forUnitType([UnitType.UPV, UnitType.UP])
.forGenerationType(GenerationType.GAS)
				
			


Alternativa all'estrazione in SDK

In alternativa all’estrazione in SDK, possiamo estrarre i dati direttamente da portale in formato Excell.

 

Basta eseguire l’operazione una sola volta per poi averla completamente riproducibile e automatizzata nel nostro workflow.

Questo non solo permette di risparmiare tempo, ma permette anche di ridurre al minimo gli errori umani dati dall’eseguire operazioni ripetute su grandi moli di dati o su diversi file Excel. 

Un vantaggio innegabile che ci consente di focalizzarci sull’analisi del dato invece che sulla sua gestione e ottimizzazione.