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)
CC BY-SA 4.0 Krzysztof Miernik. Last modified: December 04, 2023. Website built with Franklin.jl and the Julia programming language.