Le livre "Python. Cours express. 3e éd.

image Salut, habrozhiteli! Ce livre est destiné aux personnes qui ont déjà une expérience dans un ou plusieurs langages de programmation et qui souhaitent apprendre rapidement et facilement les bases de Python 3. On suppose que le lecteur est déjà familier avec les structures de contrôle, la POO, la gestion des fichiers, la gestion des exceptions, etc. e. Le livre sera également utile pour les utilisateurs de versions antérieures de Python qui ont besoin d'une référence compacte Python 3.1.

Nous vous invitons à lire l'extrait "Traitement des fichiers de données"

Comment utiliser un livre


La partie 1 fournit des informations générales sur Python. Vous apprendrez comment télécharger et installer Python sur votre système. Il fournit également un aperçu général du langage, qui sera principalement utile aux programmeurs expérimentés qui souhaitent une compréhension de haut niveau de Python.

La partie 2 contient le matériel principal du livre. Il discute des ingrédients nécessaires pour acquérir des compétences pratiques dans l'utilisation de Python comme langage de programmation à usage général. Le matériel des chapitres a été planifié pour que les lecteurs qui commencent tout juste à apprendre le Python puissent avancer de manière séquentielle, maîtrisant les points clés du langage. Cette partie contient également des sections plus complexes, de sorte que vous pouvez ensuite retourner et trouver toutes les informations nécessaires sur un certain design ou sujet en un seul endroit.

La partie 3 présente les fonctionnalités avancées des éléments du langage Python qui ne sont pas absolument nécessaires, mais seront certainement utiles pour tout programmeur Python sérieux.

La partie 4 se concentre sur des sujets spécialisés qui dépassent la simple syntaxe du langage. Vous pouvez lire ces chapitres ou les sauter en fonction de vos besoins.

Les programmeurs novices Python sont encouragés à commencer par le chapitre 3 pour avoir une impression générale, puis à passer aux chapitres d'intérêt de la partie 2. Présentez des exemples interactifs pour instancier des concepts. Vous pouvez également aller au-delà des exemples donnés dans le texte et chercher des réponses à toutes les questions qui ne sont pas claires. Cette approche augmentera la vitesse d'apprentissage et approfondira la compréhension. Si vous n'êtes pas déjà familier avec la POO ou si cela n'est pas requis pour votre application, vous pouvez ignorer la plupart du chapitre 15.

Les lecteurs déjà familiarisés avec Python devraient également commencer par le chapitre 3. Il fournit une bonne présentation générale et une description des différences entre Python 3 et les versions plus familières. Il peut également être utilisé pour évaluer si vous êtes prêt à passer aux chapitres plus complexes des parties 3 et 4 de ce livre.

Peut-être que certains lecteurs qui ne sont pas expérimentés avec Python mais qui ont une expérience suffisante dans d'autres langages de programmation pourront obtenir la plupart des informations nécessaires en lisant le chapitre 3 et en consultant les modules de bibliothèque standard Python (chapitre 19) et le manuel de référence de la bibliothèque Python dans la documentation Python. .

Extrait. Traitement des fichiers de données


La plupart des données sont distribuées dans des fichiers texte. Il peut s'agir de texte non structuré (par exemple, une collection de messages ou une collection de textes littéraires), ou de données plus structurées, dans lesquelles chaque ligne est un enregistrement, et les champs sont séparés par un caractère de séparation spécial - une virgule, un caractère de tabulation ou une barre verticale (|). Les fichiers texte peuvent être énormes; un ensemble de données peut occuper des dizaines, voire des centaines de fichiers, et les données qu'il contient peuvent être incomplètes ou déformées. Avec une telle variété, vous rencontrerez presque inévitablement la tâche de lire et d'utiliser les données des fichiers texte. Ce chapitre présente les stratégies de base pour résoudre ce problème en Python.

21.1. Présentation d'ETL


