Migliorare la leggibilità con Chain.jl

Manipolazione dei dati in Julia

Katerina Zahradova

Instructor

Problemi con codice complicato

# Poco leggibile 
combine(groupby(
    select(wages, :year, :eff_2020)
        :year),
        :eff_2020 => mean)
# Facile dimenticare una parentesi
combine(groupby(wages, :year, ... )
syntax: incomplete: 
fine input prematura ...
# Troppe variabili intermedie
w_tmp = select(wages, :state, :year, :eff_2020)
year_groups = groupby(w_tmp, :year)
combine(year_groups, :eff_2020 => mean)
# Rischi di sovrascrivere qualcosa di importante
select!(wages, :year, :eff_2020)
groupby(wages, :state)
ArgumentError: 
column name "state" not found ...
Manipolazione dei dati in Julia

Cos'è il piping?

  • Approccio di coding
  • Unisce più chiamate di funzione in sequenza
  • Mantiene il codice leggibile
  • Niente salvataggi intermedi
  • Niente nidificazione

Pipe

Manipolazione dei dati in Julia

Usare Chain.jl

Calcolare il salario minimo medio per anno

  • selezionare le colonne giuste
  • raggruppare il DataFrame per :year
  • calcolare la media per anno
@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
...
Manipolazione dei dati in Julia

Pipe con _

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

# Usa _ per fare pipe in più punti plot(_.year, _.eff_2020_mean)
end

Grafico del salario minimo effettivo nel tempo

Manipolazione dei dati in Julia

Saltare il pipe con @aside

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

# Usa @aside per saltare il pipe @aside plot(_.year,_.eff_2020_mean) plot!(_.year,_.state_2020_mean)
end

Confronto tra salario statale ed effettivo

Manipolazione dei dati in Julia

Salvare il risultato

# Salva l'output della macro chain in una variabile
wages_mean_by_year = @chain wages begin
    select(:state, :year, :eff_2020, :state_2020)
    groupby(:year)
    combine([:eff_2020, :state_2020] .=> mean)
end
# Stampa la prima riga
println(first(wages_mean_by_year))
DataFrameRow
Row | year     eff_2020_mean   state_2020_mean
    | Int64    Float64         Float64
____|_________________________________
   1| 1968     9.28529         6.21549
Manipolazione dei dati in Julia

Passons à la pratique !

Manipolazione dei dati in Julia

Preparing Video For Download...