Torna al catalogo
Season 11 15 Episodi 58 min 2026

Astropy: Python for Astronomy

v7.2 — Edizione 2026. Una guida completa ad Astropy, il pacchetto principale per l'astronomia in Python, che copre unità, coordinate, tabelle, file FITS, modeling e cosmologia (v7.2).

Calcolo Scientifico Astronomia
Astropy: Python for Astronomy
In Riproduzione
Click play to start
0:00
0:00
1
Il cuore di Astropy: unità e quantità
Scopri i concetti fondamentali di Astropy: unità e quantità. Impara a combinare valori scalari e array con unità fisiche per gestire automaticamente l'analisi dimensionale.
3m 15s
2
Scale temporali e precisione: il modulo astropy.time
Esplora come Astropy gestisce la precisione al di sotto del nanosecondo lungo l'età dell'universo. Tratteremo UTC, TAI, il Tempo Dinamico Baricentrico e l'oggetto Time.
4m 07s
3
Navigare nel cielo: la classe SkyCoord
Impara a definire e trasformare le coordinate celesti usando la classe SkyCoord. Esploreremo l'ICRS, i sistemi di riferimento galattici e il cross-matching dei cataloghi.
4m 08s
4
Oltre RA e Dec: tracciamento 3D e velocità
Vai oltre le coordinate 2D statiche. Impara ad aggiungere distanze, calcolare separazioni 3D, modellare i moti propri e calcolare le correzioni della velocità radiale.
3m 46s
5
Padronanza dei dati tabulari: la classe QTable
Scopri perché Astropy ha la sua classe QTable invece di affidarsi esclusivamente a Pandas. Impara a memorizzare colonne multidimensionali, Quantities e Mixins.
3m 25s
6
Operazioni avanzate sulle tabelle: masking e join
Porta le tue competenze con QTable al livello successivo gestendo i dati mancanti con MaskedColumns ed eseguendo join in stile database.
4m 04s
7
L'interfaccia I/O unificata
Scopri come Astropy astrae la lettura e la scrittura dei file in un'unica interfaccia unificata. Tratteremo la gestione fluida di tabelle FITS, VOTables e formati ASCII.
3m 53s
8
Demistificare gli header FITS e gli HDUs
Immergiti nel modulo grezzo astropy.io.fits per manipolare gli Header Data Units (HDUs). Impara ad analizzare, modificare e correggere gli header FITS non standard.
3m 59s
9
Gestire file FITS enormi e cloud storage
Impara a gestire enormi dataset FITS che non entrano nella RAM utilizzando il memory mapping e scopri come trasmettere ritagli dai bucket cloud usando fsspec.
3m 49s
10
Dati a griglia: le classi NDData e CCDData
Passa dai semplici array numpy a CCDData. Impara a raggruppare i dati delle immagini 2D con maschere, metadati WCS e solide incertezze fisiche.
4m 08s
11
World Coordinate Systems: mappare i pixel sul cielo
Traduci i pixel della fotocamera in coordinate celesti usando il pacchetto WCS. Comprendi l'API di alto livello e la matematica dietro le proiezioni FITS.
4m 02s
12
Modelli analitici e fitting
Immergiti nel modulo astropy.modeling. Impara a costruire modelli 1D e 2D, applicare vincoli ai parametri ed eseguire fitter lineari o non lineari.
3m 55s
13
Modelli composti e fit personalizzati
Espandi il tuo kit di strumenti di modeling combinando più modelli matematici e definendo i tuoi fitter personalizzati e modelli sensibili alle unità di misura.
3m 48s
14
Analisi delle serie temporali: a caccia di esopianeti
Analizza i dati periodici usando il modulo astropy.timeseries. Ti guideremo attraverso il folding delle curve di luce e la scoperta dei periodi con l'algoritmo Box Least Squares.
3m 51s
15
Calcoli cosmologici: misurare l'universo
Esegui calcoli complessi su scala universale usando il modulo astropy.cosmology. Calcola i tempi di lookback, le distanze di luminosità e trova i redshift in base all'età.
3m 56s

Episodi

1

Il cuore di Astropy: unità e quantità

3m 15s

Scopri i concetti fondamentali di Astropy: unità e quantità. Impara a combinare valori scalari e array con unità fisiche per gestire automaticamente l'analisi dimensionale.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 1 di 15. Probabilmente ti sarà capitato di moltiplicare un array NumPy per una costante. Ma se per sbaglio mescoli metri e chilometri in un'equazione complessa, Python non ti avviserà, e il tuo array finale conterrà semplicemente i numeri sbagliati. Lasciare che la libreria gestisca automaticamente le dimensioni fisiche è proprio ciò che tratteremo in questo episodio. Vedremo il cuore di Astropy: Units e Quantities. Astropy gestisce le unità fisiche tramite l'oggetto Quantity. Un Quantity associa un numero, o un array di numeri, a un'unità fisica. Dato che un Quantity è una subclass diretta di un ndarray di NumPy, non perdi alcuna performance o funzionalità degli array. Puoi usare slice, broadcast ed eseguire su di essi le funzioni matematiche standard di NumPy in modo nativo. Si comportano come normali array che, semplicemente, sanno quale proprietà fisica rappresentano. Per creare un Quantity, importi il modulo units da Astropy. Poi, moltiplichi semplicemente il tuo numero per lo specifico oggetto unit. Tre moltiplicato per units dot parsec crea un Quantity di tre parsec. Molti developer pensano che questa astrazione sia lenta, il che è un malinteso comune. È vero che moltiplicare un enorme array NumPy per un oggetto unit crea una nuova copia di quell'array in memoria. Per evitare questo overhead, Astropy fa l'override dell'operatore bitwise left-shift, che ha l'aspetto di due segni di minore. Metti il tuo array esistente a sinistra, l'operatore left-shift al centro e la unit di Astropy a destra. Questo attacca la unit all'array in place, senza copiare i dati sottostanti. Ecco il punto chiave. La libreria valuta le relazioni matematiche tra le unit mentre fai i calcoli. Supponi di voler calcolare il tempo di viaggio di un'astronave. La tua distanza è di tre punto zero parsec. La tua velocità è di 130 chilometri al secondo. Crei un Quantity per la distanza e lo dividi per il Quantity della velocità. Astropy restituisce un nuovo Quantity per il tempo. Gestisce la divisione dei valori e calcola la unit risultante, restituendo parsec secondi per chilometro. Quella unit risultante è matematicamente corretta, ma non molto comoda da leggere. Puoi cambiarla usando il metodo to disponibile su ogni Quantity. Chiami il metodo to e passi la tua target unit, come units dot year. Astropy verifica che le dimensioni di origine e di destinazione siano entrambe unit di tempo, esegue la conversione interna e restituisce un nuovo Quantity espresso in anni. Per standardizzazioni rapide, puoi anche accedere alle property dot SI o dot CGS su qualsiasi Quantity per convertirlo immediatamente nelle unit di base di quei sistemi. Quando esegui operazioni matematiche in cui le unit si annullano completamente, come dividere metri per centimetri, Astropy restituisce un Quantity adimensionale. La unit esiste ancora under the hood come tipo adimensionale non scalato. Se devi passare questo risultato a una libreria esterna che si aspetta dei float Python standard o dei semplici array NumPy, estrai il numero grezzo usando l'attributo value. Prima di estrarre qualsiasi valore finale, ricorda che puoi sempre semplificare unit complesse e combinate fino alle loro dimensioni fisiche fondamentali assolute chiamando il metodo decompose. Se vuoi supportare lo show, puoi cercare DevStoriesEU su Patreon: ci aiuta a continuare a crearli. Per questo episodio è tutto. Grazie per l'ascolto e continua a sviluppare!
2