La nécessité d'extraire les données des fichiers, de les analyser, de les convertir dans un format pratique, puis de faire quelque chose est apparue presque simultanément avec les fichiers de données. De plus, il existe même un terme standard pour ce processus: ETL (Extract-Transform-Load, c'est-à-dire «extraction - transformation - chargement»). La récupération fait référence au processus de lecture d'une source de données et d'analyse si nécessaire. La conversion peut impliquer le nettoyage et la normalisation des données, ainsi que la combinaison, le fractionnement et la réorganisation des enregistrements qu'ils contiennent. Enfin, le chargement signifie enregistrer les données converties dans un nouvel emplacement (dans un autre fichier ou base de données). Ce chapitre présente les bases de l'implémentation d'un ETL en Python, des fichiers de données texte au stockage des données converties dans d'autres fichiers. Des fichiers de données plus structurés sont abordés au chapitre 22, et le stockage des informations dans une base de données est abordé au chapitre 23.

21.2. Lecture de fichiers texte


Le premier composant de l'ETL - extraction - consiste à ouvrir un fichier et à lire son contenu. À première vue, cela semble simple, mais même ici, des problèmes peuvent survenir - par exemple, la taille du fichier. Si le fichier est trop volumineux pour tenir en mémoire, le code doit être structuré de sorte qu'il fonctionne avec des segments plus petits du fichier (éventuellement une ligne).

21.2.1. Encodage de texte: ASCII, Unicode et autres


Un autre problème possible est le codage. Ce chapitre est consacré à l'utilisation de fichiers texte et, en fait, une grande partie des données transmises dans le monde réel est stockée dans des fichiers texte. Cependant, la nature exacte du texte peut varier en fonction de l'application, de l'utilisateur et, bien sûr, du pays.

Parfois, le texte contient des informations en codage ASCII, y compris 128 caractères, dont seulement 95 sont classés comme imprimables. Heureusement, le codage ASCII est le «multiple le moins commun» de la plupart des situations de transfert de données. D'autre part, il ne peut pas faire face à la complexité des nombreux alphabets et systèmes d'écriture qui existent dans le monde. La lecture de fichiers au codage ASCII entraînera presque certainement le fait que lors de la lecture de caractères non pris en charge, que ce soit l'allemand ü, le portugais ç ou presque n'importe quel caractère d'une langue autre que l'anglais, des problèmes vont commencer et des erreurs apparaîtront.

Ces erreurs se produisent car ASCII utilise des valeurs 7 bits, tandis que les octets d'un fichier typique sont constitués de 8 bits, ce qui permet de représenter 256 valeurs possibles au lieu de 128 pour les valeurs 7 bits. Ces codes supplémentaires sont généralement utilisés pour stocker des valeurs supplémentaires - des signes de ponctuation étendus (tels que des tirets moyens et courts) à divers caractères (marque déposée, signe de copyright et signe de degré) et des versions de caractères alphabétiques avec des signes diacritiques. Il y avait toujours un problème: lors de la lecture d'un fichier texte, vous pouviez rencontrer un caractère qui dépassait la plage ASCII de 128 caractères, et vous ne pouviez pas être sûr du caractère codé. Supposons que vous tombiez sur un personnage avec le code 214. Qu'est-ce que c'est? Une marque de division, la lettre Ö ou autre chose? Sans le code source qui a créé ce fichier, il est impossible de le découvrir.

Unicode et UTF-8


Pour éliminer cette ambiguïté, vous pouvez utiliser Unicode. Le codage Unicode, appelé UTF-8, prend en charge les caractères ASCII de base sans aucune modification, mais il permet également un ensemble presque illimité d'autres caractères et caractères du standard Unicode. En raison de sa flexibilité, UTF-8 est utilisé dans plus de 85% des pages Web qui existaient au moment de la rédaction de ce document. Cela signifie que lors de la lecture de fichiers texte, il est préférable de se concentrer sur UTF-8. Si les fichiers ne contiennent que des caractères ASCII, ils seront lus correctement, mais vous bénéficiez également d'une assurance au cas où d'autres caractères seraient encodés en UTF-8. Heureusement, le type de données de chaîne Python 3 est conçu pour prendre en charge Unicode par défaut.

