Leesbaarheid verbeteren met Chain.jl

Data manipulatie in Julia

Katerina Zahradova

Instructor

Problemen met ingewikkelde code

# Niet leesbaar 
combine(groupby(
    select(wages, :year, :eff_2020)
        :year),
        :eff_2020 => mean)
# Makkelijk om een haakje te vergeten
combine(groupby(wages, :year, ... )
syntax: incompleet: 
voortijdig einde van invoer ...
# Veel tussentijdse variabelen
w_tmp = select(wages, :state, :year, :eff_2020)
year_groups = groupby(w_tmp, :year)
combine(year_groups, :eff_2020 => mean)
# Gemakkelijk iets belangrijks overschrijven
select!(wages, :year, :eff_2020)
groupby(wages, :state)
ArgumentError: 
kolomnaam "state" niet gevonden ...
Data manipulatie in Julia

Wat is pipen?

  • Codeerstijl
  • Combineert meerdere opeenvolgende functieaanroepen
  • Maakt code leesbaar
  • Geen tussentijdse resultaten nodig
  • Geen nesten

Pipen

Data manipulatie in Julia

Chain.jl gebruiken

Gemiddeld minimumloon per jaar berekenen

  • juiste kolommen selecteren
  • DataFrame groeperen op :year
  • gemiddelde per jaar berekenen
@chain wages begin

select(:state, :year, :eff_2020)
groupby(:year) combine(:eff_2020 => mean)
end
53×2 DataFrame
Row    year    eff_2020_mean
       Int64   Float64
_________________________
1      1968    9.28529
...
Data manipulatie in Julia

Pipen met _

@chain wages begin
    select(:state, :year, :eff_2020)
    groupby(:year)
    combine(:eff_2020 => mean)    

# Gebruik _ om op meerdere plekken te pipen plot(_.year, _.eff_2020_mean)
end

Grafiek van effectieve minimumloon door de jaren

Data manipulatie in Julia

Pipen overslaan met @aside

@chain wages begin
    select(:state, :year,
        :eff_2020, :state_2020)
    groupby(:year)
    combine([:eff_2020,
        :state_2020] .=> mean)

# Gebruik @aside om pipen over te slaan @aside plot(_.year,_.eff_2020_mean) plot!(_.year,_.state_2020_mean)
end

Grafiek die staat- en minimumloon vergelijkt

Data manipulatie in Julia

Resultaat opslaan

# Sla de output van de chain-macro op als variabele
wages_mean_by_year = @chain wages begin
    select(:state, :year, :eff_2020, :state_2020)
    groupby(:year)
    combine([:eff_2020, :state_2020] .=> mean)
end
# Print de eerste rij
println(first(wages_mean_by_year))
DataFrameRow
Row | year     eff_2020_mean   state_2020_mean
    | Int64    Float64         Float64
____|_________________________________
   1| 1968     9.28529         6.21549
Data manipulatie in Julia

Laten we oefenen!

Data manipulatie in Julia

Preparing Video For Download...