DataFrames
DataFrames to biblioteka do pracy z danymi w postaci tabel z podobnymi możliwościami jak Pandas w Pythonie. Jest jedną z najważniejszych bibliotek Julii i łączy się z wielomi innymi bibliotekami o bardziej specyficznych zastosowaniach.
Podstawowym obiektem w tej bibliotece jest DataFrame
- tabela danych, którą można sobie wyobrazić analogicznie jak tabele w arkuszach kalkulacyjnych. Kolumny danych mogą mieć nazwy i zawierać różne typy danych.
Tworzenie (wczytywanie) tablicy danych
Jest wiele różnych konstruktorów tego obiektu (methods(DataFrame)
podaje listę 26 metod), które pozwalają na bardzo elastyczne przekazywanie danych z innych struktur takich jak wektory, słowniki, krotki czy macierze.
using DataFrames
using Dates
x = rand(10)
y = rand(10)
df = DataFrame(x=x, y=y)
df = DataFrame(name=["Adam", "Barbara", "Celina"],
birthday=[Date(2000, 05, 07), Date(1999, 01, 22), Date(2001, 11, 29)], height=[175.0, 171.0, 169.5])
d = Dict("name" => ["Adam", "Barbara", "Celina"],
"birthday" => [Date(2000, 05, 07), Date(1999, 01, 22), Date(2001, 11, 29)],
"height" => [175.0, 171.0, 169.5] )
df = DataFrame(d)
nt = (a=[1, 2, 3], b=[0.1, 0.2, 0.5], c=["x", "y", "z"])
df = DataFrame(nt)
y = rand(10, 3)
df = DataFrame(y, :auto)
df = DataFrame(name=String[], value=Float64[])
push!(df, ["A", 1.0])
push!(df, ["B", 2.0])
Często dane wczytywane pochodzą z plików. W przypadku specyficznych formatów trzeba je odpowiednio wczytać do jednej z pokazanych wcześniej struktur, ale jeżeli format jest typowy, jak np. CSV to możemy wczytać taki plik automatycznie
using CSV
df = DataFrame(CSV.File("pasteura.csv", header=13, skipto=15, delim=" ", ignorerepeated=true))
Praca z danymi
Podzbiór danych
Wiersze: po indeksie
df[1:5, :]
df[[1, 30, 60], :]
Kolumny
df[:, [:T2M, :PS]]
df[1:7, [:PS]]
df[!, [:PS]]
df[!, :PS]
df[:, :PS]
df[!, Not(:YEAR)]
df[!, Between(:YEAR, :DY)]
df[!, Cols(x->startswith(x, "P"))]
Po danych
df[df.DY .== 1, :]
df[(df.T2M .< 0.0) .& (df.PS .> 100.0), :]
subset(df, :DY => d -> d .< 10, :MO => m -> m .== 1)
transform!(df, [:YEAR, :MO, :DY] => ((y, m, d) -> Date.(y, m, d)) => :Date)
select!(df, Not([:YEAR, :MO, :DY]))
using GRUtils
plot(Dates.value.(df.Date - Date(2015, 1, 1)), df.T2M)
Dates.value(Date(2015, 03, 01) - Date(2015, 1, 1))
t0 = Dates.now()
Dates.value(Dates.now() - t0)