Przykład użycia DataFrames i wykresów do analizy danych

Centralne Repozytorium Informacji Publicznej https://dane.gov.pl/ zawiera olbrzymie ilości danych publikowanych przez wszelkie szczeble administracji publicznej (od ministerstw do gmin), innych jednostek budżetowych (biblioteki, uczelnie, agencje), a także firm uczestniczących w projektach itp. Dane dotyczą najróżniejszych aspektów, od demografii, poprzez finanse, mapy, położenia obiektów, pojazdów, itp., itd.

W tym przykładzie wykorzystamy spis punktów świetlnych (latarń) w Kołobrzegu https://dane.gov.pl/pl/dataset/2515,punkty-swietlne-i-punkty-poboru-energii-miasta-kol

Zaczniemy od pobrania danych w formacie CSV i sprawdzenia ich zawartości

using CSV
using DataFrames

df = DataFrame(CSV.File("punkty_swietlne_ok.csv"))

Problem polega na kodowaniu pliku (w tym przypadku UTF-16). Można plik przerobić na odpowiednie kodowanie poleceniem w terminalu, jak w przykładzie z tabelą walut lub załadować go w nieco inny sposób, korzystając z biblioteki StringEncodings

using StringEncodings
df = DataFrame(CSV.File(open(read,"punkty_swietlne_ok.csv", enc"utf-16")))

W nagłówku widzimy, że tabela zawiera 32 kolumny, z których wyświetlonych jest tylko 6. Sprawdźmy nazwy pozostałych

for name in names(df)
    println(name)
end

W dalszej części wykorzystamy na razie informacje o położeniu latarni (x, y)

df.x

Po wartościach można się zorientować, że x jest szerokością geograficzną, a y - długością. Możemy zatem nanieść na mapę takie punkty i sprawdzić gdzie znajdują się latarnie uliczne w Kołobrzegu i nanieść ich położenie na mapie miasta.

Skąd zdobyć mapę?

Projekt https://www.openstreetmap.org/ jest czymś w rodzaju wikipedi map. Dane są otwarte i udostępniane na licencji ODbL.

Niestety mapa Kołobrzegu zawiera zbyt wiele punktów, aby API dostępne przez stronę mogło wyeksportować dane i potrzebne byłoby dodatkowe oprogramowanie. Gdybyśmy naszą zabawę chcieli zautomatyzować, to byłaby istotna część pracy, ale ponieważ zależy nam tylko na jednorazowym wykonaniu wykresu, możemy pozwolić sobie na ręczne zaznaczenie obszaru, odczytanie współrzędnych i wykonania zrzutu ekranu w formacie jpg.

screen.jpg kolo.jpg

Aby wykalibrować mapę podamy współrzędne krawędzi oraz rozmiar w pikselach

lat = [15.5351, 15.6054]
long = [54.1634, 54.1929]
imsize = [821, 589]

Zakładamy oczywiście liniowe odwzorowanie współrzędnych na mapie, więc współczynniki potrzebne do przeliczenia będą następujące

ax = imsize[1] / (lat[2] - lat[1])
bx = -ax * lat[1]

ay = imsize[2] / (long[2] - long[1])
by = -ay * long[1]

px(x) = ax * x + bx
py(y) = ay * y + by

Obrazek możemy wyświetlić za pomocą funkcji imshow.

using GRUtils
imshow("kolo.jpg")

Wystarczy teraz nanieść na obrazku punkty odpowiadające położeniu latarń

Figure(imsize, "px")

imshow("kolo.jpg")
hold(true)
plot(px.(df.y), py.(df.x), "ko", markersize=0.5)

display(gcf())

Zadanie Dane zawierają wiele innych informacji o lampach, np. ich typie, wysokości, kącie nachylenia. Łatwo teraz zmodyfikować kod i oznaczyć np. różne typy lamp, różnymi kolorami, ich wysokości zakodować za pomocą kształtów itp.

Wskazówka: funkcja unique zwraca wektor unikatowych wartości w kolekcji, np.

unique(df.zrodlo)
CC BY-SA 4.0 Krzysztof Miernik. Last modified: December 04, 2023. Website built with Franklin.jl and the Julia programming language.