Même avec Unicode, des situations sont possibles lorsque des valeurs apparaissent dans le texte qui ne peuvent pas être décodées avec succès. La fonction ouverte en Python reçoit un paramètre d'erreurs supplémentaire, qui détermine comment gérer les erreurs de codage lors de la lecture ou de l'écriture de fichiers. La valeur par défaut est «stricte», avec laquelle une erreur est déclenchée chaque fois qu'une erreur de codage est détectée. Les autres valeurs utiles sont «ignorer» (ignorer le caractère à l'origine de l'erreur); 'replace' (un caractère est remplacé par un marqueur spécial - généralement?); 'backslashreplace' (le caractère est remplacé par la séquence d'échappement par \) et 'surrogateescape' (le caractère intrus est converti en un point de code Unicode privé lors de la lecture et revient à la séquence d'octets d'origine lors de l'écriture). Le choix de la méthode de traitement ou de résolution des erreurs de codage dépend de la situation spécifique.

Prenons un court exemple de fichier contenant un caractère UTF-8 non valide et voyez comment ce caractère est traité dans différents modes. Écrivez d'abord le fichier en utilisant les octets et le mode binaire:

>>> open('test.txt', 'wb').write(bytes([65, 66, 67, 255, 192,193])) 

À la suite de la commande, un fichier est créé à partir des caractères "ABC", suivis de trois caractères qui ne sont pas inclus dans ASCII, qui peuvent être affichés différemment selon la méthode de codage utilisée. Si vous utilisez vim pour afficher le fichier, le résultat ressemblera à ceci:

 ABCÿÀÁ ~ 


Lorsque le fichier est créé, essayez de le lire dans le mode de gestion d'erreur strict par défaut:

 >>> x = open('test.txt').read() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.6/codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte 


Le quatrième octet avec une valeur de 255 n'est pas un caractère UTF-8 valide à cette position, donc une exception se produit en mode «strict». Voyons maintenant comment les autres modes de gestion des erreurs gèrent le même fichier, sans oublier que les trois derniers caractères déclenchent une erreur:

image

Si vous voulez que les personnages problématiques disparaissent, utilisez le mode «ignorer». Le mode «remplacer» marque uniquement les positions des caractères non valides, tandis que d'autres modes tentent différemment de sauvegarder les caractères non valides sans interprétation.

21.2.2. Texte non structuré


Les fichiers texte non structurés sont lus le plus facilement, mais ils créent également le plus de problèmes avec l'extraction d'informations. Le traitement du texte non structuré peut varier considérablement en fonction de la nature du texte et de ce que vous allez en faire, de sorte que toute discussion détaillée sur le traitement de texte dépasse le cadre du livre. Cependant, un court exemple aidera à démontrer certains problèmes de base et à jeter les bases pour discuter de fichiers avec des données de texte structuré.

L'un des problèmes les plus simples consiste à choisir l'unité logique de base dans le fichier. Si vous utilisez une collection de milliers de messages Twitter, du texte Moby Dick ou une collection de nouvelles, vous devez en quelque sorte les décomposer en blocs. Dans le cas des tweets, chaque bloc peut être placé sur une seule ligne, et la lecture et le traitement de chaque ligne du fichier sont organisés simplement.

Dans le cas de Moby Dick et même de quelques nouvelles, le problème se complique. Bien sûr, le texte du roman et même le texte de l'actualité n'est généralement pas souhaitable à considérer comme une seule unité. Dans ce cas, vous devez décider des blocs dont vous avez besoin, puis développer une stratégie pour diviser le fichier en blocs. Vous préférerez peut-être traiter le texte paragraphe par paragraphe. Dans ce cas, vous devez déterminer comment la répartition du texte en paragraphes dans le fichier est organisée et écrire le code en conséquence. Si les paragraphes correspondent aux lignes d'un fichier texte, cela ne sera pas difficile. Cependant, souvent un paragraphe d'un fichier texte peut être composé de plusieurs lignes dans un fichier texte, et vous devrez travailler dur.

Considérons maintenant quelques exemples.

Appelez-moi Ismaël. Il y a quelques années - peu importe combien de temps précisément--
avoir peu ou pas d'argent dans mon sac, et rien de particulier
pour m'intéresser à terre, je pensais naviguer un peu
et voir la partie aqueuse du monde. C'est une façon que j'ai
de chasser la rate et de réguler la circulation.
Chaque fois que je me retrouve de plus en plus sombre à propos de la bouche;
chaque fois que c'est un mois de novembre humide et bruissant dans mon âme; chaque fois que je
me retrouver involontairement en pause devant les entrepôts de cercueils,
et élever l'arrière de chaque enterrement que je rencontre;
et surtout quand mes hypos prennent le dessus sur moi,
qu'il faut un principe moral fort pour m'empêcher de
entrer délibérément dans la rue et frapper méthodiquement
les chapeaux des gens - alors, je pense qu'il est grand temps de prendre la mer
dès que je peux. Ceci est mon substitut au pistolet et à la balle.
Avec un élan philosophique, Caton se jette sur son épée;
Je prends tranquillement le bateau. Il n'y a rien de surprenant là-dedans.
S'ils le savaient, presque tous les hommes de leur grade, quelque temps
ou autre, chérissent à peu près les mêmes sentiments envers
l'océan avec moi.

Il y a maintenant votre ville insulaire des Manhattoes, ceinturée de quais
comme les îles indiennes par les récifs coralliens - le commerce l'entoure de ses vagues.
À droite et à gauche, les rues vous emmènent au fil de l'eau. Son extrême centre-ville
est la batterie, où cette noble taupe est lavée par les vagues et refroidie
par des brises qui, quelques heures auparavant, étaient hors de vue des terres.
Regardez la foule des observateurs d'eau là-bas.

Dans cet exemple (avec le début du texte «Moby Dick»), les lignes sont plus ou moins coupées comme elles seraient paginées, et les paragraphes sont indiqués par une seule ligne vide. Si vous souhaitez traiter chaque paragraphe dans son ensemble, vous devez diviser le texte en lignes vides. Heureusement, cette tâche est facilement accomplie par la méthode split () des chaînes. Chaque nouvelle ligne du texte est représentée par la combinaison "\ n". Naturellement, la dernière ligne de texte de chaque paragraphe se termine par une nouvelle ligne, et si la ligne de texte suivante est vide, la deuxième nouvelle ligne la suit immédiatement:

image

L'analyse du texte en paragraphes est une étape très simple dans le traitement du texte non structuré. Vous devrez peut-être également effectuer une normalisation supplémentaire du texte avant de poursuivre le traitement. Supposons que vous souhaitiez calculer la fréquence d'occurrence de chaque mot dans un fichier texte. Si vous divisez simplement le fichier par omissions, vous obtiendrez une liste de mots dans le fichier, cependant, compter avec précision les occurrences ne sera pas si simple, car ceci, ceci, ceci. et cela, ne sera pas considéré comme le même mot. Pour que ce code fonctionne correctement, il est nécessaire de normaliser le texte en supprimant les signes de ponctuation et en convertissant tout le texte en un seul cas avant le traitement. Dans l'exemple de texte ci-dessus, le code de construction d'une liste normalisée de mots peut ressembler à ceci:

image

21.2.3. Fichiers délimités non structurés


Les fichiers non structurés sont lus très simplement, mais le manque de structure est également leur inconvénient. Il est souvent plus pratique de définir une structure pour un fichier afin de simplifier la sélection des valeurs individuelles. Dans la version la plus simple, le fichier est divisé en lignes et chaque ligne contient un élément d'information. Par exemple, il peut s'agir d'une liste de noms de fichiers à traiter, d'une liste de noms de personnes ou d'une série de relevés de température à partir d'un capteur distant. Dans de tels cas, l'analyse des données est organisée très simplement: vous lisez la ligne et, si nécessaire, la convertissez au type souhaité. C'est tout ce qu'il faut pour préparer le fichier à l'utilisation.

Cependant, la situation n'est pas si simple. Plus souvent, vous devez regrouper plusieurs éléments de données interconnectés et votre code doit les lire ensemble. En règle générale, pour cela, les données associées sont placées sur une seule ligne et séparées par un caractère spécial. Dans ce cas, lors de la lecture de chaque ligne du fichier, des caractères spéciaux sont utilisés pour diviser les données en champs et stocker les valeurs des champs dans des variables pour un traitement ultérieur.

Le fichier suivant contient des données de température dans un format délimité:

 State|Month Day, Year Code|Avg Daily Max Air Temperature (F)|Record Count for Daily Max Air Temp (F) Illinois|1979/01/01|17.48|994 Illinois|1979/01/02|4.64|994 Illinois|1979/01/03|11.05|994 Illinois|1979/01/04|9.51|994 Illinois|1979/05/15|68.42|994 Illinois|1979/05/16|70.29|994 Illinois|1979/05/17|75.34|994 Illinois|1979/05/18|79.13|994 Illinois|1979/05/19|74.94|994 

Les données du fichier sont séparées par un tube (|). Dans cet exemple, ils se composent de quatre champs: état, date d'observation, température maximale moyenne et nombre de stations fournissant des données. Les autres délimiteurs standard sont un caractère de tabulation et une virgule. Peut-être que la virgule est utilisée le plus souvent, mais le séparateur peut être n'importe quel caractère qui n'apparaîtra pas dans les valeurs (plus à ce sujet plus tard). Les données séparées par des virgules sont si courantes que ce format est souvent appelé CSV (valeurs séparées par des virgules, c'est-à-dire des données séparées par des virgules), et ce type de fichier est fourni avec l'extension .csv en tant qu'attribut de format.

