Retour au catalogue
Season 11 15 Épisodes 56 min 2026

Astropy: Python for Astronomy

v7.2 — Édition 2026. Un guide complet sur Astropy, le paquet principal pour l'astronomie en Python, couvrant les unités, les coordonnées, les tables, les fichiers FITS, la modélisation et la cosmologie (v7.2).

Calcul scientifique Astronomie
Astropy: Python for Astronomy
Lecture en cours
Click play to start
0:00
0:00
1
Le cœur d'Astropy : Unités et Quantités
Découvrez les concepts fondamentaux d'Astropy : les unités et les quantités. Apprenez à combiner des valeurs scalaires et des tableaux avec des unités physiques pour gérer automatiquement l'analyse dimensionnelle.
3m 37s
2
Échelles de temps et précision : Le module astropy.time
Découvrez comment Astropy gère une précision sub-nanoseconde sur l'âge de l'univers. Nous abordons l'UTC, le TAI, le temps dynamique barycentrique et l'objet Time.
4m 10s
3
Naviguer dans le ciel : La classe SkyCoord
Apprenez à définir et à transformer des coordonnées célestes à l'aide de la classe SkyCoord. Nous explorons l'ICRS, les référentiels galactiques et le croisement de catalogues.
3m 37s
4
Au-delà de l'AD et de la Déc : Suivi 3D et vitesses
Allez au-delà des coordonnées 2D statiques. Apprenez à ajouter des distances, à calculer des séparations 3D, à modéliser des mouvements propres et à calculer des corrections de vitesse radiale.
3m 41s
5
Maîtrise des données tabulaires : La classe QTable
Découvrez pourquoi Astropy possède sa propre classe QTable au lieu de s'appuyer uniquement sur Pandas. Apprenez à stocker des colonnes multidimensionnelles, des objets Quantity et des Mixins.
3m 06s
6
Opérations avancées sur les tables : Masquage et jointures
Faites passer vos compétences avec QTable au niveau supérieur en gérant les données manquantes avec MaskedColumns et en exécutant des jointures de type base de données.
4m 02s
7
L'interface I/O unifiée
Apprenez comment Astropy abstrait la lecture et l'écriture de fichiers dans une seule interface unifiée. Nous aborderons la manipulation fluide des tables FITS, des VOTables et des formats ASCII.
4m 01s
8
Démystifier les en-têtes FITS et les HDUs
Plongez dans le module brut astropy.io.fits pour manipuler les Header Data Units (HDUs). Apprenez à analyser, modifier et corriger les en-têtes FITS non standards.
3m 29s
9
Gérer des fichiers FITS massifs et le stockage cloud
Apprenez à gérer des jeux de données FITS massifs qui ne tiennent pas dans la RAM en utilisant le mappage mémoire (memory mapping), et découvrez comment diffuser des extraits depuis des buckets cloud à l'aide de fsspec.
3m 38s
10
Données sur grille : Les classes NDData et CCDData
Passez des tableaux numpy bruts à CCDData. Apprenez à regrouper des données d'images 2D avec des masques, des métadonnées WCS et des incertitudes physiques robustes.
3m 58s
11
World Coordinate Systems : Cartographier les pixels vers le ciel
Traduisez les pixels de la caméra en coordonnées célestes à l'aide du paquet WCS. Comprenez l'API de haut niveau et les mathématiques derrière les projections FITS.
3m 55s
12
Modèles analytiques et ajustement
Plongez dans le module astropy.modeling. Apprenez à construire des modèles 1D et 2D, à appliquer des contraintes de paramètres et à exécuter des algorithmes d'ajustement (fitters) linéaires ou non linéaires.
3m 33s
13
Modèles composés et ajustements personnalisés
Élargissez votre boîte à outils de modélisation en combinant plusieurs modèles mathématiques et en définissant vos propres algorithmes d'ajustement personnalisés ainsi que des modèles sensibles aux unités.
3m 47s
14
Analyse de séries temporelles : À la chasse aux exoplanètes
Analysez des données périodiques à l'aide du module astropy.timeseries. Nous vous guidons à travers le repliement des courbes de lumière et la découverte de périodes avec l'algorithme Box Least Squares.
4m 44s
15
Calculs cosmologiques : Mesurer l'Univers
Effectuez des calculs complexes à l'échelle de l'univers à l'aide du module astropy.cosmology. Calculez les temps de regard vers le passé, les distances de luminosité et trouvez les décalages vers le rouge (redshifts) en fonction de l'âge.
3m 35s

Épisodes

1

Le cœur d'Astropy : Unités et Quantités

3m 37s

Découvrez les concepts fondamentaux d'Astropy : les unités et les quantités. Apprenez à combiner des valeurs scalaires et des tableaux avec des unités physiques pour gérer automatiquement l'analyse dimensionnelle.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Astropy : Python pour l'astronomie, épisode 1 sur 15. Tu as probablement déjà multiplié un array NumPy par une constante. Mais si tu mélanges accidentellement des mètres et des kilomètres dans une équation complexe, Python ne t'avertira pas, et ton array final contiendra juste les mauvais nombres. Laisser la library gérer automatiquement les dimensions physiques, c'est exactement ce qu'on va voir dans cet épisode. On va regarder le cœur d'Astropy : les unités et les Quantities. Astropy gère les unités physiques via l'objet Quantity. Un Quantity associe un nombre, ou un array de nombres, à une unité physique. Comme un Quantity est une subclass directe d'un ndarray NumPy, tu ne perds ni en performance ni en fonctionnalités d'array. Tu peux faire du slice, du broadcast, et exécuter nativement des fonctions mathématiques NumPy standard dessus. Ils se comportent comme des arrays normaux qui savent juste quelle propriété physique ils représentent. Pour créer un Quantity, tu importes le module units d'Astropy. Ensuite, tu multiplies simplement ton nombre par l'objet unit spécifique. Trois multiplié par units point parsec crée un Quantity de trois parsecs. Beaucoup de développeurs pensent que cette abstraction est lente, ce qui est une idée reçue très courante. C'est vrai que multiplier un énorme array NumPy par un objet unit crée une nouvelle copie de cet array en mémoire. Pour éviter cet overhead, Astropy override l'opérateur bitwise left-shift, qui ressemble à deux signes inférieur à. Mets ton array existant à gauche, l'opérateur left-shift au milieu, et l'unit Astropy à droite. Ça attache l'unit à l'array in place, sans copier les données sous-jacentes. Voici le point essentiel. La library évalue les relations mathématiques entre les units pendant que tu fais tes calculs. Supposons que tu veuilles calculer le temps de trajet d'un vaisseau spatial. Ta distance est de trois virgule zéro parsecs. Ta vitesse est de cent trente kilomètres par seconde. Tu crées un Quantity pour la distance et tu le divises par le Quantity pour la vitesse. Astropy retourne un nouveau Quantity pour le temps. Il gère la division des valeurs, et il calcule l'unit résultante, en retournant des parsecs secondes par kilomètre. Cette unit résultante est mathématiquement correcte, mais pas très pratique à lire. Tu peux changer ça en utilisant la méthode to disponible sur chaque Quantity. Tu appelles la méthode to et tu passes ton unit cible, comme units point year. Astropy vérifie que les dimensions source et cible sont bien toutes les deux des unités de temps, effectue la conversion interne, et retourne un nouveau Quantity exprimé en années. Pour des standardisations rapides, tu peux aussi accéder aux properties point SI ou point CGS sur n'importe quel Quantity pour le convertir immédiatement dans les unités de base de ces systèmes. Quand tu fais des calculs où les unités s'annulent complètement, comme diviser des mètres par des centimètres, Astropy retourne un Quantity dimensionless. L'unit existe toujours under the hood sous la forme d'un type unscaled dimensionless. Si tu as besoin de passer ce résultat à une library externe qui attend des floats Python standards ou des arrays NumPy simples, tu extrais le nombre brut en utilisant l'attribut value. Avant d'extraire une valeur finale, n'oublie pas que tu peux toujours simplifier des unités combinées un peu complexes pour les ramener à leurs dimensions physiques fondamentales absolues en appelant la méthode decompose. Si tu veux soutenir l'émission, tu peux chercher DevStoriesEU sur Patreon, ça nous aide à continuer à faire ces épisodes. C'est tout pour aujourd'hui. Merci d'avoir écouté, et keep building !
2

