[PYTHON] Créer un bloc de données à partir des données textuelles de course de bateaux acquises

introduction

Cet article est une explication du code interne du site de triple prédiction de course de bateaux "Aujourd'hui, avez-vous une bonne prédiction?" qui a été créé par moi-même et publié sur le Web. Ce sera. Cette fois, je vais résumer la création de trames de données. En premier lieu, je vais créer un article séparé concernant l'acquisition de données, veuillez donc vous y référer.

Données d'origine à convertir en DataFrame

La partie inférieure est constituée de données textuelles qui peuvent être téléchargées à partir de la formule Boat Race, mais puisque nous voulons utiliser ce résultat de course pour l'apprentissage du classement, cette fois, nous formaterons le contenu entouré de jaune sous forme de bloc de données. image.png

Gestion des mots inutiles et des espaces vides

Par exemple, la figure ci-dessus est l'information de la première course de l'hippodrome de Toda, mais je suis préoccupé par le fait que "Toda" est aussi "Toda" et l'existence d'un espace pleine largeur. Donc, tout d'abord, nous allons faire le traitement autour de cela.

import pandas as pd
import numpy as np

filename_txt = 'bs_2020_0622.txt' #Données textuelles originales
output_raw = '2020_0622_raw.txt' #Après avoir traité la partie 1_Données textuelles après traitement des blancs

with open(filename_txt, mode='r', encoding='utf-8') as f:
    lines = f.readlines()

for i in range(len(lines)):
    with open(output_raw, mode='a', encoding='utf-8') as f:
         f.writelines(lines[i].replace("Nom de joueur","Nom de joueur").replace("vague m","")\
                      .replace("cm","").replace("Approche fixe","")\
                      .replace("〜","").replace("!","").replace("(","")\
                      .replace(")","").replace("・","").replace("−","")\
                      .replace(" ","").replace("     "," ").replace("    "," ")\
                      .replace("   "," ").replace("  "," ").lstrip())

Vous pourriez penser que c'est une montagne de remplacements. Je vous serais reconnaissant si vous pouviez me faire savoir si vous avez de meilleures idées ou styles d'écriture. Dans tous les cas, en lisant les données d'origine ligne par ligne et en appliquant le processus de remplacement, le fichier texte devient comme indiqué dans la figure ci-dessous. Vous avez réussi à gérer les blancs supplémentaires (+ mots).

image.png

Extraire des données à l'aide d'expressions régulières, etc.

Comme indiqué dans le cadre jaune du premier accrochage, les informations souhaitées sont dispersées dans chaque ligne de texte. En tant que processus final de création d'une trame de données, faites en sorte que les informations souhaitées soient décrites dans toutes les lignes.

import re

output_txt= '2020_0622_txt.txt' #Après le traitement de la partie 2_Données textuelles après le traitement normal des expressions

place_list = ['Fukuoka [Résultats]','Omura [Résultats]','Kiryu [Résultats]','Toda [Résultats]'\
              ,'Tamagawa [Résultats]','Lac Hamana [Résultats]','Gamagun [Résultats]'\
             ,'Tokisuri [Résultats]','Tsu [Résultats]','Lac Biwa [Résultats]','Suminoe [Résultats]'\
              ,'Naruto [Résultats]','Marugame [Résultats]','Miyajima [Résultats]'\
             ,'Tokuyama [Résultats]','Shimonoseki [Résultats]','Wakamatsu [Résultats]','Mikuni [Résultats]'\
              ,'Heiwajima [Résultats]','Ashiya [Résultats]','Kojima [Résultats]',\
             'Edogawa [Résultats]','Amagasaki [Résultats]','Karatsu [Résultats]']

pattern_list = ['TOP 1R 2R 3R 4R 5R 6R 7R 8R 9R 10R 11R 12R']
pattern = 'TOP 1R 2R 3R 4R 5R 6R 7R 8R 9R 10R 11R 12R (\w+ \w+ \w+ \w+ \w+ \w+ \w+ \w+)'
repattern = re.compile(pattern)

