Etape 3: Les bases avec pandas
présenter les données, calculer sur des colonnes
Pandas va permettre de lire et de modifier des tableaux (DataFrames). Chaque colonne de ton DataFrame sera appelée « descripteur ». La manipulation d’un dataframe peut ressembler à celle d’une base de données (voir SQL).
Exemple: La table suivante est issu de l’import d’une base de données d’exoplanètes:

Cette table fera l’objet d’une étude spécifique: ici
Présenter les résultats: CSV => Dataframe
Importer les données depuis un fichier csv
- Les courbes de transit vont permettre de mesurer les valeurs de profondeur de transit δ et de durée de transit τ.
- Ces valeurs seront reportées dans un fichier csv avec les autres informations sur les planètes et leur étoile. Utiliser un tableur. Attention à bien utiliser des points comme séparateur décimal.

tableau rempli à l'aide d'un tableur
- Exporter (ou enregistrer) en format csv.
On peut vérifier en ouvrant le fichier csv que les données sont mises dans un format particulier (séparation à l’aide d’un point virgule…)

fichier csv
- L’import depuis pandas se fait alors de la manière suivante: (rien de plus simple)
df = pd.read_csv('exoplanetes.csv',sep=';')
df

Ajouter les colonnes utiles aux calculs
un dataframe se comporte comme un dictionnaire dont les clefs sont les noms des colonnes et les valeurs sont des séries:
G = 6.67e-11
R_Jup = 71e6
M_Jup = 6.9911e7
df['tau']=(df['fin_transit']-df['debut_transit'])*24*3600
df['delta']=1-df['lum_min']
df['M_star']=7.158780e+29 # pour TOI-270
df['R_star']=257512600.0 # pour TOI-270
df['R_p']= np.sqrt(df['delta']) * df['R_star']
df['radius']=df['R_p']/R_Jup # pour exprimer en R_Jup
# vitesse planete : V_p = 2*R_star/tau
df['V_p']= 2*df['R_star']/df['tau']
# rayon orbital : r = G*M_star/V_p**2
df['r_orb']= G * df['M_star']/df['V_p']**2
# periode revolution: T = 2*np.pi*r/V_p
df['T'] = 2*np.pi*df['r_orb']/df['V_p'] # en s
df['T_jours'] = df['T']/(24*3600) # en jours terrestres
df

Autres méthodes (compléments)
Importer les données d’une liste ou d’un dictionnaire python
Les données relatives à la planète peuvent être mises dans une liste dont l’ordre pourrait être par exemple:
'planete','etoile','M_star','R_star','delta','tau','date_debut_transit'
Par exemple, ci-dessous, dans la liste planete1
: (la date de debut de transit est sous forme annee,mois,jour,heure)
planete1 = ['TOI 270-01','TOI 270',Msol*0.36,Rsol * 0.37,0.0044,4600,(2024,6,23,5)]
df1 = pd.DataFrame([planete1],columns=['planete','etoile','M_star','R_star','delta','tau','date_debut_transit'])
df

Les calculs se font en créant une nouvelle colonne dans le dataframe. Par exemple, pour le calcul du rayon de la planète (en fonction de delta
):
df1['R_p']= np.sqrt(df1['delta']) * df1['R_star']
df1

On peut créer également un Dataframe à l’aide d’un dictionnaire: (remplacer les valeurs None
par celles de la planète)
planete2 = {
'planete':'TOI 270-02',
'etoile':'TOI 270',
'M_star':None,
'R_star':None,
'delta':None,
'tau':None,
'date_debut_transit':None
}
df2 = pd.DataFrame([planete2])
df2

Remarque: On peut ajouter plusieurs planètes dans la liste, avec par exemple: pd.DataFrame([planete1,planete2,...])
On peut alors ajouter les 2 Dataframes dans un nouveau tableau. Il s’agit d’une opération de concaténation:
pd.concat([df1,df2],ignore_index = True)

Remarques:
- le premier paramètre de la fonction doit être un itérable: toujours mettre la ligne entre
[]
- Les tableaux concaténés peuvent avoir des nombres de colonnes différents. La valeur placée dans le tableau est alors
NaN
. Cette valeur peut être modifiée par la suite. - le paramètre
ignore_index = True
permet de recréer une numérotation de l’index et eviter les doublons. Dans l’exemple proposé ici, cela permet d’eviter d’avoir 2 lignes avec l’index 0.
fusionner des tableaux aux etiquettes différentes
Les tableaux doivent avoir les mêmes etiquettes de colonne si on veut ajouter leur ligne l’une sous l’autre. Dans le cas contraire, il faudra renommer les colonnes.
utile après l’import d’une base de données/sql
D = {
'planete':'TOI 270-01',
'etoile': 'TOI 270'
}
df_new_line = pd.DataFrame.from_dict([D])
df_new_line

df_new_line_2 = pd.DataFrame([{'_name':'TOI 270-02','star_name':'TOI 270'}])
df_new_line_2

df_new_line_2 = df_new_line_2.rename(columns={'_name': 'planete','star_name':'etoile'})
df_new_line_2

df = pd.concat([df_new_line,df_new_line_2],ignore_index=True)
df

Langage de requête
Projection (SELECT en sql): reduire le nombre de colonnes (equivalent de select
en sql)
df[['_name','mass']]
df

Selection selon un critère (WHERE =,>, … en sql): lignes (équivalent de where
en sql)
df[df['mass']>=1]

Selection à partir d’une liste de noms, comme en SQL: WHERE .. IN ( valeur1, valeur2, … )
names = ['TOI-270 d','TOI-270 b','TOI-270 c']
df_p = df[df['_name'].isin(names)]
Recherche d’un motif, equiv SQL de LIKE ‘motif%':
# Equivalent de LIKE en SQL
df[df['_name'].str.startswith('TOI-270')]

Trier le dataframe selon une colonne, par ordre decroissant, equiv SQL de ORDER BY … DESC
df.sort_values('mass', ascending=False, inplace=True, ignore_index=True)

base de données d’exoplanetes et python
- Lien vers l’étape 4
- RETOUR vers l’accueil