Échelles de temps et précision : Le module astropy.time

4m 10s

Découvrez comment Astropy gère une précision sub-nanoseconde sur l'âge de l'univers. Nous abordons l'UTC, le TAI, le temps dynamique barycentrique et l'objet Time.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Astropy : Python pour l'astronomie, épisode 2 sur 15. Un float soixante-quatre bits standard ne peut pas représenter un timestamp couvrant des milliards d'années sans détruire sa propre précision. Si tu essaies de suivre un événement céleste lointain à la microseconde près, l'arithmétique à virgule flottante standard manque tout simplement de bits. C'est exactement cette limitation matérielle qui explique pourquoi on a besoin des échelles de temps et de la précision : le module astropy.time. Pour maintenir une précision sub-nanoseconde sur toute l'histoire cosmique, ce module évite complètement d'utiliser un seul nombre pour représenter le temps. À la place, il repose sur une architecture ingénieuse à deux floats. Sous le capot, chaque valeur de temps est divisée en deux floats soixante-quatre bits distincts. Le premier float stocke la partie entière de la date julienne, qui compte les jours entiers. Le second float stocke la partie fractionnaire de la journée. Si Astropy les additionnait dans une seule variable, la précision se dégraderait instantanément. En les gardant séparés, la librairie peut effectuer une arithmétique temporelle très précise localement, peu importe à quel point la date se trouve loin dans le passé ou le futur. Quand tu crées un objet Time, tu passes la valeur de temps avec deux arguments critiques : le format et l'échelle. Voici le point clé. Les développeurs confondent couramment le format visuel d'une date avec son échelle de temps physique. Ce sont des concepts entièrement séparés. Le format dicte uniquement comment la donnée est lue ou écrite. Les formats courants incluent les strings ISO standards, les dates juliennes modifiées numériques, et des représentations spécialisées comme les headers FITS. Le format est juste le wrapper structurel autour des nombres. L'échelle de temps, par contre, définit le référentiel physique de ces nombres. Les échelles de temps physiques prennent en compte la rotation de la Terre, les secondes intercalaires et les effets relativistes. Par exemple, le Temps Universel Coordonné, connu sous le nom de UTC, le Temps Terrestre, ou TT, et le Temps Atomique International, ou TAI. Une date julienne modifiée n'est pas une échelle physique, c'est juste un format. Tu peux facilement avoir un timestamp formaté en date julienne modifiée, mais physiquement ancré à l'échelle UTC. Tu dois définir explicitement à la fois le format et l'échelle quand tu passes des données brutes dans un objet Time. Imagine que tu calcules la différence de temps entre deux timestamps de télémétrie spatiale. Tu reçois le premier timestamp sous forme de string au format ISO datant d'hier, et le second timestamp comme une string ISO d'aujourd'hui. D'abord, tu initialises deux objets Time. Tu passes la string brute dans l'objet, tu déclares le format comme ISO, et tu règles l'échelle sur UTC. Tu fais ça pour les deux timestamps. Comme Astropy supporte les opérations vectorisées, tu pourrais aussi passer un array massif de ces strings dans un seul objet Time, mais la logique d'initialisation sous-jacente reste la même. Pour trouver le temps écoulé exact, tu soustrais l'objet Time le plus ancien du plus récent. Astropy exécute automatiquement l'arithmétique interne à deux floats, et te retourne un objet TimeDelta qui contient la durée exacte. Ensuite, tu dois mapper ce second timestamp de télémétrie sur une échelle physique absolue et uniforme, en supprimant les sauts imprévisibles causés par les secondes intercalaires UTC. Tu prends ton second objet Time et tu demandes simplement son équivalent en Temps Atomique International. Tu fais ça en appelant l'attribut TAI directement sur l'objet. Astropy déclenche immédiatement un recalcul des floats internes, décalant le référentiel de UTC à TAI tout en préservant une précision totale à la nanoseconde. La véritable puissance du module astropy.time, c'est que tu ne gères jamais manuellement les secondes intercalaires ou les corrections relativistes ; tu définis tes formats et tes échelles en amont, et l'architecture à deux floats garantit que les calculs restent exacts à travers l'univers. J'aimerais prendre un moment pour te remercier d'avoir écouté — ça nous aide beaucoup. Passe une excellente journée !
3

Naviguer dans le ciel : La classe SkyCoord

3m 37s

Apprenez à définir et à transformer des coordonnées célestes à l'aide de la classe SkyCoord. Nous explorons l'ICRS, les référentiels galactiques et le croisement de catalogues.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Astropy : Python pour l'astronomie, épisode 3 sur 15. Convertir manuellement des coordonnées célestes d'un système de référence à un autre implique de la trigonométrie sphérique horrible. Une simple erreur de matrice peut facilement faire pointer ton télescope vers le mauvais hémisphère. Naviguer dans le ciel : la classe SkyCoord gère ces calculs pour toi, transformant des transformations sphériques complexes en un simple attribute lookup. Dans Astropy, SkyCoord est l'objet principal de haut niveau pour représenter les positions célestes. Il agit comme un wrapper intelligent sur des frames de coordonnées de plus bas niveau. Quand tu observes une cible, tu dois enregistrer sa position. Généralement, tu utilises l'ascension droite et la déclinaison. Pour construire un SkyCoord, tu passes ces deux valeurs, tu spécifies les unités, comme les degrés ou les heures, et tu définis la reference frame. Si tu ne spécifies pas de frame, il utilise par défaut l'International Celestial Reference System, ou ICRS. Tu peux créer un point unique dans le ciel facilement, mais ça soulève un piège fréquent. Les utilisateurs vont souvent parser un fichier de données contenant des milliers d'étoiles, créer un nouvel objet SkyCoord pour chaque étoile, et les stocker dans une list Python standard. Quand ils ont besoin de faire des calculs, ils font une loop sur cette list. C'est horriblement inefficace et ça contourne complètement les avantages de performance de la library. SkyCoord est conçu pour gérer les arrays nativement. Au lieu de créer des milliers d'objets individuels, tu passes un array Numpy de valeurs d'ascension droite et un array correspondant de valeurs de déclinaison dans une seule initialisation de SkyCoord. Tu récupères exactement un seul objet SkyCoord qui contient tout ton dataset. Imagine un scénario où tu fais un cross-match d'un ensemble nouvellement découvert de cent transitoires radio enregistrés en ICRS avec un catalogue optique existant. En chargeant ces cent transitoires dans un seul SkyCoord basé sur un array, la library passe les données à des routines C et Numpy hautement optimisées. Des opérations qui prendraient des minutes dans une loop Python s'exécutent en quelques millisecondes. Cette structure en array devient particulièrement puissante quand tu as besoin de transformer tes données. Les catalogues astronomiques ne sont pas toujours d'accord sur un système de coordonnées. Tes transitoires radio sont peut-être en ICRS, mais tu as peut-être besoin d'analyser leur distribution par rapport au plan de la Voie lactée. Pour ça, tu as besoin du système de coordonnées galactiques. Voici le point clé. Tu n'as pas besoin de chercher des matrices de rotation ou d'écrire des fonctions de conversion. Astropy contient un énorme graphe de transformation built-in qui sait comment passer de n'importe quelle frame supportée à n'importe quelle autre frame supportée. Parce que SkyCoord wrap ce graphe, convertir tout ton array de cent transitoires prend exactement une étape. Tu prends ton objet SkyCoord existant et tu appelles sa méthode transform_to, en fournissant le nom de la frame de destination. Mieux encore, pour les frames courantes, Astropy fournit un accès direct par attribut. Si tu as un objet SkyCoord ICRS, tu demandes simplement l'attribut galactic. La library calcule automatiquement la transformation et retourne un tout nouvel objet SkyCoord. Ce nouvel objet contient exactement les mêmes positions physiques dans l'espace, mais représentées en longitude et latitude galactiques. La véritable puissance de cette classe, c'est qu'elle détache complètement les données représentant une position céleste de la géométrie sphérique sous-jacente requise pour la déplacer à travers l'univers des reference frames astronomiques. C'est tout pour cet épisode. Merci d'avoir écouté, et continue de développer !
4