pattern2_list = ['N ° du bateau à l'arrivée Nom du joueur']
pattern2 = 'N ° du bateau à l'arrivée Nom du joueur(\w+)' #' 
repattern2 = re.compile(pattern2)

pattern3_list = ['Non.']

#Lisez les résultats de la course qui ont été effacés ligne par ligne
with open(output_raw, mode='r', encoding='utf-8') as f:
    lines = f.readlines()

#Préparer des données de texte vides
text = ''
text2 = ''
text3 = ''

#Vérifiez s'il y a une ligne qui correspond au motif ligne par ligne
for i in range(0,len(lines)):
    with open(output_txt, mode='a', encoding='utf-8') as f:
        if pattern_list[0] in lines[i]:
            #Utilisez la fonction de recherche pour voir si elle s'applique
            match = re.search(repattern, lines[i])
            #Sort la chaîne de caractères extraite
            try:
                text = match.group(1)
            except:
                print(str(lines[i]),i,"Ce mec une petite erreur")
        
        if pattern2_list[0] in lines[i]:
            #Utilisez la fonction de recherche pour voir si elle s'applique
            match = re.search(repattern2, lines[i])
            #Sort la chaîne de caractères extraite
            try:
                text2 = match.group(1)
            except:
                print(str(lines[i]),i,"Ce mec une petite erreur 2")
                text2 = "blank"
            
        if pattern3_list[0] in lines[i]:
            #Sort la chaîne de caractères extraite
            text3 = lines[i].replace("Non.","").replace("/"," ")
            
        for j in place_list:
            if j in lines[i]:
                k = j.replace("[Résultats]","")
                f.writelines(lines[i])
                break
                
        f.writelines(lines[i].replace('. .','.').rstrip()+" "+k+" "\
                     +text+" "+text2+" "+text3+"\n")

Je me demande s'il existe un meilleur moyen ... mais cela créera les données textuelles suivantes. Pouvez-vous voir que la météo et la date sont incluses dans les informations de course que vous voulez cette fois?

image.png

Enfin, trame de données! !!

Quand vous arrivez ici, c'est presque fini. Les informations que je veux dans ces données textuelles ne sont que la plage du cadre rouge écrit dans la figure ci-dessus. En d'autres termes, la ligne où le premier caractère de la ligne de texte commence par "0" est prise en tant que bloc de données.

df = pd.read_table(output_txt, names='A') #Nom de colonne"A"Créer un bloc de données avec
df_racer = df[df['A'].str.startswith('0')] #"0"Obtenez uniquement les lignes commençant par
df_racer = df_racer['A'].str.split(' +', expand=True)\
    .rename(columns={0:'Position',1:'Lane',2:'Register',3:'Name',4:'Motor',5:'Boat'\
                     ,6:'Tenji',7:'Entry',8:'Start',9:'Time',10:'Place'\
                     ,11:'Round',12:'RaceType',13:'Course',14:'Wether'\
                     ,15:'Wind',16:'WindDir',17:'WindStr',18:'WaveHgt'\
                     ,19:'RaceResult',20:'RaceDay',21:'Year',22:'Month'\
                     ,23:'Day',24:'Location'})

df_racer = df_racer.reset_index()

Étant donné que chaque information est séparée par un espace vide demi-largeur, la signification est définie par le traitement de fractionnement ('+') et de changement de nom. Et la trame de données terminée ressemble à ceci. ** Tu l'as fait! ** **

df_racer.head()
image.png

en conclusion

Le processus de conversion de ces données texte en un bloc de données était très difficile ... Y a-t-il une différence entre un format facile à voir et un format facile à traiter des données? Combien de données texte créez-vous? !! Je sens aussi que je veux écrire plus intelligemment. Sera-t-il mis à jour un jour ..?

Recommended Posts

Créer un bloc de données à partir des données textuelles de course de bateaux acquises
Utilisez Matplotlib pour créer plusieurs graphiques linéaires à partir d'un bloc de données à la fois
Générer une image verticale d'un roman à partir de données textuelles
Essayez de créer une table d'enregistrement de bataille avec matplotlib à partir des données de "Schedule-kun"
[Go] Créez un outil qui renvoie la valeur de course du Pokémon reçu de l'entrée standard
Découvrez le nombre maximum de caractères dans un texte multiligne stocké dans un bloc de données
Un programme qui supprime des caractères spécifiques du texte saisi
Supprimer le cadre de l'image
Créer un fichier de données factice
Créer un diagramme de corrélation à partir de l'historique des conversations de Twitter
Traiter les données extraites d'un certain système de point de vente pour créer un tableau récapitulatif par produit et par heure
Créer une API qui renvoie les données d'un modèle à l'aide de turicreate
[numpy] Créer une matrice de fenêtre mobile à partir de données de séries chronologiques multidimensionnelles
Sortie de la ligne contenant la chaîne de caractères spécifiée à partir du fichier texte
[Spark Data Frame] Changer une colonne de l'horizontale à la verticale (Scala)
[Mac] Créer un environnement d'exécution Python 3 à partir de l'état entièrement initialisé
Préparez un environnement d'analyse haute vitesse en accédant à mysql depuis l'environnement d'analyse de données
Créez un Dataframe pandas à partir d'une chaîne.
Comment diviser et traiter une trame de données à l'aide de la fonction groupby
Extraire les lignes qui correspondent aux conditions d'un fichier texte avec python
[Environnement de développement] Comment créer un ensemble de données proche de la base de données de production
Comment créer un clone depuis Github
Créer un graphique à l'aide du module Sympy
Créer un gros fichier texte avec shellscript
Créer un classement à partir des résultats des matchs JFL
Créer un fichier deb à partir d'un package python
Comment créer un référentiel à partir d'un média
Créer un bloc de données à partir d'Excel à l'aide de pandas
Créer une matrice avec PythonGUI (zone de texte)
Récupérez uniquement le texte du formulaire Django.
Python --Lisez les données d'un fichier de données numériques et recherchez la ligne de régression multiple.
Regroupez le nombre d'étapes par jour à partir des données de santé iPhone pour créer un fichier CSV
[Django] Créez un formulaire qui remplit automatiquement l'adresse à partir du code postal
Changer le bloc de données des données d'achat de pandas (produit ID X) en dictionnaire