Scale temporali e precisione: il modulo astropy.time

4m 07s

Esplora come Astropy gestisce la precisione al di sotto del nanosecondo lungo l'età dell'universo. Tratteremo UTC, TAI, il Tempo Dinamico Baricentrico e l'oggetto Time.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 2 di 15. Un float standard a 64 bit non può rappresentare un timestamp che copre miliardi di anni senza distruggere la propria precisione. Se provi a tracciare un evento celeste distante al microsecondo, l'aritmetica floating-point standard esaurisce semplicemente i bit. Questa precisa limitazione hardware è il motivo per cui abbiamo bisogno di scale temporali e precisione: il modulo astropy.time. Per mantenere un'accuratezza al sub-nanosecondo nel corso della storia cosmica, questo modulo evita completamente di usare un singolo numero per rappresentare il tempo. Si basa invece su un'ingegnosa architettura a due float. Dietro le quinte, ogni valore temporale viene diviso in due float separati a 64 bit. Il primo float memorizza la parte intera della Julian Date, che tiene traccia dei giorni interi. Il secondo float memorizza la parte frazionaria del giorno. Se Astropy li sommasse in un'unica variabile, la precisione degraderebbe all'istante. Tenendoli separati, la libreria può eseguire un'aritmetica temporale ad altissima precisione localmente, indipendentemente da quanto nel passato o nel futuro si trovi la data. Quando crei un oggetto Time, passi il valore temporale insieme a due argomenti fondamentali: il formato e la scala. Ecco il punto chiave. Gli sviluppatori spesso confondono il formato visivo di una data con la sua scala temporale fisica. Sono concetti completamente separati. Il formato determina esclusivamente come i dati vengono letti o scritti. I formati comuni includono string ISO standard, Modified Julian Date numeriche e rappresentazioni specializzate come gli header FITS. Il formato è solo il wrapper strutturale attorno ai numeri. La scala temporale, invece, definisce il sistema di riferimento fisico di quei numeri. Le scale temporali fisiche tengono conto della rotazione terrestre, dei leap second e degli effetti relativistici. Esempi includono il Tempo Coordinato Universale, noto come UTC, il Tempo Terrestre, o TT, e il Tempo Atomico Internazionale, o TAI. Una Modified Julian Date non è una scala fisica, è solo un formato. Puoi tranquillamente avere un timestamp formattato come Modified Julian Date, ma ancorato fisicamente alla scala UTC. Devi definire esplicitamente sia il formato che la scala quando passi dati grezzi a un oggetto Time. Immagina di calcolare la differenza di tempo tra due timestamp della telemetria di un veicolo spaziale. Ricevi il primo timestamp come string in formato ISO di ieri, e il secondo timestamp come string ISO di oggi. Per prima cosa, inizializzi due oggetti Time. Passi la string grezza all'oggetto, dichiari il formato come ISO e imposti la scala su UTC. Lo fai per entrambi i timestamp. Dato che Astropy supporta le operazioni vettorializzate, potresti anche passare un enorme array di queste string a un singolo oggetto Time, ma la logica di inizializzazione sottostante rimane la stessa. Per trovare l'esatto tempo trascorso, sottrai l'oggetto Time precedente da quello successivo. Astropy esegue automaticamente l'aritmetica interna a due float, restituendo un oggetto TimeDelta che contiene la durata esatta. Successivamente, devi mappare quel secondo timestamp di telemetria su una scala fisica assoluta e uniforme, rimuovendo i salti imprevedibili causati dai leap second dell'UTC. Prendi il tuo secondo oggetto Time e richiedi semplicemente il suo equivalente nel Tempo Atomico Internazionale. Ottieni questo risultato chiamando direttamente l'attributo TAI sull'oggetto. Astropy attiva immediatamente un ricalcolo dei float interni, spostando il sistema di riferimento da UTC a TAI, preservando al contempo la precisione totale al nanosecondo. Il vero potere del modulo astropy.time è che non gestisci mai manualmente i leap second o le correzioni relativistiche; definisci i tuoi formati e le tue scale in anticipo, e l'architettura a due float garantisce che la matematica rimanga esatta in tutto l'universo. Vorrei prendermi un momento per ringraziarti per l'ascolto: ci aiuta tantissimo. Buona giornata!
3

Navigare nel cielo: la classe SkyCoord

4m 08s

Impara a definire e trasformare le coordinate celesti usando la classe SkyCoord. Esploreremo l'ICRS, i sistemi di riferimento galattici e il cross-matching dei cataloghi.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 3 di 15. Convertire manualmente le coordinate celesti da un sistema di riferimento all'altro comporta una trigonometria sferica da incubo. Un singolo errore in una matrice può facilmente far puntare il tuo telescopio verso l'emisfero sbagliato. Navigare nel cielo: la classe SkyCoord gestisce quella matematica al posto tuo, trasformando complesse trasformazioni sferiche in un semplice attribute lookup. In Astropy, SkyCoord è l'oggetto principale ad alto livello per rappresentare le posizioni celesti. Funge da smart wrapper per i coordinate frame di basso livello. Quando osservi un target, devi registrare la sua posizione. In genere, usi l'Ascensione Retta e la Declinazione. Per creare uno SkyCoord, passi questi due valori, specifichi le unità, come gradi o ore, e imposti il reference frame. Se non specifichi un frame, il default è l'International Celestial Reference System, o ICRS. Puoi creare facilmente un singolo punto nel cielo, ma questo porta a una trappola frequente. Gli utenti spesso fanno il parsing di un data file che contiene migliaia di stelle, creano un nuovo oggetto SkyCoord per ogni stella e li salvano in una list Python standard. Quando devono eseguire dei calcoli, fanno un loop su quella list. Questo è terribilmente inefficiente e bypassa completamente i vantaggi di performance della libreria. SkyCoord è costruito per gestire gli array nativamente. Invece di creare migliaia di oggetti individuali, passi un array Numpy di valori di Ascensione Retta e un array corrispondente di valori di Declinazione in una singola inizializzazione di SkyCoord. Ottieni indietro esattamente un oggetto SkyCoord che contiene il tuo intero dataset. Considera uno scenario in cui stai facendo il cross-matching di un set appena scoperto di cento transienti radio registrati in ICRS con un catalogo ottico esistente. Caricando tutti e cento i transienti in un singolo SkyCoord basato su array, la libreria passa i dati a routine C e Numpy pesantemente ottimizzate. Operazioni che richiederebbero minuti in un loop Python vengono eseguite in millisecondi. Questa struttura ad array diventa particolarmente potente quando devi trasformare i tuoi dati. I cataloghi astronomici non sempre concordano su un sistema di coordinate. I tuoi transienti radio potrebbero essere in ICRS, ma forse devi analizzare la loro distribuzione rispetto al piano della Via Lattea. Per questo, ti serve il sistema di coordinate galattiche. Ecco il punto chiave. Non devi cercare matrici di rotazione o scrivere funzioni di conversione. Astropy contiene un enorme transformation graph built-in che sa come passare da qualsiasi frame supportato a qualsiasi altro frame supportato. Dato che SkyCoord fa da wrapper a questo grafo, convertire il tuo intero array di cento transienti richiede esattamente un solo passaggio. Prendi il tuo oggetto SkyCoord esistente e chiami il suo metodo transform to, fornendo il nome del frame di destinazione. Ancora meglio, per i frame comuni, Astropy fornisce un attribute access diretto. Se hai un oggetto SkyCoord ICRS, richiedi semplicemente l'attributo galactic. La libreria calcola automaticamente la trasformazione e restituisce un oggetto SkyCoord nuovo di zecca. Questo nuovo oggetto contiene le stesse identiche posizioni fisiche nello spazio, ma rappresentate come longitudine e latitudine galattiche. Il vero potere di questa classe è che separa completamente i dati che rappresentano una posizione celeste dalla geometria sferica sottostante necessaria per spostarla attraverso l'universo dei reference frame astronomici. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a costruire!
4

