[PYTHON] Scraping, prétraitement et écriture dans postgreSQL

J'ai toujours voulu analyser en utilisant des données de baseball, donc je "copie toujours les parties nécessaires du site, je le colle dans Excel et je l'enregistre au format csv". Cependant, je pensais que c'était un problème, alors j'ai essayé de "gratter, pré-traiter et écrire dans postgreSQL".

Installation des bibliothèques requises

Grattage, etc.


import pandas as pd
from bs4 import BeautifulSoup
import datetime

écriture postgreSQL

import psycopg2
from sqlalchemy import create_engine

Obtenez des données

Cette fois, nous obtiendrons les données de performance du frappeur géant avec "pandas.read_html". Il semble que la table (balise table) de la page est récupérée dans l'ordre et la liste des dataframe est retournée.

raw_data = pd.read_html("https://baseball-freak.com/audience/giants.html", flavor="bs4")

La liste sera renvoyée, elle ressemblera donc à ceci スクレイピング結果.JPG

La première trame de données ressemble à ceci. 1つめのdataframe.JPG

Le second devrait contenir les données que vous voulez cette fois, alors vérifiez-le

data_set = raw_data[1] #Il y a plusieurs tableaux sur la page, et cette fois je veux le deuxième tableau[1]Spécifier
data_set

dataset.JPG

Vérifiez le contenu du bloc de données

Vérifiez le contenu des données acquises.

pd.concat(
    [data_set.count().rename('nombre'),
    data_set.dtypes.rename('Type de données'),
    data_set.nunique().rename('Numéro unique'),
    data_set.isnull().sum().rename('Nombre de nuls'),
    (data_set.isnull().sum() * 100 / data_set.shape[0]).rename('Taux de défaut(%)').round(2)],
    axis=1
)

データ調査.JPG

Vous pouvez voir que tout est un objet. De plus, le lanceur partant, le nombre de spectateurs et le temps du match semblent inclure nul.

En cela, nous allons permettre d'analyser la date, le score, le nombre de spectateurs en effectuant une conversion de type etc.

Traitement de la date


data_set["Mois"] = data_set["Date"].replace("Mois.*$", "", regex=True) # regex:Expressions régulières
data_set["journée"] = data_set["journée付"].replace("journée.*$", "", regex=True).replace("^.*Mois", "", regex=True)

for i in range(len(data_set['Mois'])):
    data_set['Date'] = "2019/" +  data_set["Mois"] + "/" + data_set["journée"]
    
data_set['Date'] = pd.to_datetime(data_set['Date'])
data_set['Jour (nombre)'] = data_set['Date'].dt.dayofweek
data_set.head()

日付.JPG

Traitement d'audience

--Remplacer "," et "personnes" --Remplir NaN avec 0 avec fillna --Changez le type en "int"

data_set["Nombre de spectateurs"] = data_set['Nombre de spectateurs'].replace(',', '', regex=True).replace('Homme', '', regex=True).fillna('0').astype(int)
data_set

観客数.JPG

Traitement des scores

data_set_score = pd.concat([data_set, data_set['But'].str.split(' - ', expand=True)], axis=1)
data_set_score_rename =data_set_score.rename(columns={0:'But', 1:'Concédé'})
data_set_score_rename['But']=data_set_rename['But'].replace('Annuler', 0).astype(int)
data_set_score_rename['Concédé']=data_set_rename['Concédé'].fillna(0).astype(int)

Connectez-vous à PostgreSQL


connection_config = {
    'user': '*****',
    'password': '*****',
    'host': '*****',
    'port': '****', #OK sans
    'database': '*****'
}

engine = create_engine('postgresql://{user}:{password}@{host}:{port}/{database}'.format(**connection_config))

Enregistrer dans postgreSQL

data_set_score_rename.to_sql('giants',schema='baseball_2019', con=engine, if_exists='replace', index=False)

Personnellement, je suis tombé ici. Ce que je suis tombé sur, c'est que je ne savais pas comment spécifier le nom du schéma. J'ai lu le document officiel et je l'ai résolu immédiatement, mais il a fallu environ une heure pour le résoudre. Quand vous ne comprenez pas, vous ne savez vraiment pas.

C'est tout! Si vous trouvez des erreurs dans la description, merci de me le faire savoir!

Recommended Posts

Scraping, prétraitement et écriture dans postgreSQL
Scraping à l'aide de lxml et enregistrement sur MySQL
Grattage de la nourriture avec python et sortie en CSV
[Kaggle] De la lecture des données au prétraitement et au codage
Grattage 2 Comment gratter
Premiers pas avec le Web Scraping
Introduction à l'écriture de Cython [Notes]
Scraping Aller à Hébergement de voyage
Connectez-vous à Postgresql avec GO
Lire et écrire des fichiers csv
Ajouts clés aux pandas 1.1.0 et 1.0.0
Technologie de grattage WEB et préoccupations
React and Flask to GCP
Je souhaite acquérir et répertorier les données boursières japonaises sans grattage
Gratter et manger des bûches - je veux trouver un bon restaurant! ~ (Travail)
[EC2] Introduction au grattage avec du sélénium (extraction de texte et capture d'écran)