SPACEX FALCON 9 – esempio di previsione del successo o meno dell’atterraggio del primo stadio sulla base di alcuni dati di input – I parte –

SPACEX FALCON 9 – esempio di previsione del successo o meno dell’atterraggio del primo stadio sulla base di alcuni dati di input – I parte –

Settembre 6, 2023 0 Di Ruggero Grando

Con il codice precedente, ho avuto qualche problema nel reperire i dati dagli endpoint di api.spacexdata.com. Probabilmente, è stato introdotto di recente, un qualche meccanismo di Rate Limit, ossia una limitazione sul numero di chiamate che si possono eseguire da un unico IP.

Quindi ho scritto un altra versione del codice precedente per eseguire sostanzialmente quattro chiamate agli endpoint di seguito specificati:

ENDPOINTS = {
    'launches': 'https://api.spacexdata.com/v5/launches/past',
    'launchpads': 'https://api.spacexdata.com/v4/launchpads',
    'payloads': 'https://api.spacexdata.com/v4/payloads',
    'rockets': 'https://api.spacexdata.com/v4/rockets'
}

Successivamente, ho salvato sul database SQLite3 il database launches_def.sqlite3 le tabelle launches, launchpads, payloads e rockets contenenti rispettivamente tutti i lanci dei Falcon 9, le informazioni aggiuntive della piattaforma di lancio, del carico e infine del razzo.

Ecco il codice definitivo che ho scritto.

import requests
import sqlite3
import pandas as pd
import json

# Definiamo gli endpoint
ENDPOINTS = {
    'launches': 'https://api.spacexdata.com/v5/launches/past',
    'launchpads': 'https://api.spacexdata.com/v4/launchpads',
    'payloads': 'https://api.spacexdata.com/v4/payloads',
    'rockets': 'https://api.spacexdata.com/v4/rockets'
}

def Get_Data_Endpoint(endpoint_url):
    """
    Estrae i dati dall'endpoint specificato e li restituisce come un DataFrame pandas.
    """
    response = requests.get(endpoint_url)
    response.raise_for_status()  # Genera un'eccezione se la richiesta non ha avuto successo
    data = response.json()
    return pd.DataFrame(data)
def Converti_Tipo_Data(dataframe):
    """
    Converte i tipi di dati non supportati in SQLite (ad es. liste, dizionari) in stringhe JSON.
    """
    for col in dataframe.columns:
        # Controlla se il tipo di dati della colonna è una lista o un dizionario
        if dataframe[col].apply(lambda x: isinstance(x, (list, dict))).any():
            dataframe[col] = dataframe[col].apply(json.dumps)
    return dataframe

def Save_Data_To_Sqlite(dataframe, table_name, db_name):
    """
    Salva un DataFrame pandas in una tabella SQLite specificata in un database specificato.
    """
    data = Converti_Tipo_Data(dataframe)
    # Crea una connessione al database (lo crea se non esiste)
    with sqlite3.connect(db_name) as conn:
        # Usa la connessione per salvare il DataFrame come tabella nel database
        data.to_sql(table_name, conn, if_exists='replace', index=False)  # Se la tabella esiste già, la sostituisce

def main():
    # Itera su ogni endpoint
    for table_name, endpoint_url in ENDPOINTS.items():
        print(f"Estrae dati da {endpoint_url}...")
        data = Get_Data_Endpoint(endpoint_url)
        print(f"Salva dati nella tabella {table_name}...")
        Save_Data_To_Sqlite(data, table_name, 'launches_def.sqlite3')
    print("Operazione completata con successo!")

if __name__ == "__main__":
    main()

La differenza a livello di database, è che nella prima versione ottengo sostanzialmente una tabella unica con tutte le informazioni, mentre nella seconda versione devo successivamente selezionare i dati di interesse con una query un po’ più complessa, ma nulla di complicato. Infine, nell’ultima versione non ho rimosso i dati relativi a Falcon Heavy.

Infine, per visualizzare i dati salvati dal codice ho installato SQLiteStudio che mi permette di gestire il database launches_def.sqlite in maniera semplice ed efficace.

Siamo giunti al termine della prima parte di questo articolo. Nella prossima puntata, cercheremo di analizzare i dati salvati nel database sqlite3 in funzione di un successivo utilizzo con gli algoritmi di Machine Learning.
Come al solito, per  eventuali domande e integrazioni inviate un e-mail a webmaster@megalinux.cloud. Aiutate a sostenere The Megalinux, l’unico sito nel Web senza pubblicità inviando Bitcoin al seguente indirizzo.

3LpoukFpvDHTZPn5qGbLwUzve3rX9zsSq6

Pagina Precedente

No votes yet.
Please wait...

Pagine: 1 2 3 4 5 6 7 8 9 10