Oltre RA e Dec: tracciamento 3D e velocità

3m 46s

Vai oltre le coordinate 2D statiche. Impara ad aggiungere distanze, calcolare separazioni 3D, modellare i moti propri e calcolare le correzioni della velocità radiale.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 4 di 15. Potresti sapere esattamente dove si trova una stella stasera, ma senza le correzioni per il moto proprio e la velocità della Terra, il tuo telescopio punterà verso il vuoto nel prossimo decennio. È qui che andiamo oltre l'ascensione retta e la declinazione: tracciamento 3D e velocità. Di default, le coordinate mappano una posizione piatta nel cielo usando gli angoli. Per modellare un sistema fisico, come un sistema binario, hai bisogno dello spazio fisico effettivo tra i componenti. In molti provano a calcolare una separazione tridimensionale usando solo ascensione retta e declinazione. Ma non funziona. Per usare il metodo di separazione tridimensionale, devi fornire un parametro di distanza quando crei l'oggetto coordinate. Passi un valore di distanza con un'unità fisica, come i parsec, insieme alle tue coordinate angolari. Una volta che entrambi gli oggetti contengono questi dati di distanza, chiami il metodo di separazione tridimensionale sulla prima coordinata, passando la seconda coordinata come argomento. Astropy restituisce la linea fisica diretta tra di loro nello spazio tridimensionale, gestendo automaticamente la trigonometria in background. Ora, quegli oggetti non sono statici. Per modellare il loro movimento nel tempo, associ i dati di velocità direttamente all'oggetto coordinate al momento della creazione. Lo fai passando i parametri di moto proprio. Nello specifico, fornisci il moto proprio in ascensione retta e il moto proprio in declinazione. Questi accettano unità angolari nel tempo, come i millisecondi d'arco all'anno. Fornisci anche un parametro di velocità radiale, che accetta una velocità fisica, come i chilometri al secondo. Quando li metti insieme, l'oggetto coordinate diventa un vettore completo nello spazio delle fasi. Contiene la posizione attuale dell'oggetto e il vettore esatto di dove sta andando. Ecco il punto chiave. Anche il tuo telescopio si sta muovendo nello spazio. La Terra ruota sul proprio asse e orbita intorno al Sole. Se misuri la velocità radiale di una stella da terra, la tua misurazione raw è contaminata dalla velocità della Terra in quel preciso istante. Per condividere i tuoi dati con altri astronomi, devi rimuovere il moto della Terra. Sposti il tuo punto di riferimento su un frame stabile, di solito il centro di massa del sistema solare. Questa si chiama correzione della velocità radiale baricentrica. Per calcolare questa correzione in Astropy, devi definire dove si trova l'osservatore usando un oggetto Earth location. Lo crei passando l'esatta longitudine, latitudine ed elevazione del tuo strumento. In alternativa, puoi recuperare un sito stabilito direttamente dal site registry integrato di Astropy, facendo una query con un nome noto come il Keck Observatory. Poi, hai bisogno del tempo esatto in cui è avvenuta l'osservazione. Con la tua posizione e il tempo pronti, chiami il metodo di correzione della velocità radiale direttamente sull'oggetto coordinate del tuo target. Gli passi il tempo di osservazione e la tua Earth location. Astropy calcola il vettore velocità del Keck Observatory in quel preciso millisecondo, rispetto al target, e restituisce l'offset di velocità. Aggiungi questo valore di correzione alla tua velocità radiale misurata raw. Il risultato è una misurazione pulita e standardizzata, riferita al baricentro del sistema solare. Il takeaway più utile qui è che una coordinata non è solo un punto fisso su una mappa; è un modello cinematico completo che contiene la posizione del target, la sua traiettoria e la geometria necessaria per correggere il tuo stesso movimento. Grazie per l'ascolto. Statemi bene, tutti.
5

Padronanza dei dati tabulari: la classe QTable

3m 25s

Scopri perché Astropy ha la sua classe QTable invece di affidarsi esclusivamente a Pandas. Impara a memorizzare colonne multidimensionali, Quantities e Mixins.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 5 di 15. Pandas è fantastico per i dati flat, ma cosa succede quando una singola colonna del tuo dataset deve contenere una serie temporale, un'unità di misura e una coordinata spaziale? I dataframe standard vanno in crisi. Per risolvere questo problema, devi padroneggiare i dati tabulari: la classe QTable. Se lavori in Python, conosci già Pandas. Pandas presuppone che i tuoi dati siano flat, preferendo un singolo valore per cella. In astronomia, i dati sono raramente semplici. Una singola osservazione potrebbe richiedere unità di misura rigorose, una matrice di valori o una coordinata celeste complessa. Astropy fornisce una struttura dati tabulare custom progettata specificamente per questa realtà. Noterai che Astropy ha sia una classe Table standard che una classe QTable. Spesso le persone le confondono. La classe Table standard tiene traccia delle informazioni sulle unità di misura come metadati in background, ma restituisce dei semplici array NumPy quando estrai una colonna. Una QTable impone una rigorosa gestione unit-aware. Quando recuperi una colonna da una QTable, hai la garanzia di ottenere indietro un oggetto Quantity nativo di Astropy. L'unità di misura fisica è permanentemente attaccata ai numeri. Vediamo come costruire una QTable. Inizi importando QTable dal modulo astropy dot table. Puoi costruirla usando un dictionary dove le chiavi sono i nomi delle tue colonne e i valori sono i tuoi array di dati. Supponi di creare un semplice catalogo di galassie. La tua prima colonna è puro testo. Assegni una list di stringhe che rappresentano i nomi delle galassie. Ora, devi registrare dove si trovano queste galassie. Non vuoi colonne separate e scollegate per l'ascensione retta e la declinazione. Invece, crei un oggetto SkyCoord di Astropy che contiene le posizioni di tutte le tue galassie. Passi questo singolo oggetto SkyCoord direttamente nella tua tabella come seconda colonna. Questa è una colonna mixin. I mixin permettono ai tipi complessi di Astropy, come gli oggetti SkyCoord o Time, di comportarsi esattamente come degli array di dati standard all'interno della tabella. Puoi fare slice, sort e filtrare le righe della tabella, e l'oggetto mixin mantiene automaticamente i suoi dati interni perfettamente sincronizzati. Poi, devi memorizzare le misurazioni del flusso in tre diverse bande di lunghezza d'onda per ogni galassia. In un tipico dataframe, saresti costretto a creare tre colonne separate. In una QTable, usi una colonna multidimensionale. Definisci un singolo array con una shape di N righe e tre colonne, attacchi un'unità di misura fisica di flusso a tutto quanto, e lo assegni come tua terza colonna della tabella. Ed è qui che la cosa si fa interessante. La QTable accetta nativamente l'array multidimensionale. Una singola riga in quella colonna ora contiene un array completo di tre misurazioni unit-aware. Quando stampi questa tabella, Astropy la formatta in modo pulito. Allinea gli array annidati e mostra le unità di misura direttamente sotto gli header delle colonne. I tuoi metadati e le tue misurazioni sono legati insieme. La QTable non è solo un foglio di calcolo; è un contenitore specializzato costruito per rispettare la fisica e la geometria dei tuoi dati. Grazie per avermi fatto compagnia. Spero tu abbia imparato qualcosa di nuovo.
6