Au-delà de l'AD et de la Déc : Suivi 3D et vitesses

3m 41s

Allez au-delà des coordonnées 2D statiques. Apprenez à ajouter des distances, à calculer des séparations 3D, à modéliser des mouvements propres et à calculer des corrections de vitesse radiale.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Astropy : Python pour l'astronomie, épisode 4 sur 15. Tu sais peut-être exactement où se trouve une étoile ce soir, mais sans les corrections de proper motion et de vitesse de la Terre, ton télescope pointera vers le vide la décennie prochaine. C'est là qu'on va au-delà de la RA et de la Dec : Tracking 3D et Vitesses. Par défaut, les coordonnées mappent une position plane dans le ciel en utilisant des angles. Pour modéliser un système physique, comme un système d'étoiles binaires, tu as besoin de l'espace physique réel entre les composants. Beaucoup de gens essaient de calculer une séparation 3D en utilisant juste l'ascension droite et la déclinaison. Ça ne marche pas. Pour utiliser la méthode de séparation 3D, tu dois fournir un paramètre de distance quand tu crées l'objet coordinate. Tu passes une valeur de distance avec une unité physique, comme les parsecs, en plus de tes coordonnées angulaires. Une fois que les deux objets contiennent cette donnée de distance, tu appelles la méthode de séparation 3D sur la première coordonnée, en passant la deuxième coordonnée en argument. Astropy retourne la ligne physique directe entre elles dans l'espace 3D, en gérant automatiquement la trigonométrie en background. Or, ces objets ne sont pas statiques. Pour modéliser leur mouvement dans le temps, tu attaches des données de vélocité directement à l'objet coordinate lors de sa création. Tu fais ça en passant des paramètres de proper motion. Plus précisément, tu fournis le proper motion en ascension droite et le proper motion en déclinaison. Ils prennent des unités angulaires par temps, comme des milliarcsecondes par an. Tu fournis aussi un paramètre de radial velocity, qui prend une vitesse physique, comme des kilomètres par seconde. Quand tu regroupes tout ça, l'objet coordinate devient un vecteur complet dans l'espace des phases. Il contient la position actuelle de l'objet et le vecteur exact de là où il va. Voici le point clé. Ton télescope se déplace aussi dans l'espace. La Terre tourne sur son axe et orbite autour du soleil. Si tu mesures la vitesse radiale d'une étoile depuis le sol, ta mesure brute est contaminée par la propre vitesse de la Terre à cet instant précis. Pour partager tes données avec d'autres astronomes, tu dois retirer le mouvement de la Terre. Tu déplaces ton point de référence vers un référentiel stable, généralement le centre de masse du système solaire. C'est ce qu'on appelle la correction de vitesse radiale barycentrique. Pour calculer cette correction dans Astropy, tu dois définir où se trouve l'observateur en utilisant un objet Earth location. Tu le crées en passant la longitude, la latitude et l'élévation exactes de ton instrument. Alternativement, tu peux récupérer un site établi directement depuis le site registry intégré d'Astropy en requêtant un nom connu comme le Keck Observatory. Ensuite, tu as besoin de l'heure exacte à laquelle l'observation a eu lieu. Avec ta localisation et ton heure prêtes, tu appelles la méthode de radial velocity correction directement sur l'objet coordinate de ta cible. Tu lui passes l'heure d'observation et ton Earth location. Astropy calcule le vecteur de vélocité du Keck Observatory à cette milliseconde précise, par rapport à la cible, et retourne le velocity offset. Tu ajoutes cette valeur de correction à ta vitesse radiale brute mesurée. Le résultat est une mesure propre et standardisée, référencée au barycentre du système solaire. Le point le plus important à retenir ici, c'est qu'une coordonnée n'est pas juste un point fixe sur une carte ; c'est un modèle cinématique complet qui contient la position de la cible, sa trajectoire, et la géométrie nécessaire pour corriger ton propre mouvement. Merci d'avoir écouté. Prenez soin de vous, tout le monde.
5

Maîtrise des données tabulaires : La classe QTable

3m 06s

Découvrez pourquoi Astropy possède sa propre classe QTable au lieu de s'appuyer uniquement sur Pandas. Apprenez à stocker des colonnes multidimensionnelles, des objets Quantity et des Mixins.

Télécharger
Salut, ici Alex de DEV STORIES DOT EU. Astropy : Python pour l’astronomie, épisode 5 sur 15. Pandas est incroyable pour les données plates, mais que se passe-t-il quand une seule colonne de ton dataset doit contenir une série temporelle, une unité physique et une coordonnée spatiale ? Les dataframes standards montrent leurs limites. Pour résoudre ça, tu as besoin de maîtriser les données tabulaires : la classe QTable. Si tu travailles en Python, tu connais déjà Pandas. Pandas part du principe que tes données sont plates, et préfère une seule valeur simple par cellule. En astronomie, les données sont rarement simples. Une seule observation peut nécessiter des unités strictes, une matrice de valeurs, ou une coordonnée céleste complexe. Astropy fournit une structure de données tabulaires sur mesure, spécialement conçue pour cette réalité. Tu remarqueras qu'Astropy propose à la fois une classe Table standard et une classe QTable. On les confond souvent. La classe Table standard garde les infos d'unité comme des métadonnées en arrière-plan, mais elle renvoie de simples arrays NumPy quand tu extrais une colonne. Une QTable impose une gestion stricte des unités. Quand tu récupères une colonne d'une QTable, elle te garantit de te renvoyer un objet Quantity natif d'Astropy. L'unité physique est attachée de façon permanente aux nombres. Voyons comment construire une QTable. Tu commences par importer QTable depuis le module astropy dot table. Tu peux la construire en utilisant un dictionnaire où les clés sont les noms de tes colonnes et les valeurs sont tes arrays de données. Imaginons que tu crées un simple catalogue de galaxies. Ta première colonne est du texte brut. Tu lui assignes une liste de strings qui représentent les noms des galaxies. Maintenant, tu dois enregistrer la position de ces galaxies. Tu ne veux pas de colonnes séparées et déconnectées pour l'ascension droite et la déclinaison. À la place, tu crées un objet SkyCoord d'Astropy qui contient les positions de toutes tes galaxies. Tu passes cet unique objet SkyCoord directement dans ta table comme deuxième colonne. C'est une colonne mixin. Les mixins permettent à des types Astropy complexes, comme les objets SkyCoord ou Time, de se comporter exactement comme des arrays de données standards à l'intérieur de la table. Tu peux slice, trier et filtrer les lignes de la table, et l'objet mixin garde automatiquement ses données internes parfaitement synchronisées. Ensuite, tu dois stocker les mesures de flux sur trois bandes de longueurs d'onde différentes pour chaque galaxie. Dans un dataframe classique, tu serais obligé de créer trois colonnes séparées. Dans une QTable, tu utilises une colonne multidimensionnelle. Tu définis un seul array avec une shape de N lignes et trois colonnes, tu attaches une unité physique de flux à l'ensemble, et tu l'assignes comme ta troisième colonne de table. C'est là que ça devient intéressant. La QTable accepte l'array multidimensionnel nativement. Une seule ligne dans cette colonne contient maintenant un array complet de trois mesures qui conservent leurs unités. Quand tu print cette table, Astropy la formate proprement. Il aligne les arrays imbriqués et affiche les unités directement sous les en-têtes de colonnes. Tes métadonnées et tes mesures sont verrouillées ensemble. La QTable n'est pas juste un tableur ; c'est un conteneur spécialisé conçu pour respecter la physique et la géométrie de tes données. Merci d'avoir écouté. J'espère que tu as appris quelque chose de nouveau.
6