Quel que soit le caractère utilisé comme délimiteur, si vous savez quel est le caractère, vous pouvez écrire votre propre code Python pour diviser la chaîne en champs et les renvoyer sous forme de liste. Dans le cas précédent, vous pouvez utiliser la méthode split () pour convertir la chaîne en une liste de valeurs:

 >>> line = "Illinois|1979/01/01|17.48|994" >>> print(line.split("|")) ['Illinois', '1979/01/01', '17.48', '994'] 

Cette technique est très facile à implémenter, mais toutes les valeurs sont stockées sous forme de chaîne, ce qui peut être gênant pour un traitement ultérieur.

21.2.4. Module CSV


Si vous devez souvent traiter des fichiers de données délimités, vous devriez regarder de plus près le module csv et ses capacités. Quand on m'a demandé de nommer mon module préféré à partir de la bibliothèque standard Python, j'ai appelé le module csv plus d'une fois - non pas parce qu'il a l'air spectaculaire (ce n'est pas le cas), mais parce qu'il m'a probablement fait gagner plus de temps et m'a sauvé de mes erreurs potentielles plus souvent que tout autre module.
Le module csv est l'exemple parfait de la philosophie «batterie incluse» de Python. Bien que vous puissiez parfaitement écrire votre propre code pour lire des fichiers délimités (de plus, ce n'est pas si difficile), il est beaucoup plus facile et plus fiable d'utiliser le module Python. Le module csv a été testé et optimisé, et il fournit un certain nombre de fonctionnalités que vous auriez du mal à implémenter vous-même, mais qui sont néanmoins assez pratiques et font gagner du temps.