Operazioni avanzate sulle tabelle: masking e join

4m 04s

Porta le tue competenze con QTable al livello successivo gestendo i dati mancanti con MaskedColumns ed eseguendo join in stile database.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 6 di 15. Cercare una sorgente specifica in un catalogo enorme di solito significa eseguire una full linear scan che divora tempo di processing. Ma se strutturi i tuoi dati correttamente, puoi ridurre questi lookup da minuti a millisecondi. Questo è ciò di cui parleremo oggi: operazioni avanzate sulle tabelle, masking e join. Le tabelle di Astropy non sono semplici array. Si comportano come un database relazionale in-memory che comprende nativamente le unità fisiche. Supponi di avere un catalogo fotometrico e un catalogo spettroscopico, e di doverli combinare in base a un source ID condiviso. Prima di fare il merge, devi gestire i dati mancanti. Il tuo catalogo fotometrico probabilmente ha dei valori di magnitudine mancanti perché un'osservazione è fallita o un sensore ha perso un frame. Potresti provare a filtrare questi valori mancanti usando i classici boolean array di numpy. Non farlo. Le mask standard di numpy applicate direttamente a una tabella unit-aware rimuoveranno silenziosamente le tue unità fisiche e romperanno gli oggetti mixin. Invece, Astropy gestisce la cosa con la MaskedColumn. Quando lavori all'interno di una QTable, che è la classe di tabelle unit-aware, Astropy usa automaticamente le operazioni di MaskedColumn under the hood per i dati mancanti. Questo assicura che la tua colonna delle magnitudini mantenga intatte le sue unità fisiche, marcando in modo sicuro le entry mancanti così che non corrompano i tuoi calcoli downstream. Con il tuo catalogo fotometrico correttamente mascherato e pronto, è il momento di combinarlo con i tuoi dati spettroscopici. Astropy fornisce una funzione di join che funziona in modo molto simile a un database relazionale. Passi alla funzione la tua left table, la tua right table, e specifichi il nome della colonna condivisa come key, che in questo caso è il tuo source ID. Se specifichi un inner join, la funzione valuta entrambi i dataset e restituisce una nuova tabella contenente solo le righe in cui il source ID esiste in entrambi i cataloghi. Ecco il punto chiave. Dato che stai usando oggetti QTable, l'operazione di join riconcilia e preserva automaticamente le unità di misura da entrambe le parti. La tua merged table conterrà i parametri fisici precisi dei dati spettroscopici insieme alle magnitudini opportunamente mascherate dei dati fotometrici, perfettamente allineati. Ora hai un merged catalog, e la tua analisi richiede di estrarre i parametri esatti per uno specifico source ID. Senza alcun intervento, trovare una riga in una tabella enorme richiede di controllare sequenzialmente ogni singola entry. Astropy risolve questo collo di bottiglia prestazionale con il table indexing. Puoi dire alla tabella di creare un index sulla tua colonna del source ID. Dietro le quinte, Astropy costruisce una struttura dati B-tree che mappa i tuoi source ID direttamente alle posizioni delle righe sottostanti in memoria. Una volta costruito l'index, recuperi i tuoi dati usando la property location della tabella, passando il tuo target ID. L'engine attraversa il B-tree, salta completamente la full scan, e recupera la tua riga in tempo logaritmico. Puoi anche indicizzare più colonne simultaneamente per gestire lookup complessi, come trovare una riga sia per source ID che per data di osservazione. Costruire un index richiede una frazione del tempo di calcolo iniziale, ma ripaga immediatamente quando devi eseguire lookup ripetuti su dataset pesanti. Il vero potere delle tabelle Astropy non è solo lo storage dei dati, ma il mantenimento dell'integrità fisica delle tue unità di misura attraverso join relazionali complessi e query B-tree ad alta velocità. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a sviluppare!
7

L'interfaccia I/O unificata

3m 53s

Scopri come Astropy astrae la lettura e la scrittura dei file in un'unica interfaccia unificata. Tratteremo la gestione fluida di tabelle FITS, VOTables e formati ASCII.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 7 di 15. Hai un vecchio file di testo disordinato con le coordinate delle stelle e devi convertirlo in un moderno standard binario compresso. Nella maggior parte delle librerie, questo significa scrivere un parser custom, mappare i data type e combattere con i serializzatori binari. In Astropy, puoi farlo con esattamente due righe di codice. Questo grazie alla Unified I/O Interface. La Unified I/O Interface è un layer di gestione dati polimorfico. Invece di costringerti a importare un modulo specifico per ogni tipo di file, Astropy espone un metodo generico read e write direttamente sulle sue data structure principali. Che tu stia lavorando con una Table standard, una QTable con unità fisiche o un array NDData multidimensionale, il modello di interazione rimane identico per standard di file completamente diversi. C'è un malinteso comune sull'estrazione dei dati. Quando i developer devono leggere un file FITS, spesso puntano dritti al modulo di basso livello, astropy punto io punto fits. Quel modulo serve strettamente per la manipolazione di file raw, come modificare singole header card o ispezionare byte stream non formattati. Se vuoi solo estrarre dati tabellari da un file FITS, non dovresti usarlo. Usi invece il metodo Table punto read. Bypassa l'estrazione manuale dell'header e gestisce automaticamente il data mapping sottostante. Quando chiami il metodo read e passi un file path o un file object aperto, Astropy si affida a un robusto motore di inferenza del formato. Per prima cosa, controlla l'estensione del file. Se fornisci una string che finisce in punto h5 o punto parquet, instrada la richiesta al parser specializzato corrispondente. Se l'estensione è ambigua, mancante o solo una generica estensione di testo, il motore scende di un livello e ispeziona il contenuto del file. Legge i primi byte dei dati cercando signature note o magic number per identificare lo standard in modo affidabile. Se l'inferenza automatica fallisce completamente, la bypassi passando una string come argomento format, come ascii punto csv, per forzare il parser corretto. Ecco come questo gestisce il nostro scenario iniziale. Hai quella vecchia tabella di testo ASCII con le coordinate delle stelle. Chiami QTable punto read e gli passi il tuo file path di testo. Astropy rileva il formato ASCII, fa il parsing delle colonne e restituisce un object QTable completamente popolato in memoria. Poi, vuoi salvarla come binary table FITS compressa. Prendi quello stesso object QTable in memoria e chiami il suo metodo write. Fornisci un nuovo filename che finisce in punto fits, e passi un parametro extra per abilitare la compressione. Devi anche passare un flag overwrite impostato su true, perché il metodo write protegge in modo sicuro i file esistenti di default. È qui che la cosa si fa interessante. Astropy cambia dinamicamente context dal parsing di plain text alla complessa serializzazione binaria dietro le quinte. I protocolli di file sottostanti sono completamente distinti, ma l'interfaccia che usi rimane invariata. Poiché l'interfaccia è collegata alla data structure anziché al formato del file, le tue pipeline di data processing diventano disaccoppiate dai tuoi supporti di archiviazione. Il takeaway più utile qui è che cambiare il modo in cui la tua applicazione archivia e condivide i dati richiede di alterare l'estensione di un file in una singola string, anziché riscrivere la tua intera pipeline di data ingestion. Questo è tutto per oggi. Grazie per l'ascolto: vai a creare qualcosa di fantastico.
8