Opérations avancées sur les tables : Masquage et jointures

4m 02s

Faites passer vos compétences avec QTable au niveau supérieur en gérant les données manquantes avec MaskedColumns et en exécutant des jointures de type base de données.

Télécharger
Bonjour, ici Alex de DEV STORIES DOT EU. Astropy : Python pour l'astronomie, épisode 6 sur 15. Chercher une source spécifique dans un catalogue massif implique généralement d'exécuter un full linear scan qui bouffe du temps de traitement. Mais si tu structures bien tes données, tu peux réduire ces lookups de plusieurs minutes à quelques millisecondes. C'est ce qu'on va voir aujourd'hui : les opérations avancées sur les tables, le masking et les joins. Les tables Astropy ne sont pas de simples arrays. Elles agissent comme une base de données relationnelle in-memory qui comprend nativement les unités physiques. Supposons que tu aies un catalogue photométrique et un catalogue spectroscopique, et que tu doives les combiner en te basant sur un source ID partagé. Avant de les merge, tu dois gérer les données manquantes. Ton catalogue photométrique a probablement des valeurs de magnitude manquantes parce qu'une observation a échoué ou qu'un capteur a drop une frame. Tu pourrais essayer de filtrer ces valeurs manquantes en utilisant des boolean arrays numpy standards. Ne fais surtout pas ça. Des masks numpy standards appliqués directement sur une table unit-aware vont silencieusement supprimer tes unités physiques et casser les objets mixin. À la place, Astropy gère ça avec la MaskedColumn. Quand tu travailles dans une QTable, qui est la classe de table unit-aware, Astropy utilise automatiquement les opérations MaskedColumn under the hood pour les données manquantes. Ça garantit que ta colonne de magnitude garde ses unités physiques intactes tout en marquant de façon sûre les entrées manquantes pour qu'elles ne corrompent pas tes calculs downstream. Maintenant que ton catalogue photométrique est proprement masqué et prêt, il est temps de le combiner avec tes données spectroscopiques. Astropy fournit une fonction join qui marche un peu comme une base de données relationnelle. Tu passes à la fonction ta left table, ta right table, et tu spécifies le nom de la colonne partagée comme key, qui dans ce cas est ton source ID. Si tu spécifies un inner join, la fonction évalue les deux datasets et retourne une nouvelle table contenant uniquement les rows où le source ID existe dans les deux catalogues. Voici le point clé. Parce que tu utilises des objets QTable, l'opération de join réconcilie et préserve automatiquement les unités des deux côtés. Ta table merged contiendra les paramètres physiques précis des données spectroscopiques aux côtés des magnitudes correctement masquées des données photométriques, parfaitement alignées. Maintenant tu as un catalogue merged, et ton analyse nécessite de récupérer les paramètres exacts pour un source ID spécifique. Sans intervention, trouver une row dans une table massive nécessite de vérifier chaque entrée séquentiellement. Astropy résout ce bottleneck de performance avec le table indexing. Tu peux dire à la table de créer un index sur ta colonne source ID. En arrière-plan, Astropy construit une data structure B-tree qui mappe tes source IDs directement à leurs row locations sous-jacentes en mémoire. Une fois l'index construit, tu récupères tes données en utilisant la propriété location de la table, en lui passant ton target ID. Le moteur traverse le B-tree, skip complètement le full scan, et fetch ta row en temps logarithmique. Tu peux même indexer plusieurs colonnes simultanément pour gérer des lookups complexes, comme trouver une row à la fois par source ID et par date d'observation. Builder un index prend une fraction de compute time au départ, mais ça s'avère immédiatement rentable quand tu dois lancer des lookups répétés sur de gros datasets. La véritable puissance des tables Astropy n'est pas juste de stocker des données, mais de maintenir l'intégrité physique de tes unités à travers des joins relationnels complexes et des queries B-tree à haute vitesse. C'est tout pour cet épisode. Merci d'avoir écouté, et continue de builder !
7

L'interface I/O unifiée

4m 01s

Apprenez comment Astropy abstrait la lecture et l'écriture de fichiers dans une seule interface unifiée. Nous aborderons la manipulation fluide des tables FITS, des VOTables et des formats ASCII.

Télécharger
Salut, ici Alex de DEV STORIES DOT EU. Astropy : Python pour l'astronomie, épisode 7 sur 15. Tu as un vieux fichier texte un peu en vrac contenant des coordonnées d'étoiles, et tu dois le convertir en un standard binaire moderne et compressé. Dans la plupart des bibliothèques, ça implique d'écrire un parser personnalisé, de faire le mapping des types de données et de te battre avec les serializers binaires. Dans Astropy, tu peux accomplir ça avec exactement deux lignes de code. C'est grâce à la Unified I/O Interface. La Unified I/O Interface est une couche de gestion de données polymorphe. Au lieu de t'obliger à importer un module spécifique pour chaque type de fichier, Astropy expose une méthode read et write générique directement sur ses structures de données principales. Que tu travailles avec une Table standard, une QTable avec des unités physiques ou un array NDData multidimensionnel, le modèle d'interaction reste identique à travers des standards de fichiers complètement différents. Il y a une idée reçue très courante sur l'extraction de données. Quand les développeurs ont besoin de lire un fichier FITS, ils vont souvent directement vers le module bas niveau, astropy dot io dot fits. Ce module est strictement réservé à la manipulation de fichiers bruts, comme l'édition de headers individuels ou l'inspection de byte streams non formatés. Si tu veux juste extraire des données tabulaires d'un fichier FITS, tu ne devrais pas l'utiliser. Tu utilises plutôt la méthode Table dot read. Elle contourne l'extraction manuelle des headers et gère automatiquement le mapping des données sous-jacentes. Quand tu appelles la méthode read et que tu passes un chemin de fichier ou un file object ouvert, Astropy s'appuie sur un moteur d'inférence de format robuste. D'abord, il vérifie l'extension du fichier. Si tu fournis une string se terminant par dot h5 ou dot parquet, il redirige la requête vers le parser spécialisé correspondant. Si l'extension est ambiguë, manquante ou s'il s'agit juste d'une extension de texte générique, le moteur descend d'un niveau et inspecte le contenu du fichier. Il lit les premiers octets des données à la recherche de signatures connues ou de nombres magiques pour identifier le standard avec certitude. Si l'inférence automatique échoue complètement, tu la contournes en passant une string en argument de format, comme ascii dot csv, pour forcer le bon parser. Voici comment ça gère notre scénario de départ. Tu as cette vieille table de coordonnées d'étoiles au format texte ASCII. Tu appelles QTable dot read et tu lui passes le chemin de ton fichier texte. Astropy détecte le format ASCII, parse les colonnes et renvoie un objet QTable entièrement rempli en mémoire. Ensuite, tu veux sauvegarder ça sous forme de table binaire FITS compressée. Tu prends ce même objet QTable en mémoire et tu appelles sa méthode write. Tu fournis un nouveau nom de fichier se terminant par dot fits, et tu passes un paramètre supplémentaire pour activer la compression. Tu dois aussi passer un flag overwrite défini sur true, car la méthode write protège les fichiers existants par défaut. C'est là que ça devient intéressant. Astropy bascule dynamiquement le contexte du parsing de texte brut à la serialization binaire complexe sous le capot. Les protocoles de fichiers sous-jacents sont complètement distincts, mais l'interface que tu utilises reste inchangée. Comme l'interface est attachée à la structure de données plutôt qu'au format de fichier, tes pipelines de traitement de données deviennent découplés de tes supports de stockage. La chose la plus utile à retenir ici, c'est que changer la façon dont ton application stocke et partage les données nécessite de modifier l'extension d'un fichier dans une seule string, plutôt que de réécrire l'intégralité de ton pipeline d'ingestion de données. C'est tout pour aujourd'hui. Merci d'avoir écouté — va construire un truc cool.
8

