Quindi, proseguendo con il discorso potremmo ridurre le righe del datasets “data_launches_subdataset” con le seguenti considerazioni:
- Si devono rimuovere le righe che contengono più “Cores”
- Si devono eliminare le righe che contengono più di un “Payloads”, perché i primi sono dei razzi multipli tipo il Falcon_Heavy e i secondi hanno più di un “PayLoads”, ossia quei razzi che sono in grado di trasportare più carichi differenti.
Le seguenti righe di codice eseguono tale operazione. Il tutto per estrarre un campione di razzi significativo con caratteristiche omogenee.
data_launches_subdataset = data_launches_subdataset[data_launches_subdataset['cores'].map(len)==1] data_launches_subdataset .to_csv('PrimaEsportazione_senza_Core.csv') data_launches_subdataset = data_launches_subdataset[data_launches_subdataset['payloads'].map(len)==1] data_launches_subdataset .to_csv('PrimaEsportazione_senza_Core_Payloads.csv')
Per quando concerne il campo “Payloads” ho cancellato quelle righe che ne contenevano più di uno direttamente dal database. Come si vede nell’ultima riga del codice appena descritto si esporta in formato csv il risultato delle operazioni precedenti.

(Rimozione delle righe con più Payloads indicate in giallo).
Di fatto, non ci sono righe con più “Cores” e quindi le uniche righe rimosse sono quelle con più “Payloads”.
data_launches_subdataset['date'] = pd.to_datetime(data_launches_subdataset['date_utc']).dt.date
#data = data_launches_subdataset[data_launches_subdataset['date'] <= datetime.date(2020, 11, 13)]
Fatto questo, eseguiamo alcune operazioni sulla data: con la prima riga la rendiamo leggibile, mentre con la seconda scegliamo soltanto le righe fino a una certa data.
A questo punto, ci servono altre informazioni. In particolare, vogliamo sapere il nome del razzo “Rocket”, e altre specifiche del carico “Payload”. Di quest’ultimo, vogliamo anche conoscere la massa e la destinazione orbitale. Inoltre, relativamente alla piattaforma di lancio “LaunchPad” vogliamo sapere il nome del sito, le coordinate di longitudine e latitudine. Infine, per quanto concerne i “Cores” vorremmo conoscere l’esito dell’atterraggio, il tipo di atterraggio, se sono state impiegate le alette “griglie di atteraggio”, e se sono state utilizzate le gambe di atterraggio. Inoltre, sarebbe importante capire se il “Core” è stato riutilizzato.
Purtroppo, i campi “Rocket”, “Payload”, “Launchpad” dal dataset estratto “data_launches_subdataset” riportano solamente l’informazione dell’UUID, ossia dell’identificativo dell’oggetto indicato, quindi dovremmo eseguire delle altre chiamate per poter aggiungere altre informazioni. Mentre, il campo “Cores” presente nel dataset estratto contiene le seguenti informazioni più che esaustive:
[{‘core’: ‘5e9e289df35918033d3b2623′, ‘flight’: 1, ‘gridfins’: False, ‘legs’: False, ‘reused’: False, ‘landing_attempt’: False, ‘landing_success’: None, ‘landing_type’: None, ‘landpad’: None}]
In particolare, ecco una descrizione più dettagliata del campo “Cores”:
Il campo ‘Cores’ indica l’UUID del Core, il numero del volo, l’utilizzo delle alette di manovra, l’utilizzo delle gambe di atterraggio, se è stato riutilizzato, se vi è stato un tentativo di atterraggio, se vi è stato un atterraggio con successo ,il tipo di atterraggio e infine la piattaforma di atterraggio.
Elementi del Core | Descrizione |
---|---|
core | Identificativo UUID del Core |
flight | Numero del volo |
gridfins | Sono state utilizzate le alette di rientro? |
legs | Sono state utilizzate le gambe di atterraggio? |
reused | Il core è stato riutilizzato? |
landing_attempt | E’ stato provato un tentativo di atterraggio? |
landing_success | L’atterraggio è andato a buon fine? |
landing_type | Tipo di atterraggio. |
landpad | Piattaforma di atterraggio. |
(Caratteristiche del campo “Cores” presente nel dataset).
Ora, dopo aver descritto in parte le informazioni di cui disponiamo, dovremmo sviluppare una funzione specifica per aggiungerne altre. La seguente funzione permette di aggiungere le altre specifiche che ci mancano.
8 def getElement(data,apielement,element):
9
10 for x in data[element]:
11 response =requests.get("https://api.spacexdata.com/v4/"+apielement+'/'+str(x)).json()
12 if element == 'rocket' :
13 time.sleep(0.5) #add pause
14 data['Name Rocket'] = response['name']
15 data['Stages'] = response['stages']
16 return data
Con la riga otto definiamo una nuova funzione “getElement” a cui passiamo il dataframe data, l’elemento da aggiungere alla richiesta “apielement” (non è altro che l’elemento che mi serve per comporre l’endpoint in maniera dinamica) e infine, l’elemento “element” che si passa come parte identificativa dell’elemento di interesse (rocket, payload e via dicendo).
Le righe quattordici e quindici estrapolano due informazioni aggiuntive: il nome del razzo e il numero di stadi del razzo grazie alle istruzioni response[‘name’] e response[‘stages’].
A questo punto, per suddividere le varie informazioni aggiuntive aggiungerò una desinenza all’informazione che voglio estrarre con le API che sarà quella dell’elemento da cui le derivo, come in questo caso il ‘rocket’.
Per il momento vorrei estrarre con le API e quindi le informazioni aggiuntive relative al ‘rocket’, ricordate la riga nel codice precedente “if element == “rocket” le seguenti informazioni.
Nome identificativo Elemento ‘rocket’ | Descrizione | Codice |
---|---|---|
ro_name | Nome del razzo | response[‘name’] |
ro_stages | Numero degli stadi del razzo | response[‘stages’] |
ro_boosters | Numero di motori ausiliari | response[‘boosters’] |
ro_cost_per_launch | Costo del lancio | response[‘cost_per_launch’] |
ro_first_flight | Primo lancio | response[‘first_flight’] |
ro_landing_legs_number | Numero di gambe per l’atteraggio | response[‘landing_legs’][‘number’] |
ro_landing_legs_material | Materiale delle gambe di atterraggio | response[‘landing_legs’][material’] |
ro_engines_number | Numero dei motori | response[‘engines’][‘number’] |
ro_engines_type | Tipo di motori | response[‘engines’][‘type’] |
ro_engine_versione | Versione dei motori | response[‘engines’][version’] |
ro_engine_propellant_1 | Propellente motori 1 | response[‘engines’][‘propellant_1’] |
ro_engine_propellant_2 | Propellente motori 2 | response[‘engines’][‘propellant_2’] |
ro_engine_layout | Layout della disposizione dei motori. | response[‘engines’][‘layout’] |
(Caratteristiche del razzo estratte con la richiesta API specifica).
Per quanto concerne le caratteristiche del razzo dovremmo aver ottenuto tutte le informazioni che ci servono.