Demistificare gli header FITS e gli HDUs

3m 59s

Immergiti nel modulo grezzo astropy.io.fits per manipolare gli Header Data Units (HDUs). Impara ad analizzare, modificare e correggere gli header FITS non standard.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 8 di 15. Lo standard dei file FITS è stato creato negli anni 80 per i sistemi Fortran, e memorizza i metadati in blocchi rigidi da ottanta byte, modellati direttamente sulle schede perforate fisiche. Gestire le strutture delle schede perforate nel codice moderno è raramente piacevole. Astropy nasconde questa complessità traducendo questi blocchi in strutture native, ed è proprio per questo che questo episodio si concentra sul demistificare gli header FITS e le HDU. Pensa a un file FITS come a un contenitore. All'interno di questo contenitore si trovano le Header Data Unit, universalmente note come HDU. Ogni file FITS deve contenerne almeno una, chiamata Primary HDU. Spesso, questa unità primaria contiene solo metadati, mentre le immagini vere e proprie o le tabelle binarie seguono subito dopo come Extension HDU. Quando apri un file FITS usando Astropy, la libreria analizza questo contenitore e ti restituisce un oggetto HDUList. Puoi navigare in questo oggetto usando la notazione standard con parentesi quadre per selezionare le singole HDU. Ecco il punto chiave sull'indicizzazione. Lo standard FITS ufficiale usa rigorosamente l'indicizzazione a base uno a causa delle sue origini in Fortran. Tuttavia, dato che Astropy è una libreria Python, impone l'indicizzazione a base zero. La Primary HDU si trova sempre all'indice zero, e la prima estensione all'indice uno. È un dettaglio semplice, ma dimenticarlo causa continui errori off-by-one. Ogni oggetto HDU contiene un attributo header. È qui che risiedono quei vecchi blocchi da ottanta byte. Nella terminologia FITS, ogni riga di metadati è chiamata card. Una card completa contiene una keyword, un valore e a volte un commento descrittivo. Astropy elabora queste card e ti espone l'header come un oggetto che si comporta esattamente come un dictionary Python standard. Se ti serve il tempo di esposizione, ti basta passare la keyword EXPTIME all'header. Modificare i valori funziona allo stesso modo. Assegni un nuovo valore alla keyword usando un segno di uguale. Se devi aggiornare anche il commento su quella specifica card, assegni una tuple contenente sia il nuovo valore che la nuova string di commento. Astropy reimpacchetta automaticamente questi dati nello standard richiesto da ottanta byte dietro le quinte. Questa traduzione funziona perfettamente finché non incontri dati legacy. I file FITS più vecchi spesso violano il rigoroso standard. Potrebbero presentare keyword troppo lunghe o contenere caratteri illegali. Dato che Astropy valida rigorosamente gli header di default, tentare di aprire un file non conforme solleverà spesso un'exception immediatamente. Invece di abbandonare il file, puoi gestire la situazione usando il method verify. Metti caso che apri una vecchia immagine di un telescopio e ti imbatti in un errore di validazione relativo alla formattazione. Catturi l'oggetto file e chiami il suo method verify, passando l'argument string fix. Astropy analizzerà tutte le card dell'header, riparerà automaticamente i problemi di formattazione dove possibile, e sopprimerà gli errori per i campi corrotti che corregge. Una volta stabilizzato l'header, puoi aggiornare in sicurezza una card OBSERVER danneggiata con la string corretta, e poi riscrivere su disco la tua HDUList ripulita. Tratta sempre i tuoi aggiornamenti dei metadati FITS come semplici operazioni sui dictionary, ma tieni pronto quel method verify per il momento in cui i dati legacy violano le regole. Se vuoi aiutare a far andare avanti lo show, cerca DevStoriesEU su Patreon. Grazie per l'ascolto. Alla prossima!
9

Gestire file FITS enormi e cloud storage

3m 49s

Impara a gestire enormi dataset FITS che non entrano nella RAM utilizzando il memory mapping e scopri come trasmettere ritagli dai bucket cloud usando fsspec.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 9 di 15. Non ti serve un supercomputer per analizzare un'immagine da cento gigabyte. Ti basta trovare un modo per ingannare il tuo sistema operativo e fargli leggere solo i pixel che ti interessano. La gestione di file FITS enormi e il cloud storage è esattamente il meccanismo che usi per raggiungere questo obiettivo. Quando lavori con array astronomici enormi, provare a caricare un intero file in memoria farà crashare immediatamente il tuo processo. Astropy evita questo problema usando una feature chiamata memory mapping. Quando apri un file FITS, puoi passare un argomento chiamato memmap impostato a True. Un memory map non legge i dati dell'immagine nella tua RAM fisica. Invece, mappa il file sul tuo hard drive direttamente nello spazio di indirizzamento della memoria virtuale del tuo computer. Quando accedi a una slice specifica dell'array, il tuo sistema operativo recupera dal disco solo quel blocco di dati specifico. Hai la comodità di fare finta che l'intero file sia caricato, ma paghi il costo di memoria fisica solo per i pixel che processi attivamente. Questo comportamento introduce una trappola molto comune. Potresti aprire un file FITS, assegnare l'array dell'immagine a una variabile e poi chiamare close sull'oggetto file. Ti aspetti che il file handle venga rilasciato e la risorsa liberata. Non è così. Dato che i memory map si basano sul sistema operativo che collega il file a una variabile, il file rimane aperto e bloccato finché esiste un riferimento a quell'array nella tua sessione Python. Per liberare effettivamente la risorsa e chiudere completamente il file handle, devi eliminare esplicitamente la tua variabile dati usando il comando delete standard di Python. Questo gestisce i file locali, ma i dataset astronomici moderni spesso si trovano su server remoti. Scaricare centinaia di gigabyte solo per ispezionare una piccola regione è uno spreco di banda e di tempo. Astropy gestisce i dati remoti integrandosi con la libreria file system spec. Quando apri un file, passi un argomento chiamato use fsspec impostato a True. Questo dice alla libreria di trattare le location di cloud storage proprio come drive locali. Considera un'immagine da duecento megabyte dell'Hubble Space Telescope ospitata in un bucket Amazon S3 pubblico. Vuoi solo un piccolo ritaglio di dieci per venti pixel attorno a una stella specifica. Per prima cosa, chiami fits open, passando l'uniform resource identifier di S3 invece di un file path locale, insieme a use fsspec impostato a True. Astropy si connette al bucket e scarica solo i blocchi header FITS. Questo gli permette di capire la struttura del file senza toccare i dati effettivi dell'immagine. Successivamente, navighi fino all'estensione dell'immagine corretta e fai uno slice dell'array di dati usando l'indicizzazione standard, prendendo solo il tuo blocco dieci per venti. Ed è qui che la cosa si fa interessante. Astropy traduce quello slice dell'array in specifiche richieste HTTP byte range. La tua macchina contatta Amazon S3, chiede solo i byte fisici corrispondenti a quei duecento pixel e scarica esattamente quel piccolo chunk. Ottieni il tuo ritaglio istantaneamente, mentre i restanti centonovantanove megabyte del file rimangono sul server intatti. Combinare il memory mapping locale con lo streaming remoto di byte range significa che i tuoi script di analisi sono limitati solo dai dati che calcoli attivamente, mai dalla dimensione totale del file stesso. Vorrei prendermi un momento per ringraziarti per l'ascolto: ci aiuta tantissimo. Buona giornata!
10

Dati a griglia: le classi NDData e CCDData

4m 08s

