Narzędzia użytkownika

Narzędzia witryny


ewdprocedury_pobieranie_bazy_szkol

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
ewdprocedury_pobieranie_bazy_szkol [2015/07/10 14:15]
t.zoltak
ewdprocedury_pobieranie_bazy_szkol [2015/07/10 17:03] (aktualna)
t.zoltak
Linia 1: Linia 1:
 ====== Eksport z bazy danych informacji o szkołach ====== ====== Eksport z bazy danych informacji o szkołach ======
  
-Skrypt pobiera informacje o szkołach z bazy (przez ODBC). Nazwy kolumn w zwracanych plikach są nieco "​oldschoolowe"​ - odtwarzają konwencję ​bazy szkół prowadzonej jeszcze w pliku SPSSa, zanim baza SQLowa powstała i pochłonęła wszystko.+Skrypt pobiera informacje o szkołach z bazy korzystająfunkcji pakietu EWDdane. 
 +Na raz można pobrać informacje tylko o szkołach jednego typu.
  
-Typowo interesujący jest plik wyjściowy w postaci długiej (jeśli chodzi o nazwę szkoły i dane adresowe zawiera on tylko najbardziej aktualne informacje). +Starsze rozwiązania, wykorzystujące ODBC i odtwarzają konwencję nazywania kolumn z bazy szkół prowadzonej kiedyś jeszcze w pliku SPSSa, ​można ​odszukać w poprzednich wersjach strony (nie ma gwarancji, że będą działać na obecnej wersji bazy).
- +
-Obecnie na raz można ​pobrać informacje tylko o szkołach jednego typu.+
  
 <​code>​ <​code>​
-typSzkoly ​    ​= "​typ" ​             # dozwolone wartości: "​gimn.",​ "​LO",​ "​LP",​ "​T"​ +typSzkoly = "​typ" ​ # dozwolone wartości: "​gimn.",​ "​LO",​ "​LP",​ "​T"​ 
-zapiszDlugi ​  = "​nazwa_pliku.csv" ​ # lub NULL jeśli plik w formacie szerokim ma nie być zapisywany +zapis     = "​nazwa_pliku.csv"​
-zapiszSzeroki = "​nazwa_pliku.csv" ​ # lub NULL jeśli plik w formacie szerokim ma nie być zapisywany +
-zrodloODBC ​   = "​EWD" ​             # ew. dostosować+
  
-library(RODBCext) 
 setwd("​~/​Desktop/"​) setwd("​~/​Desktop/"​)
 +library(EWDdane)
  
 dozwoloneTypy = c("​gimn.",​ "​LO",​ "​LP",​ "​T"​) dozwoloneTypy = c("​gimn.",​ "​LO",​ "​LP",​ "​T"​)
