Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

uvoz #3

Closed
spelaognjanovic opened this issue Dec 7, 2017 · 1 comment
Closed

uvoz #3

spelaognjanovic opened this issue Dec 7, 2017 · 1 comment

Comments

@spelaognjanovic
Copy link

Pozdravljeni,
zanima me za to tabelo s tega linka: http://www.ultimatetennisstatistics.com/seasons , če se jo da uvozit. Drugače pa sem razmišljala, če bi lahko podatke prepisala v excel tabelo, saj nimam nobene scv tabele?

Bi lahko pogledali še za to tabelo: https://sl.wikipedia.org/wiki/Seznam_zmagovalcev_turnirjev_za_Grand_Slam_-_mo%C5%A1ki_posami%C4%8Dno, kako bi lahko razbrala zastavice, da bi potem naredila tabelo (in graf), katera država je največkrat zmagala na turnirjih.

Hvala,
Špela Ognjanović

@jaanos
Copy link
Owner

jaanos commented Dec 7, 2017

Stran dobi podatke s povezave http://www.ultimatetennisstatistics.com/seasonsTable?current=1&rowCount=20&sort%5Bseason%5D=desc&searchPhrase=&_=1512663744085 v obliki JSON. Vrstice so naštete v seznamu rows - vsak stolpec je predstavljen v svojem elementu, edino pod bestPlayer so navedeni stolpci za igralca - podatki o njegovi državi so nadalje zbrani pod country. Podatke lahko uvoziš nekako tako:

library(httr)
library(dplyr)

link <- paste0("http://www.ultimatetennisstatistics.com/seasonsTable?current=1&rowCount=20&sort[season]=desc&searchPhrase=&_=",
               as.numeric(Sys.time()))
data <- content(GET(link))$rows %>% lapply(function(x) {
  country <- x$bestPlayer$country$name
  x$bestPlayer <- c(x$bestPlayer$country, x$bestPlayer)
  x$bestPlayer$country <- country
  x <- c(x, x$bestPlayer)
  x$bestPlayer <- NULL
  return(x)
}) %>% bind_rows()

Svetujem, da uvoza knjižnic opraviš v lib/libraries.r (tam že imaš dplyr) in potem vsakič pred začetkom dela izvedeš ta program, da bodo ustrezne knjižnice uvožene (pri prevajanju poročila se prav tako izvede ta program).

V povezavi do podatkov sem zadnjo številko nadomestil s trenutnim časom (ne vem, če to kaj vpliva, a morda s tem poskrbiš, da dobiš vedno aktualne podatke). Potem se za vsako vrstico izvede podana funkcija. S c se lahko poleg vektorjev združuje tudi sezname - najprej se podatki za državo pridružijo podatkom za igralca (tako država kot igralec sta sedaj v polju z imenom name, zato se država prepiše v polje country, ki je prej vsebovalo vse podatke o državi), nato pa ti podatki še k preostalim podatkom (polje z vsemi podatki o igralcu se lahko pobriše). Nazadnje funkcija bind_rows iz knjižnice dplyr vse te vrstice združi v eno razpredelnico.

Podatke bo treba še obdelati - stolpce s procenti bo treba pretvoriti v številke (uporabi funkcijo parse_number iz knjižnice readr).

Kar se tiče zastav, jih lahko dobiš iz imen datotek z zastavami. Besedilne podatke lahko dobiš tako kot dosedaj, iz iste tabele pa dobiš še podatke o državah v razpredelnico, ki ima ustrezno državo na istem mestu kot tabela z igralci:

  html_tabela <- stran %>% html_nodes(xpath="//table[@class='wikitable']") %>% .[[1]]
  tabela <- html_tabela %>% html_table(fill = TRUE)
  drzave <- html_tabela %>% html_nodes(xpath=".//tr") %>% .[-1] %>%
    sapply(. %>% html_nodes(xpath="./td") %>%
             lapply(. %>% html_nodes(xpath="./a[@class='image']") %>% html_attr("href") %>%
                      sapply(. %>% { gsub("US_.*_Flag", "Flag_of_the_United_States", .) } %>%
                               strapplyc("Flag_of_(.*)\\.svg") %>%
                               { gsub("_", " ", gsub("_\\(.*", "", gsub("^the_", "", .))) }) %>%
                      .[1]) %>% { ifelse(sapply(., is.list), NA, .) %>%
                          c(rep(NA, 5 - length(.)))} %>%
             unlist()) %>% t() %>% data.frame()
  colnames(drzave) <- colnames(tabela)

V grobem torej to deluje tako, da greš čez vse vrstice (razen prve - prvi sapply), nato pa čez vse celice v vrstici (lapply) in nazadnje čez vse slike v celici (ponekod jih ni, v enem primeru pa sta dve ameriški - zato na koncu vzameš samo eno). Ponekod se uporabljajo stare zastave - zato je potrebna zamenjava za ZDA in za brisanje letnic. Ponekod tudi vrstice niso polne - v tem primeru se vrstica zapolni z NA. Rezultat je matrika, ki jo je treba transponirati (t()) in pretvoriti v razpredelnico. Ker dobljena imena stolpcev niso ravno koristna, se nazadnje uporabijo imena iz razpredelnice z igralci.

Vidim, da na svojem repozitoriju nimaš odprtega sledilca zadev - da ga odpreš, pojdi na svoj repozitorij, v zgornji vrstici klikni na Settings, nato pa obkljukaj Issues. V zgornji vrstici se bo pojavil zavihek Issues - če boš imeli kakršnokoli vprašanje, tam odpri zadevo (torej na svojem repozitoriju) in jo pusti odprto, dokler je ne razrešiš.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants