<jupyter_start><jupyter_text>Récupération des données<jupyter_code>!curl -O https://www.robots.ox.ac.uk/~vgg/data/fgvc-aircraft/archives/fgvc-aircraft-2013b.tar.gz
!tar zxf fgvc-aircraft-2013b.tar.gz
!mv fgvc-aircraft-2013b dataset<jupyter_output>% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 2625M  100 2625M    0     0  7742k      0  0:05:47  0:05:47 --:--:-- 11.7M<jupyter_text>Traitement des données Un fichier nous donne la variable y (le constructeur) et un autre fichier nous donnes les x (les images). Il nous faut un lien vers les deux fichiers pour construire notre modèle. Problème de classification mutliclasse avec un grand nombre de classes (30 à 70 classes)<jupyter_code>import pathlib
#permet de gérer proprement les chemins d'accès

import pandas as pd
#création d'une variable de base 
#on écrit les variables en majuscules parce que pep 8 (convention de style pour coder en Python)
#pep : propositions d'amélioration de python
#pep 8 : une des recommandation est d'écrire les constantes du modèle en majuscule (initialisée au début mais pas modifiée par la suite)

#ici on indique le chemin où se trouvent les données/chemin d'accès aux données via DATA_DIR
DATA_DIR=pathlib.Path('dataset/data')
pd.read_csv(DATA_DIR / 'images_manufacturer_train.txt', sep=' ', names=['image_id','manufacturer'], usecols=['image_id','manufacturer'])
#le / fonctionne depuis n'importe quel système d'exploitation et concatène correctement le chemin d'accès
#séparateur = espace
#Attention, les noms composés sont aussi séparés par un espace.
#Pour compenser, on indique que le csv n'a que 2 colonnes et non 3 à l'aide de names
#usecols pour la version 1.4 
#Commenter le code pour bien comprendre comment il fonctionne et faciliter le travail sur le code dans la durée
#L'id a enlevé les zero non significatifs alors que les fichiers ont les zéros devant, on va donc forcer Pandas a lire ces zéros en chaîne de caractère à l'aide de dtype
#les id sont maintenant des chaînes de caractère (on fait pareil pour les codes postaux)
pd.read_csv(DATA_DIR / 'images_manufacturer_train.txt', sep=' ', 
            names=['image_id','manufacturer'], 
            usecols=['image_id','manufacturer'], 
            dtype={'image_id':str},
            )
manufacturer_df=pd.read_csv(DATA_DIR / 'images_manufacturer_train.txt', sep=' ', 
            names=['image_id','manufacturer'], 
            usecols=['image_id','manufacturer'], 
            dtype={'image_id':str},
            )
#bien vérifier les fichiers quand on les lit pour éviter les bugs à la fin
manufacturer_df['manufacturer'].value_counts(dropna=False)
#le dropna=False compte les valeurs manquantes
#Il n'y a pas de valeur manquante puisque na n'apparaît pas
manufacturer_df.isna().sum()
#Garantie qu'il n'y a pas de valeur manquante, s'il y en a le zéro est remplacé par 1
assert manufacturer_df['image_id'].isna().sum()==0, 'Valeur manquante dans image_id'
#Si c'est égal à zéro le assert va fonctionner, sinon il affiche "valeur manquante dans image_id"
#on peut faire plusieurs assert, si il ne se passe rien ça passe à l'étape d'après sinon il s'arrête
manufacturer_df['manufacturer']=<jupyter_output><empty_output><jupyter_text>Aurait pu marcher mais non<jupyter_code>manufacturer_df=pd.read_csv(DATA_DIR / 'images_manufacturer_train.txt', sep=' ', 
            names=['image_id','m1','m2'], 
            usecols=['image_id','m1','m2'], 
            dtype={'image_id':str},
            )
manufacturer_df['manufacturer']=manufacturer_df['m1']+' '+manufacturer_df['m2']
manufacturer_df['manufacturer'].unique()

#PAS LA BONNE METHODE<jupyter_output><empty_output><jupyter_text>Méthode la plus astucieuse et qui fonctionne<jupyter_code>manufacturer_df=pd.read_csv(DATA_DIR/ 'images_manufacturer_train.txt', sep='\t',
                            names=['all'],
                            dtype={'all':str},
                            )
manufacturer_df['image_id']=manufacturer_df['all'].apply(lambda x: x.split(' ')[0])
#la fonction split() découpe une chaîne de caractère

manufacturer_df['manufacturer']=manufacturer_df['all'].apply(lambda x: ' '.join(x.split(' ')[1:]))
#la fonction '<car>'.join(liste) concatène les éléments de liste en utilisant le séparateur <car>. (<car> pour caractère)
manufacturer_df
manufacturer_df['manufacturer'].unique()
! grep ',' dataset/data/images_manufacturer_train.txt
! grep 'T' dataset/data/images_manufacturer_train.txt | head -3
#recherche le caractère T das le fichier et n'affiche que 3 lignes
! grep 'T' dataset/data/images_manufacturer_train.txt | wc -l
#wc: commpte le nombre d'éléments (-l: lignes, -c: caractères, -w: word)
! grep 'T' dataset/data/images_manufacturer_train.txt | wc
#Compte T dans les lignes, les caractères et les mots 
#Délimiteur, peut nous sauver en cas de fichier volumineux
#data science at the command line
!cut -f 1 -d ' ' dataset/data/images_manufacturer_train.txt | head<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1026148969889065, 'fraction_numerical': 0.01366877971473851, 'mean_word_length': 4.2924528301886795, 'pattern_counts': {'":': 0, '<': 19, '<?xml version=': 0, '>': 19, 'https://': 1, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '338739', 'license': 'MIT', 'n_tokens_mistral': 1780, 'n_tokens_neox': 1705, 'n_words': 517, 'path': 'train_classification_model.ipynb', 'repo_name': 'LaurePavard/plane-classification', 'size': '5048'}