Jetez un œil aux données précédentes et décidez comment vous les liriez avec le module csv. Le code d'analyse de données doit lire chaque ligne et supprimer le caractère de fin de ligne, puis diviser la ligne par caractères | et ajoutez la liste de valeurs à la liste générale des chaînes. La solution pourrait ressembler à ceci:

 >>> results = [] >>> for line in open("temp_data_pipes_00a.txt"): ... fields = line.strip().split("|") ... results.append(fields) ... >>> results [['State', 'Month Day, Year Code', 'Avg Daily Max Air Temperature (F)', 'Record Count for Daily Max Air Temp (F)'], ['Illinois', '1979/01/01', '17.48', '994'], ['Illinois', '1979/01/02', '4.64', '994'], ['Illinois', '1979/01/03', '11.05', '994'], ['Illinois', '1979/01/04', '9.51', '994'], ['Illinois', '1979/05/15', '68.42', '994'], ['Illinois', '1979/ 05/16', '70.29', '994'], ['Illinois', '1979/05/17', '75.34', '994'], ['Illinois', '1979/05/18', '79.13', '994'], ['Illinois', '1979/05/19', '74.94', '994']] 

Si vous voulez faire de même avec le module csv, le code pourrait ressembler à ceci:

 >>> import csv >>> results = [fields for fields in csv.reader(open("temp_data_pipes_00a.txt", newline=''), delimiter="|")] >>> results [['State', 'Month Day, Year Code', 'Avg Daily Max Air Temperature (F)', 'Record Count for Daily Max Air Temp (F)'], ['Illinois', '1979/01/01', '17.48', '994'], ['Illinois', '1979/01/02', '4.64', '994'], ['Illinois', '1979/01/03', '11.05', '994'], ['Illinois', '1979/01/04', '9.51', '994'], ['Illinois', '1979/05/15', '68.42', '994'], ['Illinois', '1979/ 05/16', '70.29', '994'], ['Illinois', '1979/05/17', '75.34', '994'], ['Illinois', '1979/05/18', '79.13', '994'], ['Illinois', '1979/05/19', '74.94', '994']] 