Démystifier les en-têtes FITS et les HDUs

3m 29s

Plongez dans le module brut astropy.io.fits pour manipuler les Header Data Units (HDUs). Apprenez à analyser, modifier et corriger les en-têtes FITS non standards.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Astropy : Python pour l'astronomie, épisode 8 sur 15. Le standard de fichier FITS a été créé dans les années 80 pour les systèmes Fortran, et stocke les métadonnées dans des blocs rigides de 80 octets directement inspirés des cartes perforées physiques. Gérer des structures de cartes perforées dans du code moderne est rarement une partie de plaisir. Astropy cache cette complexité en traduisant ces blocs en structures natives, et c'est exactement pour ça que cet épisode se concentre sur la démystification des headers FITS et des HDU. Imagine un fichier FITS comme un conteneur. À l'intérieur de ce conteneur se trouvent des Header Data Units, universellement connus sous le nom de HDU. Chaque fichier FITS doit en contenir au moins un, appelé le Primary HDU. Souvent, cette unité primaire ne contient rien d'autre que des métadonnées, tandis que les images ou les tables binaires elles-mêmes suivent juste derrière sous forme d'Extension HDUs. Quand tu ouvres un fichier FITS avec Astropy, il parse ce conteneur et te renvoie un objet HDUList. Tu navigues dans cet objet en utilisant la notation standard entre crochets pour sélectionner des HDU individuels. Voici le point clé concernant l'indexation. Le standard FITS officiel utilise strictement une indexation basée sur un, à cause de ses racines Fortran. Cependant, comme Astropy est une librairie Python, elle impose une indexation basée sur zéro. Le Primary HDU est toujours à l'index zéro, et la première extension est à l'index un. C'est un détail tout simple, mais l'oublier provoque constamment des erreurs off-by-one. Chaque objet HDU contient un attribut header. C'est là que vivent ces vieux blocs de 80 octets. Dans la terminologie FITS, chaque ligne de métadonnées s'appelle une card. Une card complète contient un keyword, une value, et parfois un commentaire descriptif. Astropy traite ces cards et t'expose le header comme un objet qui agit exactement comme un dictionnaire Python standard. Si tu as besoin du temps d'exposition, tu passes simplement le keyword EXPTIME au header. Modifier des valeurs fonctionne de la même manière. Tu assignes une nouvelle value au keyword en utilisant un signe égal. Si tu dois aussi mettre à jour le commentaire sur cette card spécifique, tu assignes un tuple contenant à la fois la nouvelle value et la nouvelle string de commentaire. Astropy reformate automatiquement ces données dans le standard requis de 80 octets en arrière-plan. Cette traduction fonctionne sans problème jusqu'à ce que tu rencontres des données legacy. Les vieux fichiers FITS violent fréquemment le standard strict. Ils peuvent présenter des keywords trop longs ou contenir des caractères illégaux. Comme Astropy valide strictement les headers par défaut, essayer d'ouvrir un fichier non conforme va souvent lever une exception immédiatement. Au lieu d'abandonner le fichier, tu peux gérer ça en utilisant la méthode verify. Disons que tu ouvres une vieille image de télescope et que tu tombes sur une erreur de validation concernant le formatage. Tu captures l'objet fichier et tu appelles sa méthode verify, en passant l'argument string fix. Astropy va scanner toutes les cards du header, réparer automatiquement les problèmes de formatage quand c'est possible, et supprimer les erreurs pour les champs corrompus qu'il corrige. Une fois le header stabilisé, tu peux mettre à jour en toute sécurité une card OBSERVER cassée avec la bonne string, puis écrire ta HDUList nettoyée sur le disque. Traite toujours tes mises à jour de métadonnées FITS comme de simples opérations de dictionnaire, mais garde cette méthode verify sous le coude pour le moment où des données legacy brisent les règles. Si tu veux aider à faire vivre l'émission, cherche DevStoriesEU sur Patreon. Merci d'avoir écouté. À la prochaine !
9

Gérer des fichiers FITS massifs et le stockage cloud

3m 38s

Apprenez à gérer des jeux de données FITS massifs qui ne tiennent pas dans la RAM en utilisant le mappage mémoire (memory mapping), et découvrez comment diffuser des extraits depuis des buckets cloud à l'aide de fsspec.

Télécharger
Bonjour, ici Alex de DEV STORIES DOT EU. Astropy : Python pour l'astronomie, épisode 9 sur 15. Tu n'as pas besoin d'un supercalculateur pour analyser une image de cent gigaoctets. Tu as juste besoin d'un moyen de tromper ton système d'exploitation pour qu'il lise uniquement les pixels exacts qui t'intéressent. La gestion des fichiers FITS massifs et du cloud storage est exactement le mécanisme que tu utilises pour accomplir ça. Quand tu travailles avec des arrays astronomiques massifs, essayer de charger un fichier entier en mémoire va immédiatement faire crasher ton process. Astropy évite ça en utilisant une fonctionnalité appelée memory mapping. Quand tu ouvres un fichier FITS, tu peux passer un argument appelé memmap défini sur True. Un memory map ne lit pas les données de l'image dans ta RAM physique. À la place, il mappe le fichier de ton disque dur directement dans l'espace d'adressage de la mémoire virtuelle de ton ordinateur. Quand tu accèdes à une slice spécifique de l'array, ton système d'exploitation va chercher uniquement ce bloc de données spécifique sur le disque. Tu as l'avantage de faire comme si le fichier entier était chargé, mais tu ne paies le coût en mémoire physique que pour les pixels que tu traites activement. Ce comportement introduit un piège très courant. Tu pourrais ouvrir un fichier FITS, assigner l'array de l'image à une variable, puis appeler close sur l'objet fichier. Tu t'attends à ce que le file handle soit relâché et la ressource libérée. Ce n'est pas le cas. Parce que les memory maps s'appuient sur le système d'exploitation pour lier le fichier à une variable, le fichier reste ouvert et verrouillé tant qu'une référence à cet array existe dans ta session Python. Pour vraiment libérer la ressource et fermer complètement le file handle, tu dois supprimer explicitement ta variable de données en utilisant la commande delete standard de Python. Ça, c'est pour les fichiers locaux, mais les datasets d'astronomie modernes se trouvent souvent sur des serveurs distants. Télécharger des centaines de gigaoctets juste pour inspecter une petite région est une perte de bande passante et de temps. Astropy gère les données distantes en s'intégrant à la librairie file system spec. Quand tu ouvres un fichier, tu passes un argument appelé use fsspec défini sur True. Ça indique à la librairie de traiter les emplacements de cloud storage exactement comme des disques locaux. Prends l'exemple d'une image du télescope spatial Hubble de deux cents mégaoctets hébergée dans un bucket Amazon S3 public. Tu veux juste une toute petite découpe de dix par vingt pixels autour d'une étoile spécifique. D'abord, tu appelles fits open, en passant l'Uniform Resource Identifier S3 au lieu d'un chemin de fichier local, avec use fsspec défini sur True. Astropy se connecte au bucket et télécharge uniquement les blocs de header FITS. Ça lui permet de comprendre la structure du fichier sans toucher aux données réelles de l'image. Ensuite, tu navigues vers la bonne extension d'image et tu slices l'array de données en utilisant l'indexation standard, pour récupérer juste ton bloc de dix par vingt. C'est là que ça devient intéressant. Astropy traduit cette slice d'array en requêtes HTTP byte range spécifiques. Ta machine contacte Amazon S3, demande uniquement les octets physiques qui correspondent à ces deux cents pixels, et télécharge exactement ce petit chunk. Tu obtiens ta découpe instantanément, pendant que les cent quatre-vingt-dix-neuf mégaoctets restants du fichier restent sur le serveur, intacts. Combiner le memory mapping local avec le byte range streaming distant signifie que tes scripts d'analyse sont limités uniquement par les données que tu calcules activement, jamais par la taille totale du fichier lui-même. Je voudrais prendre un moment pour te remercier de ton écoute — ça nous aide beaucoup. Passe une excellente journée !
10

