Chain.jlで可読性を高める

Julia でのデータ操作

Katerina Zahradova

Instructor

複雑なコードの問題点

# 読みにくい
combine(groupby(
    select(wages, :year, :eff_2020)
        :year),
        :eff_2020 => mean)
# かっこを忘れがち
combine(groupby(wages, :year, ... )
syntax: incomplete: 
premature end of input ...
# 中間変数が多い
w_tmp = select(wages, :state, :year, :eff_2020)
year_groups = groupby(w_tmp, :year)
combine(year_groups, :eff_2020 => mean)
# 重要なデータを上書きしやすい
select!(wages, :year, :eff_2020)
groupby(wages, :state)
ArgumentError: 
column name "state" not found ...
Julia でのデータ操作

パイプ処理とは?

  • コーディング手法
  • 連続する関数呼び出しをまとめる
  • 読みやすいコードを保つ
  • 中間結果を保存不要
  • ネストなし

パイプ処理

Julia でのデータ操作

Chain.jl を使う

年ごとの最低賃金の平均を計算

  • 必要な列を選択
  • DataFrame を :year でグループ化
  • 年ごとの平均を計算
@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
...
Julia でのデータ操作

_ を使ったパイプ

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

# 複数箇所でパイプするには _ を使う plot(_.year, _.eff_2020_mean)
end

年ごとの実質最低賃金の推移グラフ

Julia でのデータ操作

@aside でパイプを省略

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

# パイプを飛ばすには @aside を使う @aside plot(_.year,_.eff_2020_mean) plot!(_.year,_.state_2020_mean)
end

州別と最低賃金の比較グラフ

Julia でのデータ操作

結果を保存する

# チェーンマクロの出力を変数に保存
wages_mean_by_year = @chain wages begin
    select(:state, :year, :eff_2020, :state_2020)
    groupby(:year)
    combine([:eff_2020, :state_2020] .=> mean)
end
# 先頭行を表示
println(first(wages_mean_by_year))
DataFrameRow
Row | year     eff_2020_mean   state_2020_mean
    | Int64    Float64         Float64
____|_________________________________
   1| 1968     9.28529         6.21549
Julia でのデータ操作

¡Vamos a practicar!

Julia でのデータ操作

Preparing Video For Download...