Dans ce cas simple, le gain par rapport à l'implémentation indépendante de la solution n'est pas si grand. Néanmoins, le code s'est avéré être deux lignes plus court et un peu plus clair, et vous n'avez pas à vous soucier de tronquer les caractères de nouvelle ligne. Le véritable avantage vient lorsque vous faites face à des cas plus complexes.

Les données de cet exemple sont réelles, mais en réalité elles ont été simplifiées et effacées. Les données réelles de la source seront plus complexes. Les données réelles contiennent plus de champs, certains champs seront placés entre guillemets, d'autres non et le premier champ peut être vide. L'original est séparé par des tabulations, mais à des fins de démonstration, je les cite séparées par des virgules:

 "Notes","State","State Code","Month Day, Year","Month Day, Year Code",Avg Daily Max Air Temperature (F),Record Count for Daily Max Air Temp (F),Min Temp for Daily Max Air Temp (F),Max Temp for Daily Max Air Temp (F),Avg Daily Max Heat Index (F),Record Count for Daily Max Heat Index (F),Min for Daily Max Heat Index (F),Max for Daily Max Heat Index (F),Daily Max Heat Index (F) % Coverage ,"Illinois","17","Jan 01, 1979","1979/01/ 01",17.48,994,6.00,30.50,Missing,0,Missing,Missing,0.00% ,"Illinois","17","Jan 02, 1979","1979/01/02",4.64,994,- 6.40,15.80,Missing,0,Missing,Missing,0.00% ,"Illinois","17","Jan 03, 1979","1979/01/03",11.05,994,- 0.70,24.70,Missing,0,Missing,Missing,0.00% ,"Illinois","17","Jan 04, 1979","1979/01/ 04",9.51,994,0.20,27.60,Missing,0,Missing,Missing,0.00% ,"Illinois","17","May 15, 1979","1979/05/ 15",68.42,994,61.00,75.10,Missing,0,Missing,Missing,0.00% ,"Illinois","17","May 16, 1979","1979/05/ 16",70.29,994,63.40,73.50,Missing,0,Missing,Missing,0.00% ,"Illinois","17","May 17, 1979","1979/05/ 17",75.34,994,64.00,80.50,82.60,2,82.40,82.80,0.20% ,"Illinois","17","May 18, 1979","1979/05/ 18",79.13,994,75.50,82.10,81.42,349,80.20,83.40,35.11% ,"Illinois","17","May 19, 1979","1979/05/ 19",74.94,994,66.90,83.10,82.87,78,81.60,85.20,7.85% 