Données sur grille : Les classes NDData et CCDData

3m 58s

Passez des tableaux numpy bruts à CCDData. Apprenez à regrouper des données d'images 2D avec des masques, des métadonnées WCS et des incertitudes physiques robustes.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Astropy : Python pour l'astronomie, épisode 10 sur 15. Si tu slice un array numérique standard, tu ne récupères que des pixels bruts. Mais les données de télescope ne sont jamais juste une simple matrice de nombres. Quand tu crop une image pour observer une seule étoile, tes marges d'erreur, tes masques de pixels morts et tes coordonnées célestes doivent rester parfaitement alignés, sinon toute ton analyse plante. C'est exactement pour ça qu'on utilise les Gridded Data : les classes NDData et CCDData. À la base, Astropy fournit la base class NDData comme conteneur standard pour les données astronomiques sous forme de grille. Même si NDData gère la structure générale, pour les vraies images optiques ou infrarouges, tu vas généralement utiliser sa subclass spécialisée qui s'appelle CCDData. Ce conteneur existe pour lier directement tes valeurs de pixels brutes à leurs propriétés physiques. Voyons comment initialiser un objet CCDData pour une exposition de télescope brute. Tu ne passes pas simplement une grille de nombres en deux dimensions. Tu passes la grille de données brutes, et tu dois assigner une unité physique, comme des électrons ou des analog-to-digital units. Ensuite, tu attaches un masque boolean. Si un rayon cosmique à haute énergie frappe ton détecteur pendant l'exposition, tu flag ces pixels ruinés spécifiques à true dans un array de masque séparé, et tu passes ça directement à l'objet CCDData. Ensuite vient le suivi des erreurs. Tu attaches un array d'incertitude. Pour notre image brute, tu pourrais calculer le bruit de Poisson et l'attacher en utilisant soit la classe Standard Deviation Uncertainty, soit la classe Variance Uncertainty. Maintenant, tes valeurs de luminosité, tes unités, tes flags de mauvais pixels et tes limites de bruit statistique sont verrouillés ensemble dans un seul objet unifié. Ça amène une confusion courante. Une fois que tu as cet objet complètement chargé, n'essaie pas d'utiliser des opérateurs mathématiques standards, comme un simple signe plus ou moins, pour traiter l'image. Si tu tentes une arithmétique d'array normale pour soustraire une frame de fond sombre, tu vas perdre tes incertitudes en route. À la place, tu dois utiliser les méthodes arithmétiques built-in fournies par la classe, comme les fonctions add, subtract, multiply et divide. C'est là que ça devient intéressant. Quand tu appelles la méthode subtract, Astropy ne se contente pas de soustraire les valeurs des pixels. Il propage automatiquement tes incertitudes de variance à travers l'opération en utilisant des règles statistiques standards, ce qui donne un profil de bruit mathématiquement solide dans l'image résultante. Plus tard dans ton workflow, tu pourrais te rendre compte que ton image complète de télescope est trop grande, et que tu veux seulement analyser une seule galaxie située dans le coin en haut à droite. Tu accomplis ça en utilisant un outil appelé Cutout2D. Tu fournis ton objet CCDData principal, les coordonnées exactes du centre de ta galaxie cible, et la taille de la bounding box que tu veux extraire. Parce que tu as tout packagé dans un conteneur CCDData, Cutout2D gère la synchronisation complexe automatiquement. Il retourne un nouvel objet plus petit. Il slice les pixels de l'image, mais il crop aussi automatiquement le masque de rayons cosmiques et l'array d'incertitude de variance exactement aux mêmes dimensions. Point crucial, il translate le world coordinate system sous-jacent. La coordonnée de pixel zéro-zéro dans ton nouveau cutout correspond exactement à la même ascension droite et déclinaison que dans l'image master. En traitant les données de pixels, les marges d'erreur physiques et les coordonnées spatiales comme une seule unité indivisible, ces classes empêchent la corruption silencieuse des données pendant que ton image traverse des pipelines d'analyse complexes. C'est tout pour cet épisode. Merci d'avoir écouté, et continue à développer !
11

World Coordinate Systems : Cartographier les pixels vers le ciel

3m 55s

Traduisez les pixels de la caméra en coordonnées célestes à l'aide du paquet WCS. Comprenez l'API de haut niveau et les mathématiques derrière les projections FITS.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Astropy : Python pour l'astronomie, épisode 11 sur 15. Chaque pixel sur un détecteur de télescope est un carré plat et discret, mais le ciel est une sphère courbe continue et mathématiquement complexe. Transposer un point de ce détecteur plat vers sa position réelle dans l'univers est un problème géométrique délicat. Les World Coordinate Systems, ou WCS, sont le mécanisme qui décode cette géométrie. Le WCS agit comme le pont ultime entre le hardware et la physique. Il fournit la transformation mathématique requise pour convertir une coordonnée de pixel en une world coordinate, comme l'ascension droite et la déclinaison. Dans les données astronomiques, ces règles de transformation sont généralement stockées sous forme de metadata standardisées dans le header d'un fichier FITS. Le header contient des keywords spécifiques définissant le pixel de référence, les coordonnées physiques de ce pixel, et la matrice de rotation ou d'échelle utilisée par le télescope. Astropy lit ces keywords et construit un objet de transformation actif qui modélise l'ensemble du plan focal. Avant de faire des maths, on doit dissiper une source constante de confusion liée à l'indexation. Le standard FITS définit les coordonnées des pixels comme étant one-indexed, ce qui signifie que le tout premier pixel sur le détecteur est le pixel un. Python, et donc NumPy, est zero-indexed. Astropy résout cette dualité à travers deux couches différentes. L'ancienne low-level API n'est pas un système d'indexation unifié ; elle te demande de passer explicitement un argument origin de zéro ou un à chaque fois que tu transformes une coordonnée. Mais la Shared Python Interface moderne et high-level fonctionne entièrement sur la convention zero-indexed de Python. Elle s'attend à recevoir des pixels zero-based de ta part et gère automatiquement l'offset par rapport au standard FITS en interne. Voici l'idée clé. La high-level API rend la conversion de coordonnées incroyablement concise. Disons que tu as repéré une étoile brillante dans ton array d'image au pixel x égal 30 et y égal 40, et que tu dois trouver sa vraie position dans l'espace. D'abord, tu lis le header de ton fichier FITS en utilisant les outils d'input-output d'Astropy. Ensuite, tu initialises un objet WCS en passant ce header directement dans la class WCS. Enfin, tu appelles une méthode nommée pixel to world sur cet objet WCS, en lui passant tes valeurs de pixel x et y de 30 et 40. La méthode évalue les maths de projection et retourne un objet Astropy SkyCoord standard. Cet objet contient les coordonnées physiques et est totalement conscient de son reference frame, comme l'ICRS. La beauté de cette shared interface, c'est qu'elle te protège des nombres bruts. Au lieu de retourner un array générique de floats représentant des degrés abstraits, elle te donne des objets riches qui comprennent leurs propres unités physiques et systèmes de coordonnées. Tu peux prendre ce SkyCoord et l'utiliser immédiatement pour faire un cross-reference avec un catalogue d'étoiles. Le système fonctionne exactement de la même manière dans l'autre sens. Si tu as les coordonnées d'une galaxie connue et que tu veux déterminer exactement quels pixels elle occupe sur ton capteur de caméra, tu appelles la méthode world to pixel sur ton objet WCS. Tu passes ton SkyCoord, et elle te retourne les positions exactes des pixels en float pour x et y. La high-level WCS API isole ton application logic des maths de projection sous-jacentes, ce qui signifie que ton code de conversion pixel-to-sky reste identique, que tu travailles avec une carte radio plate ou une mosaïque optique grand champ profondément déformée. C'est tout pour cet épisode. Merci d'avoir écouté, et continue de développer !
12

Modèles analytiques et ajustement