Passa dai semplici array numpy a CCDData. Impara a raggruppare i dati delle immagini 2D con maschere, metadati WCS e solide incertezze fisiche.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 10 di 15. Se fai lo slice di un array numerico standard, ottieni in output solo pixel raw. Ma i dati di un telescopio non sono mai solo una matrice di numeri. Quando fai il crop di un'immagine per osservare una singola stella, i tuoi margini di errore, le tue mask dei dead pixel e le coordinate celesti devono restare perfettamente allineati, altrimenti tutta la tua analisi salta. È proprio per questo che usiamo i Gridded Data: le classi NDData e CCDData. Alla base, Astropy fornisce la base class NDData come container standard per i gridded data astronomici. Mentre NDData gestisce la struttura generale, per le vere e proprie immagini ottiche o a infrarossi, di solito userai la sua subclass specializzata chiamata CCDData. Questo container esiste per collegare direttamente i valori dei tuoi pixel raw alle loro proprietà fisiche. Vediamo come inizializzare un oggetto CCDData per un'esposizione raw del telescopio. Non passi semplicemente una griglia bidimensionale di numeri. Passi la griglia di dati raw e devi assegnare un'unità fisica, come elettroni o analog-to-digital units. Poi, alleghi una boolean mask. Se un raggio cosmico ad alta energia colpisce il tuo rilevatore durante l'esposizione, metti un flag a true su quegli specifici pixel rovinati in un mask array separato, e lo passi direttamente all'oggetto CCDData. Poi arriva l'error tracking. Alleghi un uncertainty array. Per la nostra immagine raw, potresti calcolare il rumore di Poisson e allegarlo usando la classe Standard Deviation Uncertainty o la classe Variance Uncertainty. Ora, i tuoi valori di luminosità, le tue unità, i tuoi flag dei bad pixel e i tuoi limiti di rumore statistico sono bloccati insieme in un unico oggetto unificato. Questo genera una confusione comune. Una volta che hai questo oggetto completamente caricato, non provare a usare gli operatori matematici standard, come un semplice segno più o meno, per processare l'immagine. Se provi a fare della normale aritmetica tra array per sottrarre un dark background frame, lascerai indietro le tue uncertainty. Invece, devi usare i metodi aritmetici built-in forniti dalla classe, come le funzioni add, subtract, multiply e divide. Ed è qui che la cosa si fa interessante. Quando chiami il metodo subtract, Astropy non si limita a sottrarre i valori dei pixel. Propaga automaticamente le tue variance uncertainty attraverso l'operazione usando le regole statistiche standard, producendo un profilo di rumore matematicamente corretto nell'immagine risultante. Più avanti nel tuo workflow, potresti renderti conto che l'immagine completa del telescopio è troppo grande, e vuoi analizzare solo una singola galassia situata nell'angolo in alto a destra. Puoi farlo usando un tool chiamato Cutout2D. Fornisci il tuo oggetto CCDData principale, le coordinate esatte del centro della tua galassia target e le dimensioni della bounding box che vuoi estrarre. Dato che hai pacchettizzato tutto in un container CCDData, Cutout2D gestisce automaticamente il syncing complesso. Restituisce un nuovo oggetto più piccolo. Fa lo slice dei pixel dell'immagine, ma fa anche il crop automatico della mask dei raggi cosmici e del variance uncertainty array esattamente alle stesse dimensioni. Cosa fondamentale, trasla il world coordinate system sottostante. La coordinata pixel zero-zero nel tuo nuovo cutout mappa correttamente sulla stessa identica ascensione retta e declinazione della master image. Trattando i dati dei pixel, i margini di errore fisici e le coordinate spaziali come un'unica unità indivisibile, queste classi prevengono la silent data corruption mentre la tua immagine si muove attraverso complesse pipeline di analisi. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a sviluppare!
11

World Coordinate Systems: mappare i pixel sul cielo

4m 02s

Traduci i pixel della fotocamera in coordinate celesti usando il pacchetto WCS. Comprendi l'API di alto livello e la matematica dietro le proiezioni FITS.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 11 di 15. Ogni pixel sul detector di un telescopio è un quadrato piatto e discreto, ma il cielo è una sfera curva, continua e matematicamente complessa. Mappare un punto su quel detector piatto alla sua vera posizione nell'universo è un problema geometrico piuttosto intricato. Il World Coordinate Systems, o WCS, è il meccanismo che decodifica questa geometria. Il WCS funge da ponte fondamentale tra l'hardware e la fisica. Fornisce la trasformazione matematica necessaria per convertire una coordinata pixel in una world coordinate, come l'Ascensione Retta e la Declinazione. Nei dati astronomici, queste regole di trasformazione sono solitamente memorizzate come metadata standardizzati all'interno dell'header di un file FITS. L'header contiene keyword specifiche che definiscono il reference pixel, le coordinate fisiche di quel pixel e la matrice di rotazione o di scaling utilizzata dal telescopio. Astropy legge queste keyword e crea un oggetto di trasformazione attivo che modella l'intero piano focale. Prima di fare qualsiasi calcolo, dobbiamo chiarire una fonte costante di confusione sull'indexing. Lo standard FITS definisce le coordinate dei pixel come one-indexed, il che significa che il primissimo pixel sul detector è il pixel uno. Python, e di conseguenza NumPy, è zero-indexed. Astropy risolve questa dualità attraverso due layer distinti. La vecchia API di basso livello non è un sistema di indexing unificato; ti richiede di passare esplicitamente un argomento origin di zero o uno ogni singola volta che trasformi una coordinata. Ma la moderna Shared Python Interface di alto livello opera interamente secondo la convenzione zero-indexed di Python. Si aspetta da te pixel zero-based e gestisce automaticamente l'offset rispetto allo standard FITS al suo interno. Ecco il punto chiave. L'API di alto livello rende la conversione delle coordinate incredibilmente concisa. Mettiamo che tu abbia individuato una stella luminosa nel tuo array di immagini al pixel x uguale a 30 e y uguale a 40, e che tu debba trovare la sua vera posizione nello spazio. Per prima cosa, leggi l'header del tuo file FITS utilizzando i tool di input-output di Astropy. Successivamente, inizializzi un oggetto WCS passando quell'header direttamente alla classe WCS. Infine, chiami un metodo chiamato pixel to world su quell'oggetto WCS, passandogli i tuoi valori pixel x e y di 30 e 40. Il metodo valuta la matematica di proiezione e restituisce un oggetto SkyCoord standard di Astropy. Questo oggetto contiene le coordinate fisiche ed è completamente consapevole del suo reference frame, come ad esempio ICRS. Il bello di questa shared interface è che ti protegge dai numeri grezzi. Invece di restituire un array generico di float che rappresentano gradi astratti, ti fornisce oggetti ricchi che comprendono le proprie unità fisiche e i propri coordinate system. Puoi prendere quello SkyCoord e usarlo immediatamente per fare un cross-reference con un catalogo stellare. Il sistema funziona esattamente allo stesso modo al contrario. Se hai le coordinate di una galassia nota e vuoi determinare esattamente quali pixel occupa sul sensore della tua fotocamera, chiami il metodo world to pixel sul tuo oggetto WCS. Passi il tuo SkyCoord, e lui ti restituisce le posizioni esatte dei pixel x e y in floating-point. L'API WCS di alto livello isola la tua application logic dalla matematica di proiezione sottostante, il che significa che il tuo codice di conversione pixel-to-sky rimane identico sia che tu stia lavorando con una mappa radio piatta, sia con un mosaico ottico wide-field profondamente distorto. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a sviluppare!
12

Modelli analitici e fitting

3m 55s