Remarque: certains champs contiennent des virgules. Selon les règles dans de tels cas, le champ est entouré de guillemets pour indiquer que son contenu n'est pas destiné à analyser et à rechercher des délimiteurs. En pratique (comme dans ce cas), seule une fraction des champs est souvent placée entre guillemets, en particulier ceux dont les valeurs peuvent contenir un séparateur. Cependant (comme dans cet exemple), certains champs sont placés entre guillemets même lorsqu'ils ne contiennent probablement pas de séparateur.

Dans de tels cas, les solutions locales deviennent trop lourdes. Maintenant, le simple fait de casser une ligne par un délimiteur ne fonctionne plus; vous devez vous assurer que vous utilisez uniquement les séparateurs qui ne sont pas à l'intérieur des chaînes. De plus, vous devez supprimer les guillemets, qui peuvent se trouver dans une position arbitraire ou ne se trouver nulle part. Avec le module csv, vous n'avez pas du tout à changer votre code. De plus, comme la virgule est considérée comme le séparateur par défaut, elle n'a même pas besoin d'être spécifiée:

 >>> results2 = [fields for fields in csv.reader(open("temp_data_01.csv", newline=''))] >>> results2 [['Notes', 'State', 'State Code', 'Month Day, Year', 'Month Day, Year Code', 'Avg Daily Max Air Temperature (F)', 'Record Count for Daily Max Air Temp (F)', 'Min Temp for Daily Max Air Temp (F)', 'Max Temp for Daily Max Air Temp (F)', 'Avg Daily Min Air Temperature (F)', 'Record Count for Daily Min Air Temp (F)', 'Min Temp for Daily Min Air Temp (F)', 'Max Temp for Daily Min Air Temp (F)', 'Avg Daily Max Heat Index (F)', 'Record Count for Daily Max Heat Index (F)', 'Min for Daily Max Heat Index (F)', 'Max for Daily Max Heat Index (F)', 'Daily Max Heat Index (F) % Coverage'], ['', 'Illinois', '17', 'Jan 01, 1979', '1979/01/01', '17.48', '994', '6.00', '30.50', '2.89', '994', '-13.60', '15.80', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'Jan 02, 1979', '1979/01/02', '4.64', '994', '-6.40', '15.80', '-9.03', '994', '-23.60', '6.60', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'Jan 03, 1979', '1979/01/03', '11.05', '994', '- 0.70', '24.70', '-2.17', '994', '-18.30', '12.90', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'Jan 04, 1979', '1979/01/04', '9.51', '994', '0.20', '27.60', '-0.43', '994', '-16.30', '16.30', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'May 15, 1979', '1979/05/15', '68.42', '994', '61.00', '75.10', '51.30', '994', '43.30', '57.00', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'May 16, 1979', '1979/05/ 16', '70.29', '994', '63.40', '73.50', '48.09', '994', '41.10', '53.00', 'Missing', '0', 'Missing', 'Missing', '0.00%'], ['', 'Illinois', '17', 'May 17, 1979', '1979/05/17', '75.34', '994', '64.00', '80.50', '50.84', '994', '44.30', '55.70', '82.60', '2', '82.40', '82.80', '0.20%'], ['', 'Illinois', '17', 'May 18, 1979', '1979/05/18', '79.13', '994', '75.50', '82.10', '55.68', '994', '50.00', '61.10', '81.42', '349', '80.20', '83.40', '35.11%'], ['', 'Illinois', '17', 'May 19, 1979', '1979/05/19', '74.94', '994', '66.90', '83.10', '58.59', '994', '50.90', '63.20', '82.87', '78', '81.60', '85.20', '7.85%']] 


»Plus d'informations sur le livre sont disponibles sur le site de l'éditeur
» Contenu
» Extrait

20% de réduction sur les colporteurs - Python

Source: https://habr.com/ru/post/fr437050/


All Articles