3m 33s

Plongez dans le module astropy.modeling. Apprenez à construire des modèles 1D et 2D, à appliquer des contraintes de paramètres et à exécuter des algorithmes d'ajustement (fitters) linéaires ou non linéaires.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Astropy : Python pour l'astronomie, épisode 12 sur 15. Dans beaucoup de librairies scientifiques, l'équation mathématique que tu veux évaluer est fortement couplée à l'algorithme utilisé pour l'optimiser. Si tu veux changer le fonctionnement de l'optimisation, tu dois souvent réécrire la façon dont tu as défini tes maths. Astropy élimine complètement ce problème avec son approche des modèles analytiques et du fitting. La philosophie de conception principale du subpackage de modélisation d'Astropy, c'est une stricte séparation des responsabilités. La définition mathématique de ton équation est un objet. Le moteur algorithmique qui fit cette équation sur tes données est un objet complètement séparé. Ça veut dire que tu peux définir tes maths une seule fois, puis les tester avec plusieurs algorithmes de fitting différents, simplement en passant le modèle à un autre fitter. Astropy propose des dizaines de modèles mathématiques prédéfinis. Si tu modélises une tendance stable, tu utilises un modèle Linear1D. Si tu étudies une ligne d'émission dans un spectre, tu pars sur un modèle Gaussian1D. Ces objets modèles encapsulent leurs paramètres, comme l'amplitude, la moyenne et l'écart-type. Avant de regarder le processus de fitting, on doit aborder une source fréquente de confusion. Dans Astropy, les modèles sont des objets callable. Tu passes un array de coordonnées directement à un modèle instancié, et il évalue les maths pour renvoyer les valeurs correspondantes. Le plus important, c'est que quand tu optimises un modèle, le fitter ne mute pas ton objet de départ. Il renvoie toujours une toute nouvelle instance du modèle fitté. Ton estimation de départ est préservée exactement comme tu l'as définie. Imagine un scénario où tu as des données bruitées dans un array en une dimension qui représente une caractéristique spectrale. D'abord, tu initialises un modèle Gaussian1D avec tes estimations initiales approximatives pour l'amplitude, la moyenne et la largeur. Comme Astropy sépare les maths de l'optimizer, tu attaches tes contraintes physiques directement aux paramètres du modèle. Supposons que tu connaisses déjà la coordonnée centrale exacte de cette ligne spectrale. Tu accèdes au paramètre mean sur ton modèle et tu définis sa propriété fixed sur true. L'algorithme d'optimisation va maintenant laisser cette valeur tranquille. Tu peux aussi établir des limites mathématiques. En fixant une limite minimum de zéro sur le paramètre amplitude, tu forces l'algorithme à rejeter toute solution qui donne un pic négatif. Une fois ton modèle de départ entièrement contraint, tu fais intervenir le fitter. Pour les équations non linéaires comme une gaussienne, tu instancies le fitter des moindres carrés de Levenberg-Marquardt, connu dans Astropy sous le nom de LevMarLSQFitter. Tu exécutes le fit en appelant cet objet fitter, en lui passant ton modèle gaussien initial ainsi que tes arrays de données horizontales et verticales. L'algorithme tourne et sort un tout nouveau modèle Gaussian1D qui contient les valeurs optimisées des paramètres. Comme ce nouveau modèle est directement callable, il te suffit de lui passer ton array horizontal d'origine pour générer une courbe mathématique lisse que tu peux tracer par-dessus tes données bruitées. Voici l'idée clé. En stockant les contraintes sur le modèle plutôt que de les passer au solver, les algorithmes de fitting restent génériques. Tu concentres tes efforts pour encoder la réalité physique de ton problème dans le modèle mathématique, ce qui permet à Astropy de remplacer la logique d'optimisation en arrière-plan sans casser ton pipeline. C'est tout pour cet épisode. Merci d'avoir écouté, et continue à créer !
13

Modèles composés et ajustements personnalisés

3m 47s

Élargissez votre boîte à outils de modélisation en combinant plusieurs modèles mathématiques et en définissant vos propres algorithmes d'ajustement personnalisés ainsi que des modèles sensibles aux unités.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Astropy : Python pour l'astronomie, épisode 13 sur 15. Au lieu d'écrire à la main une énorme fonction mathématique à quinze paramètres pour fitter un spectre un peu brouillon, et si tu pouvais juste assembler des formes basiques comme des briques Lego et laisser Python gérer les calculs ? C'est exactement ce qu'on va voir aujourd'hui avec les Compound Models et les Custom Fits. Dans Astropy, tu as rarement besoin de construire des models analytiques complexes from scratch. Tu prends des blocs simples et prédéfinis et tu les combines en utilisant les opérateurs arithmétiques standard de Python, comme l'addition, la soustraction, la multiplication ou la division. Quand tu additionnes deux models Astropy, tu n'obtiens pas un array statique de nombres évalués. Tu obtiens un tout nouvel objet model entièrement fonctionnel. Cette structure compound sait s'évaluer elle-même, calculer ses dérivées et tracker chaque paramètre des models de base d'origine. Prenons un scénario spécifique. Tu as un spectre qui contient deux raies d'émission distinctes posées sur un continuum de fond plat. Tu veux fitter toute cette structure en même temps. Tu commences par instancier un model polynomial basique pour te servir de baseline plate. Ensuite, tu instancies deux models gaussiens en une dimension séparés pour représenter les deux raies d'émission. Pour créer ton profil spectral final, tu définis simplement une nouvelle variable égale au polynôme plus la première gaussienne plus la deuxième gaussienne. Astropy les fusionne automatiquement en un seul arbre d'évaluation compound. Ça introduit un piège classique concernant l'accès aux paramètres. Quand tu crées ce compound model, tu pourrais te demander comment isoler l'amplitude de la deuxième raie d'émission. Vu que ce sont toutes les deux des gaussiennes, elles ont toutes les deux un paramètre nommé amplitude. Astropy résout cette collision en ajoutant automatiquement des suffixes numériques basés sur l'ordre dans lequel les models ont été combinés. La première gaussienne voit ses paramètres renommés en amplitude zéro, mean zéro et standard deviation zéro. La deuxième gaussienne récupère amplitude un, mean un, et ainsi de suite. Si jamais tu perds le fil de quel paramètre appartient à quel composant, tu peux inspecter l'attribut parameter names de ton compound model pour voir la liste exacte qui a été générée. Maintenant, le deuxième point, c'est le fit de données qui portent des unités physiques. Les mesures astronomiques ne sont pas juste des floats bruts. Ta variable indépendante peut être la longueur d'onde en angströms, et ta variable dépendante peut être la densité de flux en janskys. Les models Astropy gèrent ça élégamment grâce à l'objet Quantity. Quand tu passes tes arrays de données dans un fitter, tu passes directement les objets Quantity d'Astropy, sans enlever les unités. Le fitter analyse les unités de tes données d'entrée et la structure de ton compound model. Il détecte les erreurs de dimension avant même que le fit ne commence. Une fois que le fit converge, les paramètres sur le model résultant contiendront automatiquement les bonnes unités physiques. Tes means gaussiens se mettent à jour en angströms, et tes amplitudes se mettent à jour en janskys. Tu n'as pas besoin d'écrire une logique de conversion custom ou de retirer les unités avant le fit pour les rattacher plus tard. Le compound model impose une cohérence dimensionnelle tout au long du processus. Voici le point clé. Quand tu utilises un signe plus entre deux models, tu n'es pas juste en train de chaîner des fonctions. Tu construis une seule équation unifiée qui maintient une stricte conscience des unités et une traçabilité des paramètres, depuis les données brutes jusqu'au fit final. C'est tout pour aujourd'hui. À la prochaine !
14

Analyse de séries temporelles : À la chasse aux exoplanètes

4m 44s

Analysez des données périodiques à l'aide du module astropy.timeseries. Nous vous guidons à travers le repliement des courbes de lumière et la découverte de périodes avec l'algorithme Box Least Squares.