Immergiti nel modulo astropy.modeling. Impara a costruire modelli 1D e 2D, applicare vincoli ai parametri ed eseguire fitter lineari o non lineari.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 12 di 15. In molte librerie scientifiche, l'equazione matematica che vuoi valutare è strettamente legata all'algoritmo utilizzato per ottimizzarla. Se vuoi cambiare il funzionamento dell'ottimizzazione, spesso devi riscrivere il modo in cui hai definito la matematica. Astropy elimina completamente questo problema con il suo approccio agli Analytical Models e al fitting. La filosofia di design alla base del subpackage di modeling di Astropy è una rigorosa separation of concerns. La definizione matematica della tua equazione è un oggetto. Il motore algoritmico che fa il fitting di quell'equazione sui tuoi dati è un oggetto completamente separato. Questo significa che puoi definire la tua matematica una volta sola, e poi testarla con diversi algoritmi di fitting semplicemente passando il model a un fitter diverso. Astropy fornisce decine di modelli matematici predefiniti. Se stai modellando un trend costante, usi un model Linear1D. Se stai studiando una linea di emissione in uno spettro, passi a un model Gaussian1D. Questi oggetti model incapsulano i loro parametri, come amplitude, mean e standard deviation. Prima di guardare il processo di fitting, dobbiamo chiarire una frequente fonte di confusione. In Astropy, i model sono oggetti callable. Passi un array di coordinate direttamente a un model istanziato, e questo valuta la matematica per restituire i valori corrispondenti. La cosa più importante è che, quando ottimizzi un model, il fitter non muta il tuo oggetto di partenza originale. Restituisce sempre una nuova istanza del fitted model. La tua stima iniziale viene preservata esattamente come l'hai definita. Considera uno scenario in cui hai dei dati rumorosi in un array unidimensionale che rappresentano una caratteristica spettrale. Per prima cosa, inizializzi un model Gaussian1D con le tue stime iniziali approssimative per amplitude, mean e width. Dato che Astropy separa la matematica dall'optimizer, attacchi i tuoi vincoli fisici direttamente ai parametri del model. Supponi di conoscere già l'esatta coordinata centrale di questa linea spettrale. Accedi al parametro mean sul tuo model e imposti la sua property fixed su true. L'algoritmo di ottimizzazione ora lascerà stare quel valore. Puoi anche stabilire dei bound matematici. Impostando un bound minimo di zero sul parametro amplitude, forzi l'algoritmo a rifiutare qualsiasi soluzione che porti a un picco negativo. Con il tuo model di partenza completamente vincolato, introduci il fitter. Per equazioni non lineari come una gaussiana, istanzi il fitter dei minimi quadrati di Levenberg-Marquardt, noto in Astropy come LevMarLSQFitter. Esegui il fit chiamando questo oggetto fitter, passandogli il tuo model gaussiano iniziale insieme ai tuoi array di dati orizzontali e verticali. L'algoritmo gira e restituisce in output un model Gaussian1D completamente nuovo, contenente i valori ottimizzati dei parametri. Dato che questo nuovo model è direttamente callable, ti basta passargli il tuo array orizzontale originale per generare una curva matematica fluida che puoi plottare sui tuoi dati rumorosi. Ecco il punto chiave. Salvando i vincoli sul model anziché passarli al solver, gli algoritmi di fitting rimangono generici. Spendi le tue energie per codificare la realtà fisica del tuo problema nel model matematico, permettendo ad Astropy di scambiare la logica di ottimizzazione in background senza rompere la tua pipeline. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a sviluppare!
13

Modelli composti e fit personalizzati

3m 48s

Espandi il tuo kit di strumenti di modeling combinando più modelli matematici e definendo i tuoi fitter personalizzati e modelli sensibili alle unità di misura.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 13 di 15. Invece di scrivere a mano un'enorme funzione matematica con quindici parametri per fare il fit di uno spettro complesso, e se potessi semplicemente unire forme di base come mattoncini Lego e lasciare che Python si occupi dei calcoli? È esattamente ciò che tratteremo oggi con i Compound Model e i Custom Fit. In Astropy, raramente hai bisogno di costruire model analitici complessi da zero. Prendi blocchi semplici e predefiniti e li combini usando gli operatori aritmetici standard di Python come addizione, sottrazione, moltiplicazione o divisione. Quando sommi due model Astropy, non ottieni un array statico di numeri calcolati. Ottieni un oggetto model completamente nuovo e funzionante. Questa struttura compound sa come valutarsi, calcolare le proprie derivate e tenere traccia di ogni parametro dei model di base originali. Considera uno scenario specifico. Hai uno spettro contenente due linee di emissione distinte sovrapposte a un continuum di fondo piatto. Vuoi fare il fit di questa intera struttura simultaneamente. Inizi istanziando un model polinomiale di base che fungerà da baseline piatta. Successivamente, istanzi due model gaussiani unidimensionali separati per rappresentare le due linee di emissione. Per creare il tuo profilo spettrale finale, definisci semplicemente una nuova variabile uguale al polinomio più la prima gaussiana più la seconda gaussiana. Astropy li unisce automaticamente in un unico compound evaluation tree. Questo introduce una trappola comune per quanto riguarda l'accesso ai parametri. Quando crei questo compound model, potresti chiederti come isolare l'amplitude della seconda linea di emissione. Poiché entrambe sono gaussiane, entrambe hanno un parametro chiamato amplitude. Astropy risolve questa collisione aggiungendo automaticamente dei suffissi numerici in base all'ordine in cui i model sono stati combinati. I parametri della prima gaussiana vengono rinominati in amplitude zero, mean zero e standard deviation zero. La seconda gaussiana ottiene amplitude uno, mean uno e così via. Se dovessi mai perdere traccia di quale parametro appartiene a quale componente, puoi ispezionare l'attributo parameter names del tuo compound model per vedere l'elenco esatto generato. Ora, il secondo aspetto riguarda il fit di dati che contengono unità fisiche. Le misurazioni astronomiche non sono semplici float grezzi. La tua variabile indipendente potrebbe essere la lunghezza d'onda in Angstrom e la tua variabile dipendente la densità di flusso in Jansky. I model di Astropy gestiscono elegantemente questo aspetto tramite l'oggetto Quantity. Quando passi i tuoi array di dati a un fitter, passi direttamente gli oggetti Quantity di Astropy, senza rimuovere le unità. Il fitter analizza le unità dei tuoi dati di input e la struttura del tuo compound model. Rileva le discrepanze dimensionali prima ancora che il fit inizi. Una volta che il fit converge, i parametri del model risultante conterranno automaticamente le unità fisiche corrette. I tuoi mean gaussiani si aggiornano in Angstrom e le tue amplitude si aggiornano in Jansky. Non devi scrivere logiche di conversione personalizzate o rimuovere le unità prima del fit per poi riassociarle in seguito. Il compound model garantisce la coerenza dimensionale durante l'intero processo. Ecco il punto chiave. Quando usi un segno più tra due model, non stai solo concatenando delle funzioni. Stai costruendo un'unica equazione unificata che mantiene una rigorosa consapevolezza delle unità di misura e la tracciabilità dei parametri, dai dati grezzi fino al fit finale. Questo è tutto per oggi. Alla prossima!
14

Analisi delle serie temporali: a caccia di esopianeti

3m 51s