-przyrostki ​   = c("​g" ​   , "​lo",​ "​lo",​ "​t"​) 
 if (typSzkoly %in% dozwoloneTypy) { if (typSzkoly %in% dozwoloneTypy) {
-  ​przyr przyrostki[dozwoloneTypy == typSzkoly] +  ​daneSzkol ​pobierz_dane_szkol(2006:​as.numeric(format(Sys.time(), "%Y"))
-  # samo pobieranie +                                 ​typSzkoly, ​idOke FALSEdaneAdresowe ​TRUE%>% 
-  p = odbcConnect(zrodloODBC) +    ​filter(id_szkoly > 0
-  szkoly = sqlExecute( +  ​lata sort(unique(daneSzkol$rok), decreasing = TRUE
-    p, +  ​daneSzkol ​select(daneSzkol-rok-wielkosc_miejscowosci-rodzaj_gminy
-    "​SELECT rok, id_szkoly AS id_szkoly_strona,​ id_szkoly_oke,​ +                     -matura_miedzynarodowa
-      typ_szkoly, publiczna, dla_doroslych,​ specjalna, przyszpitalna,​ +  ​daneSzkol ​= within(daneSzkol, { 
-      nazwa, adres, miejscowosc,​ pna, poczta, wielkosc_miejscowosci AS l_mieszk, +    oke = c("​Wrocław",​ "​Gdańsk",​ "​Kraków",​ "​Poznań",​ "​Łódź",​ "​Kraków",​ 
-      id_wojewodztwa AS wojewodztwo,​ id_powiatu AS powiat, id_gminy AS gmina, +            ​"​Warszawa",​ "​Wrocław",​ "​Kraków",​ "​Łomża",​ "​Gdańsk",​ "​Jaworzno",​ 
-      matura_miedzynarodowa AS ib +            ​"​Łódź",​ "​Łomża",​ "​Poznań",​ "​Poznań"​)[floor(teryt_szkoly / 10^4) / 2]
-    FROM (SELECT * FROM szkoly WHERE typ_szkoly = ?) AS szkoly +
-      JOIN szkoly_dane USING (id_szkoly) +
-    WHERE id_szkoly > 0 AND rok > 2005 +
-    ORDER BY id_szkoly_stronarok;", +
-    typSzkoly, +
-    fetch TRUEstringsAsFactors ​FALSE +
-  ​+
-  ​odbcClose(p+
-  ​ +
-  # trochę ręcznego tuningu z nazwami zmiennych (do stylu "dawno temu, przed bazą SQL"​) +
-  names(szkoly) ​sub("​id_szkoly_ewd",​ paste0("​id_"​ , przyr), names(szkoly)+
-  ​names(szkoly) ​sub("​id_szkoly_oke"​paste0("​kod_"​przyr)names(szkoly)) +
-  # matura międzynarodowa nie ma nic wspólnego z gimnazjami +
-  if (typSzkoly=="​gimn."​) szkoly = szkoly[names(szkoly) != "​ib"​] +
-  # TERYT w jedną zmienną +
-  szkoly = within(szkoly,​ {teryt = 10000 * wojewodztwo + 100 * powiat + gmina}+
-  ​szkoly = szkoly[, !(names(szkoly) %in% c("​powiat",​ "​gmina"​))] +
-  # OKE na podstawie województwa +
-  szkoly ​= within(szkoly, { +
-    oke = c("​Wrocław",​ "​Gdańsk",​ "​Kraków",​ "​Poznań",​ "​Łódź",​ "​Kraków",​ "​Warszawa",​ "​Wrocław",​ +
-            ​"​Kraków",​ "​Łomża",​ "​Gdańsk",​ "​Jaworzno",​ "​Łódź",​ "​Łomża",​ "​Poznań",​ "​Poznań"​)[wojewodztwo/2]+
   })   })
-  ​# jeśli pobieramy technika, typ szkoły może być uznany za zmienną logiczną +  ​for (i in lata
-  if (is.logical(szkoly$typ_szkoly)) szkoly$typ_szkoly ​"​T"​ +    kody pobierz_dane_szkol(itypSzkolyidOke TRUEdaneAdresowe ​FALSE
- +    ​kody = select(kodyid_szkolyid_szkoly_oke,​ matura_miedzynarodowa) 
-  # ew. zapis formy długiej +    ​if (!(typSzkoly ​%in% c("LO", "LP", "T"​))) ​{ 
-  if (!is.null(zapiszDlugi)) write.csv2(szkolyzapiszDlugirow.names ​FALSEna "",​ fileEncoding = "​UTF-8"​) +      kody = select(kody, -matura_miedzynarodowa
-   +    ​} 
-  # ew. przekształcenie do postaci szerokiej +    ​maska names(kody) != "id_szkoly
-  if (!is.null(zapiszSzeroki)) { +    ​names(kody)[maska= paste0(names(kody)[maska], "_", ​i
-    ​# reshape() działa dużo szybciejjeśli nie przepuszczać przez nią tegoco możemy dołączyć w inny sposób +    ​daneSzkol ​suppressMessages(left_join(daneSzkolkody))
-    ​drop = names(szkoly)[!(names(szkoly) ​%in% c("id_szkoly_strona", "rok", +
-                                                ​"kod_g",​ "​kod_lo",​ "​kod_t",​ "​l_mieszk",​ "ib"))+
-    kody = reshape(szkoly,​ timevar="​rok",​ idvar=c("​id_szkoly_strona"​),​ direction="​wide",​ drop=drop, sep="​_"​+
-    kody = kody[, c(names(kody)[1]sort(names(kody)[-1], decreasing= ​ TRUE))] +
-    ​# jeśli chodzi o inne informacje, to zostawiamy sobie tylko najświeższe (z najpóźniejszego roku) +
-    ​szkoly ​szkoly[order(szkoly$rok, decreasing=TRUE), ] +
-    inneInfo = aggregate( +
-      szkoly[, ​!grepl("​^id_|^kod_|^rok$|^l_mieszk$|^ib$",​ names(szkoly))],​ +
-      by=as.list(szkoly[,​ grepl("^id_", names(szkoly))]),​ +
-      function(x) {return(x[!is.na(x)][1])} +
-    ​+
-    # i łączymy w jedno +
-    polaczone = merge(kody, inneInfo) +
-    # definicja kolejności kolumn +
-    nazwyKolumn = c( +
-      names(polaczone)[grepl("​^id_[^s]", names(polaczone))],​ +
-      "​wojewodztwo",​ "​oke",​ "​nazwa",​ "​adres",​ "​miejscowosc",​ "​pna",​ "​poczta",​ +
-      "​typ_szkoly",​ "​publiczna",​ "​dla_doroslych",​ "​specjalna",​ "​przyszpitalna",​ +
-      ​names(polaczone)[grepl("​^kod_",​ names(polaczone))], +
-      names(polaczone)[grepl("^ib_", ​names(polaczone))], +
-      "​teryt",​ +
-      names(polaczone)[grepl("​^l_mieszk_",​ names(polaczone))],​ +
-      "​id_szkoly_strona"​ +
-    ​+
-    # sortujemy obserwacje i kolumny +
-    polaczone ​polaczone[order(polaczone[, grepl("​^id_[^s]"​names(polaczone))]), nazwyKolumn] +
- +
-    # zapis +
-    write.csv2(polaczone,​ zapiszSzeroki,​ row.names = FALSE, na = "",​ fileEncoding = "​UTF-8"​)+
   }   }
 +  rm(kody)
 +  maska = unlist(lapply(daneSzkol,​ class)) == "​logical"​
 +  daneSzkol[, maska] = lapply(daneSzkol[,​ maska], as.numeric)
 +  write.csv2(daneSzkol,​ zapis, row.names = FALSE, na = "",​ fileEncoding = "​UTF-8"​)
 } else { } else {
   stop("​Niedozwolony typ szkoły!"​)   stop("​Niedozwolony typ szkoły!"​)
ewdprocedury_pobieranie_bazy_szkol.txt · ostatnio zmienione: 2015/07/10 17:03 przez t.zoltak