Télécharger
Salut, ici Alex de DEV STORIES DOT EU. Astropy : Python pour l'astronomie, épisode 14 sur 15. Tu as quatorze mille photos d'une étoile, prises au télescope à intervalles irréguliers. Quelque part dans ce bruit, il y a une baisse de luminosité de 0,01 % causée par le passage d'une exoplanète devant elle. Voici l'algorithme exact pour la trouver. Cet épisode parle de Time Series Analysis et de la chasse aux exoplanètes. Astropy gère ce workflow grâce à la classe TimeSeries. Avant d'aller plus loin, mettons les choses au clair sur une idée reçue. Une TimeSeries n'est pas une structure de données complètement nouvelle avec ses propres règles. C'est simplement une sous-classe de QTable. Ça veut dire que toutes les méthodes de manipulation de table, les opérations sur les colonnes et les techniques de masking que tu connais déjà fonctionnent toujours parfaitement. La seule différence, c'est que la première colonne est strictement imposée comme un objet Time d'Astropy. Cette rigueur garantit que tes timestamps et tes mesures de flux restent parfaitement alignés, que tes observations soient espacées régulièrement ou totalement aléatoires. Pour commencer à chasser une exoplanète, tu dois d'abord charger une courbe de lumière. Astropy intègre des readers qui te permettent de passer directement un fichier FITS Kepler à la fonction read de TimeSeries. Il configure automatiquement la colonne Time et récupère les mesures de lumière, qu'on appelle généralement le flux. Les données Kepler sont extrêmement denses, et contiennent parfois des milliers de data points sur plusieurs mois. Ces données brutes contiennent souvent du bruit haute fréquence qui vient du vaisseau spatial ou de l'activité stellaire. Tu peux lisser tout ça en utilisant le downsampling via une agrégation. Tu définis une taille de time bin, comme dix minutes, et tu passes une fonction d'agrégation comme la moyenne. Astropy regroupe les timestamps dans ces bins et fait la moyenne du flux, ce qui réduit la taille du dataset et supprime le bruit aléatoire sans effacer le vrai signal du transit. Maintenant tu as des données propres, mais les transits de l'exoplanète sont cachés quelque part sur une timeline massive. Pour trouver la planète, tu as besoin d'un périodogramme. Tu connais peut-être le périodogramme de Lomb-Scargle, qui est excellent pour trouver des ondes sinusoïdales continues et lisses, comme la lumière d'une étoile pulsante. Mais une planète qui passe devant une étoile ne crée pas une onde sinusoïdale. Elle crée une ligne plate, une chute soudaine, un fond plat, et une remontée soudaine. Le signal est une box. À cause de cette forme, tu utilises le périodogramme Box Least Squares, ou BLS. Tu passes ta colonne Time et ta colonne de flux dans la fonction BLS. L'algorithme évalue ensuite une grille entière de périodes orbitales possibles, en testant peut-être tout, d'une orbite d'un jour à une orbite de cinquante jours. À chaque fréquence testée, il fait glisser une box mathématique sur les données, en essayant de faire correspondre la profondeur et la durée d'un potentiel transit planétaire. Il renvoie un spectre de puissance qui montre à quel point le fit de la box était bon à chaque fréquence. Tu extrais simplement la période qui a généré le plus haut pic de puissance. C'est l'orbite suspectée de ton exoplanète. Une fois que tu as cette période exacte, tu dois la vérifier visuellement. Tu prends ta TimeSeries d'origine et tu appelles la méthode fold, en lui passant la période que tu viens de découvrir. Le folding prend chaque observation sur des mois ou des années et la mappe sur un seul cycle orbital. Au lieu d'une timeline chronologique, ton axe horizontal devient la phase, allant de zéro à un. À chaque fois que la planète a transité devant l'étoile au cours de la mission, ces data points individuels sont empilés les uns sur les autres exactement à la même phase. C'est la partie qui compte. Quand tu plot cette TimeSeries folded, la dispersion aléatoire de la timeline disparaît, et une baisse en forme de U, nette et indéniable, apparaît précisément au centre de ton graphique. Tu viens d'utiliser la géométrie et le temps pour sortir un monde invisible du bruit. Merci d'avoir passé quelques minutes avec moi. À la prochaine, prends soin de toi.
15

Calculs cosmologiques : Mesurer l'Univers

3m 35s

Effectuez des calculs complexes à l'échelle de l'univers à l'aide du module astropy.cosmology. Calculez les temps de regard vers le passé, les distances de luminosité et trouvez les décalages vers le rouge (redshifts) en fonction de l'âge.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Astropy : Python pour l'astronomie, épisode 15 sur 15. Résoudre la métrique de l'univers en expansion nécessite généralement d'évaluer à la main d'énormes intégrales elliptiques. Ou alors, tu peux juste importer un seul module et laisser Python faire les calculs. Aujourd'hui, on regarde les calculs cosmologiques : dimensionner l'Univers. Le subpackage cosmology d'Astropy encapsule la relativité générale et la métrique de Friedmann-Lemaître-Robertson-Walker dans des function calls super simples. Au lieu d'écrire tes propres intégrateurs pour mapper le redshift à la distance physique, tu définis un modèle cosmologique, et la library gère la géométrie sous-jacente. Une cosmologie dans Astropy, c'est un objet Python. Tu peux en construire une from scratch en utilisant la class FlatLambdaCDM. Tu lui passes une constante de Hubble, comme 70, et une densité de matière initiale, comme 0,3. Ça te donne un univers spatialement plat, piloté par l'énergie noire et la matière noire froide. Cependant, tu as rarement besoin de taper ces paramètres toi-même. Astropy inclut des réalisations built-in standards dérivées des grands relevés. Tu importes simplement Planck13 ou WMAP9 depuis le module cosmology, et tu as instantanément un modèle entièrement configuré, prêt à être évalué. Voici le point clé concernant le state. Les paramètres d'un objet cosmology Astropy sont strictement immutables. Si tu initialises un modèle et que tu décides ensuite de modifier la densité de matière, tu ne peux pas mettre à jour cet attribute in place. Faire ça lève une erreur. À la place, tu appelles la method clone sur ton modèle existant, en passant la nouvelle valeur du paramètre comme argument. Ça retourne une toute nouvelle instance de cosmology avec tes valeurs mises à jour. Prends un scénario concret en utilisant le modèle built-in Planck13. Supposons que tu observes une galaxie à un redshift de deux. Tu veux connaître son lookback time, c'est-à-dire le nombre d'années que la lumière a mis pour atteindre ton télescope. Tu prends ton objet Planck13, tu appelles sa method lookback time, et tu lui passes le chiffre deux. La method retourne une quantité de temps en giga-années. Tu utilises exactement le même pattern pour calculer la luminosity distance. Tu appelles la method luminosity distance avec ton redshift, et Astropy retourne la distance en mégaparsecs, en prenant en compte l'expansion de l'univers. Ça couvre les inputs et les outputs, mais qu'en est-il de l'inverse ? Parfois, tu as une mesure physique et tu dois trouver le redshift correspondant. Disons que tu veux connaître le redshift exact auquel l'univers avait exactement deux milliards d'années. Tu ne peux pas simplement passer un âge aux methods standards. À la place, tu importes une function appelée z at value. Tu lui passes la method que tu veux inverser, qui est la method age de ton modèle Planck13, et tu lui passes la valeur cible de deux giga-années. Astropy exécute une routine numérique de root-finding en arrière-plan et retourne le redshift précis. La conversion entre le redshift et le temps ou la distance physique est la colonne vertébrale de l'astronomie extragalactique, et ce module te donne une source of truth testée pour que tu puisses te concentrer sur la data au lieu de debugger des intégrales. Comme c'est le dernier épisode de notre série Astropy, je t'encourage à lire la documentation officielle, à tester ces tools hands-on, ou à visiter dev stories dot e u pour suggérer des sujets pour notre prochaine série. Merci d'avoir passé quelques minutes avec moi. À la prochaine, prends soin de toi.