giosimportMateusz Rzeszutek
AGH Akademia Górniczo-Hutnicza im. Stanisława Staszica w Krakowie, Wydział Geodezji Górniczej i Inżynierii Środowiska, Katedra Kształtowania i Ochrony Środowiska.
e-mail: rzeszut@agh.edu.pl.
lokalizacja: bud. C-4, p. V, pok. 511, al. A. Mickiewicza 30, Kraków, Polska.
Na stronie Portal Jakość Powietrza GIOŚ udostepniana jest baza danych pomiarów stężeń zanieczyszczeń powietrza. Znajaduje się ona w zakładce Bank Danych Pomiarowych.
Teoretycznie dane te mają jednorodną strukturę i ich wczytanie powinno być dość proste. Niestety w tych danych wielokrotnie pojawiają się różnego rodzaju nieścisłości, które uniemożliwiały stosowanie prostych i przejrzystych rozwiązań. Kod projektu stawał się bardzo długi, a spora jego część skupiała się na pozyskaniu danych i przekonwertowaniu ich do wygodnej formy pracy. Kilka najważniejszych problemów wymiennie tutaj:
Koniecznym było stworzenie jednorodnego zestawu funkcji pobierania i wczytywania danych, które zwracały będą spójne zestawy danych gotowy do dalszej obróbki np. oceny jakości powietrza, analiz wpływu czynników meteorologicznych na kształtowanie poziomów stężeń, czy dość skomplikowanego zagadnienia normalizacji meteorologicznej poziomów stężeń w celu oceny efektów działań naprawczych itd…
Uwaga!!!: Wszystkie kolumny oznaczone jako
date odnoszą się do daty w stefie UTC+01. To
rozwiązania sprawia, że dane są dość wygodne do łącznie z danymi
meteorologicznymi. Natomiast może stwarzać to pewne problemy przy
analizie wpływu czynników emisyjnych z uwagi na fakt, że w Polsce
występuje czas letni [UTC+01] i zimowy
[UTC+02]. Oznacza to, np. że tzw. szczyt natężenia
ruchu będzie miał miejsce w innych godzinach doby w różnych okresach
roku.
Przewodnik “Wprowadzenie do gios_import” obrazuje metody pobierania i wczytywania danych z Portalu Jakości Powietrza GIOŚ przy pomocy pakietu gios_import, napisanego w języku programowania R. Przewodnik składa się z 3 części.
Pierwsza część skupia się na metadanych, które zawierają informacje o stacjach jakości poietrza. Pozwolą one w łatwy sposób odpowiedzieć użytkowniki na pytanie: co znajduje się w bazie danych?.
Druga część opisuje jak pobrać całą plikową bazę danych na dysk przy pomocy języka programowania R. Zalecam pobranie od razu całej bazy danych na dysk, ponieważ funkcja wczytywania danych do R zakłada, że dane znajdują się na dysku.
Trzecia część przedstawia funkcję wczytywania danych, która zakłada, że wykonałeś punkt 2, czyli posiadasz na dysku plikową bazę danych.
Opracowane funkcje tworzone były z myślą pętlach map z
pakietu purrr. Dzięki czemu kod staje się przejrzysty i
efektywny. Ponadto pakiet purrr został napisany w języku
C, dzięki czemu działają one znacznie szybciej od
klasycznych pętli for języka programowania R.
Repozytorium pakietu znajduje się na portalu github. Zwiazku z tym potrzebny jest
również pakiet devtools, który pobierze repozyroriu
giosimport i zainstaluje pakiet na twoim komputerze.
# devtools, sprawdzamy czy jest, jeśli nie to instalujemy i wczytujemy
if(!require(devtools)) {install.packages("devtools"); require(devtools)}
# instalcja pakietu gios_import
devtools::install_github("mrzeszut/giosimport")
library(giosimport)Jeśli wszytko poszło dobrze to pakiet został zainstalowany. Jeśli
pojawi się error to proszę o przesłanie komunikatu błędu na
adres rzeszut@agh.edu.pl. Aktualnie jest to wersja
beta pakietu.
Poniższym polecenie wywoła w oknie pomocy listę funkcji pakietu, oraz
ich skrócony opis. Możecie zauważyć, ze wrzystkie nazwy funkcji
zaczynają się od wyrażenia gios_, dzięli czemu bardzo
szybkow wyświetlają się w systemie podpowiedzi Rstudio.
help(package = "giosimport")Zalecam załadowanie dodatkowych pakietów z których korzystam w celu prezentacji wyników.
library(dplyr)
library(purrr)
library(ggplot2)
library(stringr)
library(tidyr)
library(leaflet)
library(openxlsx)
library(janitor)Zanim zaczniemy korzystać z funkji pakietu giosimport,
zalecam zdefiniowanie ścieżki dostępu do lokalizacji w której będą
zapisywane dane w postaci bazy plikowej. Można ten krok pominąć i
pobierać wszystkie dane do katalogu projektu, ale skutkować to będzie w
przyszłości zapisywaniem wielokrotnym danych w różnych katalogach
projektu. W moim przypadku jest to:
kat_dost <- "D:/4_BAZY_DANYCH/gios_airbase" # zdefiniuj własną ścieżkęWczytywanie metadanych stacji jakości powietrza. Poniższa funkcja
pobiera plik binarny do katalogu kat_dost. Następnie
wczytuje dostępne w nim dane do obiektu meta. W systemie
Windows koniecznym jest ustawienie argumentu mode = "wb". W
przypadku innych wersji systemu operacyjnego zachęcam zapoznać się z
dokumentacją funkcji download.file. Jeśli korzytsasz z
funkcji pierwszy raz, to ustaw download = T. Za każdym
nastepnym uruchomieniem lepiej ustawić F, i wczytywać dane z dysku z
lokalizacji kat_dost.
meta <- gios_metadane(type = "stacje",
download = F, # zmień na T, jeśli uruchamiasz piewszy raz
path = kat_dost,
mode = "wb")dplyr::glimpse(meta)#> Rows: 1,055
#> Columns: 15
#> $ nr <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, …
#> $ kod.stacji <chr> "DsBialka", "DsBielGrot", "DsBogatFrancMOB", "DsBog…
#> $ kod.miedzynarodowy <chr> NA, NA, "PL0602A", "PL0315A", "PL0576A", "PL0658A",…
#> $ nazwa.stacji <chr> "Białka", "Bielawa - ul. Grota Roweckiego", "Bogaty…
#> $ stary.kod.stacji <chr> "DsBialka", "DsBielGrot", "DsBogatMob", "DsBogChop"…
#> $ data.uruchomienia <date> 1990-01-03, 1994-01-02, 2015-01-01, 1996-01-01, 20…
#> $ data.zamkniecia <date> 2005-12-31, 2003-12-31, 2015-12-31, 2013-12-31, 20…
#> $ typ.stacji <chr> "przemysłowa", "tło", "tło", "przemysłowa", "przemy…
#> $ typ.obszaru <chr> "podmiejski", "miejski", "miejski", "miejski", "mie…
#> $ rodzaj.stacji <chr> "kontenerowa stacjonarna", "w budynku", "mobilna", …
#> $ wojewodztwo <chr> "DOLNOŚLĄSKIE", "DOLNOŚLĄSKIE", "DOLNOŚLĄSKIE", "DO…
#> $ miejscowosc <chr> "Białka", "Bielawa", "Bogatynia", "Bogatynia", "Bog…
#> $ adres <chr> NA, "ul. Grota Roweckiego 6", "ul. Francuska/Kręta"…
#> $ lat <dbl> 51.19778, 50.68251, 50.94100, 50.90586, 50.94324, 5…
#> $ lon <dbl> 16.11739, 16.61735, 14.91679, 14.96717, 14.91333, 1…
Powyższa funkcja wczytała ramkę danych zawierającą podstawowe
informacje o stacjach takie jak, kod stacji, typ i rodzaj stacji oraz
identyfikujące lokalizacje stacji. W celu lepszego zorientowania się
gdzie zlokalizowane są stacje, przygotowano funkcję
gios_vis, którą generuję interaktywną mapę lokalizacji
stacji. Każda stacja ma przypisaną etykietę w postaci kodu stacji.
gios_vis(data = meta %>% filter(is.na(data.zamkniecia))) # tylko aktywne stacjeUwaga! Bank danych lokalnych z którego korzystamy jest aktualizowany raz w roku. Zwiazku z tym powyższa interaktywna mapa przedstawia stacje, które mierzyły poziomy stężeń zanieczyszczeń w powietrza w roku 2018. Jeśli są wam potrzebne bardziej aktualne dane, to można pozyskać je poprzez portal Download of air quality data. Myślę, że w niedługim czasie i tą bazę danych będzie obsługiwał ten pakiet. Natomiat moje doświadczenia z bazą danych EEA są dość niepokojące. Baza generuje często błędne pliki danych. Pliki z różnych lat mają odmienne kodowanie. Zdarzają sie pomyłki w danych np. rok 2016 jest przesunięty o jedną godzinę (tylko polska) itd… Niestety nie jest to najlepsze źródło danych, mimo że udostępniane są dane dla całej Europy. Dostępne są tylko dane od roku 2013.
Stanowiska pomiarowe
Oprócz metadanych powyższa funkcja umożliwa pobranie danych o
stanowiskach pomiarowych. Są to ważne dane, ponieważ zawierają
informacje jakie substancje są mierzone na każdej stacji. W celu
wczytania tych danych, wystarczy zmienić wartość argument
type = "stand.
stanowiska <- gios_metadane(type = "stanowiska",
download = F,
path = kat_dost,
mode = "wb")dplyr::glimpse(stanowiska)#> Rows: 5,236
#> Columns: 13
#> $ nr <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1…
#> $ kod.stanowiska <chr> "DsBialka-CO-1g", "DsBialka-NO2-1g", "DsBialka-NOx-1…
#> $ kod.stacji <chr> "DsBialka", "DsBialka", "DsBialka", "DsBialka", "DsB…
#> $ nazwa.stacji <chr> "Białka", "Białka", "Białka", "Białka", "Białka", "B…
#> $ stary.kod.stacji <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
#> $ `wskaznik.-.kod` <chr> "CO", "NO2", "NOx", "Pb(PM10)", "PM10", "PM10", "SO2…
#> $ wskaznik <chr> "tlenek węgla", "dwutlenek azotu", "tlenki azotu", "…
#> $ czas.usredniania <chr> "1-godzinny", "1-godzinny", "1-godzinny", "24-godzin…
#> $ typ.pomiaru <chr> "automatyczny", "automatyczny", "automatyczny", "man…
#> $ data.uruchomienia <date> 2004-01-01, 2004-01-01, 2004-01-01, 1990-01-03, 200…
#> $ data.zamkniecia <date> 2005-12-31, 2005-12-31, 2005-12-31, 2005-12-31, 200…
#> $ wojewodztwo <chr> "DOLNOŚLĄSKIE", "DOLNOŚLĄSKIE", "DOLNOŚLĄSKIE", "DOL…
#> $ nazwa.strefy <chr> "strefa dolnośląska_2", "strefa dolnośląska_2", "str…
Załóżmy, że interesuje nas tylko jedna substancja tj.
PM10, ale tylko dane pozyskiwane przy zastosowaniu
metod automatycznych, a nie przy zastosowaniu metody
grawimetrycznej. Dwa chcemy zobaczyć ile takich stacji jest w polsce za
pmocą funkcji gios_vis(). Iteresują nas oczywiscie stacje
aktywne.
# Zidentyfikujemy kody stacji dla które spełniają nasze warunki.
identyfikacja <- stanowiska %>%
filter(`wskaznik.-.kod` == "PM10") %>%
filter(typ.pomiaru =="automatyczny") %>%
pull(kod.stacji)
# Teraz możemy przeprowadzić filtrowanie metadanych, a dane pzedstawić na mapie
gios_vis(data = meta %>%
filter(is.na(data.zamkniecia), # tylko aktywne stacje
kod.stacji %in% identyfikacja)) # tylko PM10, automatyczneStatystyki podstawowe
Oprócz metadanych, za pomocą gios_metadane można
pozyskać plik statystyk za lata 2000-2018. W pliku znajdują sie
wszystkie niezbędne miary statystyczne potrzebne do przeprowadzenia
oceny jakości powietrza w strefach. W tym przypadku obiektem wyjściowym
jest lista zawierajace ramkę danych dla każdej substancji.
statystyki <- gios_metadane(type = "statystyki",
download = F,
path = kat_dost,
mode = "wb")names(statystyki) # nazwy substancji#> [1] "SO2" "NO2" "NOx" "CO" "O3"
#> [6] "C6H6" "PM10" "PM2,5" "Pb(PM10)" "As(PM10)"
#> [11] "Cd(PM10)" "Ni(PM10)" "BaP(PM10)" "WWA(PM10)" "Jony(PM2,5)"
#> [16] "Hg(TGM)" "Formaldehyd" "Depozycja"
statystyki[["PM10"]] %>% glimpse() # podgląd#> Rows: 4,671
#> Columns: 17
#> $ Rok <dbl> 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2001, 200…
#> $ Województwo <chr> "dolnośląskie", "kujawsko-pomorskie", "łódzkie", "m…
#> $ Kod.strefy <chr> "PL0201", "PL0404", "PL1001", "PL1201", "PL1201", "…
#> $ Nazwa.strefy <chr> "Aglomeracja Wrocławska", "strefa kujawsko - pomors…
#> $ Kod.stacji <chr> "DsWrocWie", "KpCiechTezni", "LdLodzWSSEMWodna40", …
#> $ Wskaźnik <chr> "PM10", "PM10", "PM10", "PM10", "PM10", "PM10", "PM…
#> $ Czas.uśredniania <chr> "24g", "24g", "24g", "24g", "24g", "24g", "24g", "2…
#> $ Średnia <dbl> 36.42862, 37.00671, 45.75373, 37.00323, 35.46284, 3…
#> $ Min <dbl> 2.60, 7.00, 14.00, 8.90, 6.00, 12.40, 11.41, 3.90, …
#> $ Maks <dbl> 121.90, 149.00, 133.00, 135.90, 130.00, 120.90, 165…
#> $ `L>50.(S24)` <dbl> 63, 25, 86, 56, 57, 43, 72, 57, 10, 3, 19, 1, 66, 8…
#> $ `36.maks..(S24)` <dbl> 62.30, 44.00, 69.00, 56.30, 58.00, 53.30, 72.20, 59…
#> $ `Perc..90.4.(S24)` <dbl> 64.70, 59.00, 75.00, 58.20, 64.00, 57.70, 88.96, 63…
#> $ `Maks.(S24)` <dbl> 121.90, 149.00, 133.00, 135.90, 130.00, 120.90, 165…
#> $ Liczba.pomiarów <dbl> 311, 149, 268, 310, 296, 244, 149, 276, 348, 76, 18…
#> $ Kompletność <dbl> 84.97, 40.71, 73.22, 84.69, 80.87, 66.66, 40.71, 75…
#> $ `Liczba.Lato/Zima` <dbl> 1.10, 0.66, 1.02, 0.86, 0.66, 1.00, 1.22, 0.83, 0.9…
Dane można łątwo wizualizować z pomocą pakietu ggplot2 w
celu zapoznania się interesujacymi danymi. Naprzykład wyselekconujemy
stężenia średnioroczne pyłu zawieszonego PM10 obliczone na podstawie
danych pozyskanych przy zastosowaniu metody grawimetrycznej.
statystyki[["PM10"]] %>%
filter(Czas.uśredniania == "24g",
Nazwa.strefy == "Aglomeracja Warszawska") %>%
ggplot(., aes(x = Rok,
y = Średnia,
fill = Kod.stacji),
color = "black") +
geom_col(position = position_dodge2(0.2)) +
facet_wrap(~Kod.stacji) +
theme_bw() +
theme(legend.position = "top",
legend.direction = "horizontal") +
labs(x = openair::quickText("Średnie roczne stężenie pyłu zawieszonego PM10 [ug/m3]"),
fill = "kod")Funkcję gios_dowload opisaną w tym rozdziale można
zastosować tylko raz pobierając całą plikową bazę danych jednym
poleceniem. Funkcja pobiera archiwum plików zawarte w Banku danych
lokalnych portalu <powietrze.gios.gov.pl>.
Głównymi argumentami funkcji są url oraz
rok. Wartości tych argumentów przedstawia poniższa tabela,
która jest zapisana w pakiecie jako obiekt zrodlo.
zrodlo %>%
knitr::kable()Poniższy przykład obrazuje, jak pobrać dane dla wybranego roku, w tym
przypadku 2010 r. Gdzie 11 to indeksy wiersza,
a indeksy 1 i 2 oznaczają kolumny obiektu
zrodlo.
pliki_2020 <- gios_download(url = zrodlo[21,1],
rok = zrodlo[21,2],
path = kat_dost,
mode = "wb") # mode - patrz dokumentacja funkcjiTeraz możesz sprawdzić katalog kat_dost i zauważysz, że
pojawił się tam folder o nazwie 2011 przechowujący plikową
bazę danych o stężeniach zanieczyszczeń powietrza w Polsce. Utworzyliśmy
również obiekt wyjściowy, którym jest wektor pliki_2000.
Zawiera on listę nazw plików znajdujących się w folderze
2011 w kat_dost.
pliki_2020#> [1] "2020_As(PM10)_24g.xlsx" "2020_BaA(PM10)_24g.xlsx"
#> [3] "2020_BaP(PM10)_24g.xlsx" "2020_BbF(PM10)_24g.xlsx"
#> [5] "2020_BjF(PM10)_24g.xlsx" "2020_BkF(PM10)_24g.xlsx"
#> [7] "2020_C6H6_1g.xlsx" "2020_Cd(PM10)_24g.xlsx"
#> [9] "2020_CO_1g.xlsx" "2020_DBahA(PM10)_24g.xlsx"
#> [11] "2020_formaldehyd_1g.xlsx" "2020_Hg(TGM)_1g.xlsx"
#> [13] "2020_Hg(TGM)_24g.xlsx" "2020_IP(PM10)_24g.xlsx"
#> [15] "2020_Ni(PM10)_24g.xlsx" "2020_NO_1g.xlsx"
#> [17] "2020_NO2_1g.xlsx" "2020_NO2_24g.xlsx"
#> [19] "2020_NOx_1g.xlsx" "2020_O3_1g.xlsx"
#> [21] "2020_Pb(PM10)_24g.xlsx" "2020_PM10_1g.xlsx"
#> [23] "2020_PM10_24g.xlsx" "2020_PM2.5_1g.xlsx"
#> [25] "2020_PM2.5_24g.xlsx" "2020_SO2_1g.xlsx"
#> [27] "2020_SO2_24g.xlsx"
Nazewnictwo plików jest jednorodne w całej bazie danych. Zaczyna się od roku, następnie nazwa substancji i czas uśredniania wyników. Powyższy obiekt może posłużyć do wczytania bazy danych, o czym napiszę więcej w rozdziale nr 3.
Wektor pliki, możomy utworzyć w dowolnym momencie. Nie musimy pobierać drugi raz bazy dnaych, by utworzyć ten plik.
pliki_2020 <- dir(paste0(kat_dost, "/2020"))Możemy od razu pobrać całą plikową bazę danych jednym poleceniem.
Może to jednak chwilę potrwać. Zależy od szybkości
transferu danych. Rozpakowane pliki zajmują 630 MB.
Dobrze jest sprawdzić, czy macie tyle wolnego miejsca w lokalizacji
kat_dost.
Zalecam pobranie całej bazy danych. Napisana w
dalszym rozdziale funkcja zakłada, że pozyskaliśmy pełną bazę danych i
znajduje się ona na naszym dysku w folderze kat_dost.
Ponadto pozyskując całą bazę danych nie będziemy musieli robić tego
ponowanie.
Zastosowana poniżej fukcja map2() jest pętlą która
wykonuje polecenie dla kolejnych argumentów funkcji
gios_downland(). W poniższym przykładzie argumentami
funkcji są odpowiednio .x = url, i .y = rok.
Czyli za .x podstawiamy listę adresów url,
które dostępne są w obiekcie zrodlo[,2], a za
.y podstawiamy argument rok, który dostępnmy
jest w obiekcie żródlo[,2], pozostałe arguemnty są stałe.
Wiecej u rodzie funkcji map z pakietu purrr
znajdziecie w książe R for data
scince lub na stronie projektu purrr
pliki_all <- map2(.x = as.list(zrodlo[,1]),
.y = as.list(zrodlo[,2]),
.f = gios_download,
path = kat_dost,
mode = "wb")Po wykonaniu powyższego polecenia w lokalizacji kat_dost
znajduje sie cała plikowa baza danych składająca się z 19 folderów.
Kazdy folder dla jednego roku kalendarzowego.
Jeśli mamy już pobraną bazę danych, a chcemy utworzyć plik nazw plików danych, to można zrobić to prostym poleceniem.
wek <- 2000:2020 %>%
as.character() %>%
paste0(kat_dost, "/", .)
pliki_all <- map(.x = wek,
.f = dir)W obiekcie pliki_all znajduje sie lista plików. Dobrym
pomysłem jest uzupełnić nazwy poszczególnych elementów listy. Takie
rozwiazanie pozwala nam odwoływać po indeksie rok, do
każdego elementu listy.
names(pliki_all) <- paste0("R",zrodlo[1:21,2])
names(pliki_all)#> [1] "R2000" "R2001" "R2002" "R2003" "R2004" "R2005" "R2006" "R2007" "R2008"
#> [10] "R2009" "R2010" "R2011" "R2012" "R2013" "R2014" "R2015" "R2016" "R2017"
#> [19] "R2018" "R2019" "R2020"
pliki_all["R2016"]#> $R2016
#> [1] "2016_As(PM10)_24g.xlsx" "2016_BaA(PM10)_24g.xlsx"
#> [3] "2016_BaP(PM10)_24g.xlsx" "2016_BbF(PM10)_24g.xlsx"
#> [5] "2016_BjF(PM10)_24g.xlsx" "2016_BkF(PM10)_24g.xlsx"
#> [7] "2016_C6H6_1g.xlsx" "2016_C6H6_24g.xlsx"
#> [9] "2016_Cd(PM10)_24g.xlsx" "2016_CO_1g.xlsx"
#> [11] "2016_DBahA(PM10)_24g.xlsx" "2016_formaldehyd_24g.xlsx"
#> [13] "2016_Hg(TGM)_1g.xlsx" "2016_Hg(TGM)_24g.xlsx"
#> [15] "2016_IP(PM10)_24g.xlsx" "2016_Ni(PM10)_24g.xlsx"
#> [17] "2016_NO2_1g.xlsx" "2016_NO2_24g.xlsx"
#> [19] "2016_NOx_1g.xlsx" "2016_O3_1g.xlsx"
#> [21] "2016_Pb(PM10)_24g.xlsx" "2016_PM10_1g.xlsx"
#> [23] "2016_PM10_24g.xlsx" "2016_PM2.5_1g.xlsx"
#> [25] "2016_PM2.5_24g.xlsx" "2016_SO2_1g.xlsx"
#> [27] "2016_SO2_24g.xlsx"
Nie trudno zauważyc, że lista plików skłąda się z dwóch typów danych. Część plików to dane 1-godzinne, a druga część plików to dane 24-godzinne. Należy pamiętąć, że czas usredniania wyników wynika z stosowanej metody pomiarowej. Dane średniodobe nie są wartościami średnimi obliczonymi na podstawie danych 1-godzinnych.
Napisana poniżej funkcja zakłada, że dane 1g i
24g będą wczytywane niezależnie. Sprawdzimy działanie
naszej funkcji wczytując arkusz zawierającyy informacje stężenia
średniodobowych PM10. W powyższym zestawie danych będą dla
tych samych lokalizacji dostępne zarówno dane 1-g o 24-g dla pyłów
zawieszonych i pyłów PM10.
pm10_2020 <- gios_read(nazwa = "2020_PM10_24g.xlsx",
czas_mu = "24g",
path = kat_dost)pm10_2020#> # A tibble: 62,952 × 4
#> kod sub date obs
#> <chr> <chr> <date> <dbl>
#> 1 DsGlogWiStwo PM10 2020-01-01 27.0
#> 2 DsGlogWiStwo PM10 2020-01-02 63.2
#> 3 DsGlogWiStwo PM10 2020-01-03 20.0
#> 4 DsGlogWiStwo PM10 2020-01-04 12.0
#> 5 DsGlogWiStwo PM10 2020-01-05 18.5
#> 6 DsGlogWiStwo PM10 2020-01-06 21.6
#> 7 DsGlogWiStwo PM10 2020-01-07 29.3
#> 8 DsGlogWiStwo PM10 2020-01-08 16.1
#> 9 DsGlogWiStwo PM10 2020-01-09 15.8
#> 10 DsGlogWiStwo PM10 2020-01-10 14.3
#> # … with 62,942 more rows
Przy pomocy powyższej funkcji możemy wczytać wszystkie dane
1-godzinne lub 24-godzinne za pomocą pętli map_df().
Najpierw jednak musimy zdefiniować listę plików, którą chcemy wczytać.
Funkcja str_detect() wykrywa tylko te pliki, które
posiadają w nazwie człon 24g.
n_data <- map_df(.x = pliki_2020[str_detect(pliki_2020, "24g")],
.f = gios_read,
czas_mu = "24g",
path = kat_dost)Teraz zmienimy układ danych na szeroki, tak by stężenia każdej
substancji znajdowały się w osobnej kolumnie. Taki ukłąd jest bardzo
wygodny w przypadku wykonywania analizy danych z pakietem
openair.
n_data <- n_data %>%
spread(key = sub, value = obs)n_data %>% select(kod, date, SO2, NO2, PM10, PM2.5)#> # A tibble: 71,736 × 6
#> kod date SO2 NO2 PM10 PM2.5
#> <chr> <date> <dbl> <dbl> <dbl> <dbl>
#> 1 DsGlogWiStwo 2020-01-01 NA NA 27.0 NA
#> 2 DsGlogWiStwo 2020-01-02 NA NA 63.2 NA
#> 3 DsGlogWiStwo 2020-01-03 NA NA 20.0 NA
#> 4 DsGlogWiStwo 2020-01-04 NA NA 12.0 NA
#> 5 DsGlogWiStwo 2020-01-05 NA NA 18.5 NA
#> 6 DsGlogWiStwo 2020-01-06 NA NA 21.6 NA
#> 7 DsGlogWiStwo 2020-01-07 NA NA 29.3 NA
#> 8 DsGlogWiStwo 2020-01-08 NA NA 16.1 NA
#> 9 DsGlogWiStwo 2020-01-09 NA NA 15.8 NA
#> 10 DsGlogWiStwo 2020-01-10 NA NA 14.3 NA
#> # … with 71,726 more rows
Z reguły pojedyńczy zestaw danych dla wybranego roku to za mało. Gdy interesują nas realacje zachodzące pomiedzy poszczególnymi danymi potrzebujemy danych z znacznie dłuzszego okresu czasu.
W obiekcie pliki_all znajdują się nazwy wszystkich plików zawartych w bazie danych. Najpierw wykonamy filtorwanie nazw plików, które chcemy wczytać, a następnie wczytamy dane.
pliki_1h_pm10 <- map(.x = pliki_all,
.f = ~ .[str_detect(., pattern = "PM10_1g")]) %>%
flatten_chr()
pliki_1h_pm10 # podgląd listy#> [1] "2003_PM10_1g.xlsx" "2004_PM10_1g.xlsx" "2005_PM10_1g.xlsx"
#> [4] "2006_PM10_1g.xlsx" "2007_PM10_1g.xlsx" "2008_PM10_1g.xlsx"
#> [7] "2009_PM10_1g.xlsx" "2010_PM10_1g.xlsx" "2011_PM10_1g.xlsx"
#> [10] "2012_PM10_1g.xlsx" "2013_PM10_1g.xlsx" "2014_PM10_1g.xlsx"
#> [13] "2015_PM10_1g.xlsx" "2016_PM10_1g.xlsx" "2017_PM10_1g.xlsx"
#> [16] "2018_PM10_1g.xlsx" "2019_PM10_1g.xlsx" "2020_PM10_1g.xlsx"
PM10 <- map_df(.x = pliki_1h_pm10,
.f = gios_read,
czas_mu = "1g",
path = kat_dost)PM10 %>% head()#> # A tibble: 6 × 4
#> kod sub date obs
#> <chr> <chr> <dttm> <dbl>
#> 1 DsBogChop PM10 2003-01-01 00:00:00 90
#> 2 DsBogChop PM10 2003-01-01 01:00:00 61
#> 3 DsBogChop PM10 2003-01-01 02:00:00 75
#> 4 DsBogChop PM10 2003-01-01 03:00:00 76
#> 5 DsBogChop PM10 2003-01-01 04:00:00 79
#> 6 DsBogChop PM10 2003-01-01 05:00:00 50
PM10 %>% tail()#> # A tibble: 6 × 4
#> kod sub date obs
#> <chr> <chr> <dttm> <dbl>
#> 1 ZpSzczPils02 PM10 2020-12-31 18:00:00 16.9
#> 2 ZpSzczPils02 PM10 2020-12-31 19:00:00 18.3
#> 3 ZpSzczPils02 PM10 2020-12-31 20:00:00 17.2
#> 4 ZpSzczPils02 PM10 2020-12-31 21:00:00 19.3
#> 5 ZpSzczPils02 PM10 2020-12-31 22:00:00 22.5
#> 6 ZpSzczPils02 PM10 2020-12-31 23:00:00 23.3
Opracowana funkcja nie identyfikuje starych i nowych kodów stacji. Wprowadzenie takiego rozwiązania wiazało by się z każdorazowym wczytywanie metadanych, co znacząco wydłużyło by działanie funkcji w trakcie wczytywania wielu plików. Ponadto operacje uzgodnienia są potrzebne tylko w przypadku pobierania wieloletniego szeregu czasowego danych. W przyapdku pobrania danych z jednego roku stosowane nazwy będą jednorodne i nie wymagają modyfikacji.
W celu zrozumienia problemu wykonamy prosty przykład. Sprawdzimy
kod.stacji zlokalizowanych w Krakowie.
test <- unique(PM10$kod)
test[str_detect(test, "MpKrak")]#> [1] "MpKrakowWIOSAKra6117" "MpKrakowWIOSBulw6118" "MpKrakowWIOSPrad6115"
#> [4] "MpKrakowWIOSBuja6119" "MpKrakAlKras" "MpKrakBujaka"
#> [7] "MpKrakBulwar" "MpKrakDietla" "MpKrakOsPias"
#> [10] "MpKrakZloRog" "MpKrakTelime" "MpKrakWadow"
#> [13] "MpKrakSwoszo"
Nie trudno zauważyć, że niektóre stacje zlokalizowane na terenie Aglomeracji Krakowskiej mają po dwie nazwy. Nowe kody zostały wprowadzone w 2015 roku i nie pokrywają się z nazwami poprzednich. Ponadto niektóre stacje na których nie jest już prowadzony monitoring nie mają przypisanych nowych kodów.
W celu wyelminowania tego problemy napisano funkcje
gios_kody, która uzgadania nazewnictwo kodow stacji.
PM10n <- gios_kody(data = PM10, meta = meta)Porównajmy kody stacji:
unique(PM10$kod) %>% .[str_detect(., "MpKrak")] # poprzednie#> [1] "MpKrakowWIOSAKra6117" "MpKrakowWIOSBulw6118" "MpKrakowWIOSPrad6115"
#> [4] "MpKrakowWIOSBuja6119" "MpKrakAlKras" "MpKrakBujaka"
#> [7] "MpKrakBulwar" "MpKrakDietla" "MpKrakOsPias"
#> [10] "MpKrakZloRog" "MpKrakTelime" "MpKrakWadow"
#> [13] "MpKrakSwoszo"
unique(PM10n$kod) %>% .[str_detect(., "MpKrak")] # jednorodne#> [1] "MpKrakAlKras" "MpKrakBulwar" "MpKrakowWIOSPrad6115"
#> [4] "MpKrakBujaka" "MpKrakDietla" "MpKrakOsPias"
#> [7] "MpKrakZloRog" "MpKrakTelime" "MpKrakWadow"
#> [10] "MpKrakSwoszo"
Stare kody stacji, zostały zamienione na nowe kody w pobranych danych. Teraz możemy przetwarzać dane
Dotarłes do końca, gratuluję i pozdrawiam