Как веб-данные таблицы scape, используя селен / питон для линейной регрессии? - PullRequest
0 голосов
/ 24 сентября 2019

Вот мой код для очистки таблицы:

from selenium import webdriver 
    driver=webdriver.Chrome(executable_path="C:\\Users\\Administrator\\Downloads\\chromedriver_win32\\chromedriver.exe")
    driver.get("https://www.baseball-reference.com/leagues/MLB/2019-standard-pitching.shtml")

    table = driver.find_element_by_xpath('//*[@id="all_players_standard_pitching"]/div[3]').text
    print(table)

    driver.close()

Я хотел бы проанализировать ИМЯ игрока, его общую сумму WIN и общую сумму STRIKEOUT (Name, W, SO).

Я хотел бы использовать эту информацию для запуска линейной регрессии, чтобы выяснить, насколько переменная Strikeouts влияет на WINS Питчера.

Моя регрессия Wins = B0 + SO (X)

Я никогда раньше не запускал регрессию с использованием Python.Любая помощь будет принята с благодарностью.Заранее спасибо!=) Кроме того, если это не слишком много неудобств, было бы хорошо, чтобы график также данные.

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019

только что быстро просмотрел сайт, и вам не нужен целый браузер / Selenium, чтобы получить данные.пакет requests намного проще / быстрее для такого рода данных:

import requests

url = 'https://www.baseball-reference.com/leagues/MLB/2019-standard-pitching.shtml'
res = requests.get(url)

# make sure we didn't get an error
res.raise_for_status()

затем мы можем использовать lxml для анализа HTML:

from lxml import html
from lxml.cssselect import CSSSelector
from io import StringIO

doc = html.fromstring(res.content)
comment = doc.xpath(CSSSelector('div.placeholder').path)[0].getnext()
[table] = html.parse(StringIO(comment.text)).findall('//table')

это немного неудобно, потому что они встраивают данные / таблицу в комментарий

теперь мы сделали, что можем извлечь данные:

results = []

for i, row in enumerate(table.xpath('//tbody//tr')):
    if 'thead' in row.get('class', ''):
        continue
    player = {}
    for cell in row.xpath('th | td'):
        key = cell.get('data-stat')
        player[key] = cell.text_content()
        columns.add(key)
    results.append(player)

оставит ~ 1000 игроковв results и в удобной форме для помещения в pandas «фрейм данных» для легкой обработки:

import numpy as np
import pandas as pd

df = pd.DataFrame(results)
df.set_index('ranker', inplace=True)

# convert these columns from text to numbers
for name in ('W', 'L', 'SO'):
    df[name] = df[name].astype('float')

после того, как вы это сделаете, возможно, стоит сохранить его в виде файла CSV (или аналогичный) вы можете перезагрузить позже в случае изменения веб-сайта, и вы не можете запустить вышеуказанный код.CSV хорош, потому что многие инструменты работают с форматом, который даст вам больше опций, например, R

Я считаю, что пакет statsmodels имеет лучший интерфейсдля выполнения линейных регрессий в данный момент вы можете подстроить свой вопрос, выполнив:

import statsmodels.formula.api as smf

fit = smf.ols('W ~ SO', df).fit()
print(fit.summary())

, что даст вам хорошую сводку коэффициентов.Я бы не рекомендовал использовать такую ​​модель, хотя считает, что обычно требуется "преобразовать журнал" , и вы захотите сделать множество графиков ваших данных, используя что-то вроде matplotlib, возможно, через seaborn

надеюсь, это поможет!

0 голосов
/ 24 сентября 2019

Чтобы получить ИМЯ игрока из таблицы, я бы использовал XPath, чтобы найти список элементов, а затем обработал бы этот список самостоятельно.

Вот XPath:

//table[@id='players_standard_pitching_clone']//td[@data-stat='player']

Это даст вам список всех игроков.

Чтобы использовать его, вам нужно позвонить findElements, чтобы вы получили список.

driver.findElements(by.XPath("//table[@id='players_standard_pitching_clone']//td[@data-stat='player']");

Теперь у вас есть список веб-элементов, текст которых содержит имена.Если вы хотите поместить имена в список, вы можете сделать что-то вроде этого:

List<IWebElement> playerNameElements = driver.findElements(by.XPath("//table[@id='players_standard_pitching_clone']//td[@data-stat='player']");
List<string> playerNames = new List<string>();

foreach (IWebElement playerElement in playerElements)
{
    playerNames.Add(playerElement.Text);
}

Теперь playerNames будет содержать список строк со всеми именами игроков из таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...