Analizza i dati periodici usando il modulo astropy.timeseries. Ti guideremo attraverso il folding delle curve di luce e la scoperta dei periodi con l'algoritmo Box Least Squares.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 14 di 15. Hai quattordicimila foto di una stella scattate da un telescopio a intervalli irregolari. Da qualche parte in questo rumore c'è un calo di luminosità dello zero virgola zero uno percento causato dal passaggio di un pianeta alieno davanti alla stella. Ecco l'algoritmo esatto per trovarlo. Questo episodio parla di Time Series Analysis e della caccia agli esopianeti. Astropy gestisce questo workflow usando la classe TimeSeries. Prima di andare avanti, chiariamo un malinteso comune. Una TimeSeries non è una struttura dati completamente nuova con le sue regole. È semplicemente una subclass di QTable. Questo significa che ogni metodo di manipolazione delle tabelle, operazione sulle colonne e tecnica di masking che già conosci funziona ancora perfettamente. L'unica differenza è che la prima colonna è forzata a essere un object Time di Astropy. Questa rigidità garantisce che i tuoi timestamp e le tue misurazioni di flux restino perfettamente allineati, sia che le tue osservazioni siano spaziate in modo regolare, sia che siano del tutto casuali. Per iniziare a dare la caccia a un esopianeta, per prima cosa carichi una curva di luce. Astropy fornisce dei reader built-in, permettendoti di passare un file FITS di Kepler direttamente alla funzione read di TimeSeries. Imposta automaticamente la colonna Time e importa le misurazioni della luce, di solito chiamate flux. I dati di Kepler sono estremamente densi, a volte contengono migliaia di data point nell'arco di pochi mesi. Questi raw data spesso contengono rumore ad alta frequenza dovuto alla sonda spaziale o all'attività stellare. Puoi attenuarlo usando il downsampling tramite aggregation. Definisci la dimensione di un time bin, ad esempio dieci minuti, e passi una funzione di aggregation come la mean. Astropy raggruppa i timestamp in questi bin e fa la media del flux, riducendo le dimensioni del dataset e sopprimendo il rumore casuale senza cancellare il segnale di transito effettivo. Ora hai dei dati puliti, ma i transiti dell'esopianeta sono nascosti da qualche parte lungo una timeline enorme. Per trovare il pianeta, ti serve un periodogramma. Forse hai familiarità con il periodogramma di Lomb-Scargle, che è eccellente per trovare onde sinusoidali continue e uniformi come la luce di una stella pulsante. Ma un pianeta che passa davanti a una stella non crea un'onda sinusoidale. Crea una linea piatta, un calo improvviso, un fondo piatto e una risalita improvvisa. Il segnale è un box. A causa di questa forma, usi il periodogramma Box Least Squares, o BLS. Passi la tua colonna time e la tua colonna flux alla funzione BLS. L'algoritmo quindi valuta un'intera grid di possibili periodi orbitali, magari testando tutto, da un'orbita di un giorno a un'orbita di cinquanta giorni. A ogni frequenza testata, fa scorrere un box matematico sui dati, cercando di far combaciare la profondità e la durata di un potenziale transito planetario. Restituisce un power spectrum che mostra quanto bene il box ha fittato a ogni singola frequenza. Ti basta estrarre il periodo che ha generato il picco di potenza più alto. Quella è la sospetta orbita del tuo esopianeta. Una volta che hai quel periodo esatto, devi verificarlo visivamente. Prendi la tua TimeSeries originale e chiami il metodo fold, passando il periodo che hai appena scoperto. Il folding prende ogni singola osservazione attraverso mesi o anni e la mappa su un singolo ciclo orbitale. Invece di una timeline cronologica, il tuo asse orizzontale diventa la fase, che va da zero a uno. Ogni volta che il pianeta è transitato davanti alla stella nel corso della missione, quei singoli data point vengono impilati l'uno sull'altro esattamente alla stessa fase. Questa è la parte che conta. Quando plotti quella TimeSeries folded, lo scatter casuale della timeline svanisce, e un netto, innegabile calo a forma di U appare precisamente al centro del tuo grafico. Hai appena usato la geometria e il tempo per tirar fuori un mondo invisibile dal rumore. Grazie per aver passato qualche minuto con me. Alla prossima, stammi bene.
15

Calcoli cosmologici: misurare l'universo

3m 56s

Esegui calcoli complessi su scala universale usando il modulo astropy.cosmology. Calcola i tempi di lookback, le distanze di luminosità e trova i redshift in base all'età.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Astropy: Python per l'astronomia, episodio 15 di 15. Risolvere la metrica dell'universo in espansione di solito richiede il calcolo manuale di enormi integrali ellittici. Oppure, puoi semplicemente importare un singolo module e lasciare che Python si occupi dei calcoli. Oggi parliamo di calcoli cosmologici: misurare l'universo. Il subpackage cosmology di Astropy incapsula la relatività generale e la metrica di Friedmann-Lemaitre-Robertson-Walker in semplici function call. Invece di scrivere i tuoi integratori per mappare il redshift alla distanza fisica, definisci un modello cosmologico e la library gestisce la geometria sottostante. Una cosmologia in Astropy è un object Python. Puoi crearne una da zero usando la class FlatLambdaCDM. Le passi una costante di Hubble, tipo settanta, e una densità di materia iniziale, tipo zero virgola tre. Questo ti restituisce un universo spazialmente piatto, guidato dall'energia oscura e dalla materia oscura fredda. Tuttavia, raramente hai bisogno di digitare questi parametri a mano. Astropy include realizzazioni built-in standard, derivate dalle principali survey. Ti basta importare Planck13 o WMAP9 dal module cosmology, e hai subito un modello completamente configurato e pronto da valutare. Ecco il punto chiave riguardo allo state. I parametri di un object cosmology di Astropy sono rigorosamente immutabili. Se inizializzi un modello e poi decidi di voler modificare la densità di materia, non puoi aggiornare quell'attribute in place. Farlo lancia un errore. Invece, chiami il method clone sul tuo modello esistente, passando il nuovo valore del parametro come argument. Questo restituisce una nuova instance cosmology con i tuoi valori aggiornati. Prendiamo uno scenario concreto usando il modello built-in Planck13. Supponi di osservare una galassia a un redshift di due. Vuoi conoscere il suo lookback time, ovvero quanti anni ha impiegato la luce per raggiungere il tuo telescopio. Prendi il tuo object Planck13, chiami il suo method lookback time e gli passi il numero due. Il method restituisce una quantità di tempo in gigaanni. Usi questo stesso identico pattern per calcolare la luminosity distance. Chiami il method luminosity distance con il tuo redshift, e Astropy restituisce la distanza in megaparsec, tenendo conto dell'espansione dell'universo. Questo copre gli input e gli output, ma che dire dell'inverso? A volte hai una misurazione fisica e devi trovare il redshift corrispondente. Metti caso che tu voglia conoscere il redshift esatto in cui l'universo aveva esattamente due miliardi di anni. Non puoi semplicemente passare un'età ai method standard. Invece, importi una function chiamata z at value. Le passi il method che vuoi invertire, che è il method age del tuo modello Planck13, e le passi il valore target di due gigaanni. Astropy esegue una routine numerica di root-finding dietro le quinte e restituisce il redshift preciso. Convertire tra redshift e tempo o distanza fisica è la spina dorsale dell'astronomia extragalattica, e questo module ti dà una source of truth testata, così puoi concentrarti sui dati invece di fare il debug degli integrali. Dato che questo è l'ultimo episodio della nostra serie su Astropy, ti incoraggio a leggere la documentazione ufficiale, a provare questi tool hands-on, o a visitare DEV STORIES DOT EU per suggerire argomenti per la nostra prossima serie. Grazie per aver passato qualche minuto con me. Alla prossima, stammi bene.