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".
import pandas as pd
from bs4 import BeautifulSoup
import datetime
import psycopg2
from sqlalchemy import create_engine
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
La première trame de données ressemble à ceci.
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
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
)
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.
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()
--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
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)
connection_config = {
'user': '*****',
'password': '*****',
'host': '*****',
'port': '****', #OK sans
'database': '*****'
}
engine = create_engine('postgresql://{user}:{password}@{host}:{port}/{database}'.format(**connection_config))
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