Cải thiện tính dễ đọc với Chain.jl

Xử lý dữ liệu trong Julia

Katerina Zahradova

Instructor

Vấn đề với mã phức tạp

# Khó đọc 
combine(groupby(
    select(wages, :year, :eff_2020)
        :year),
        :eff_2020 => mean)
# Dễ quên dấu ngoặc
combine(groupby(wages, :year, ... )
syntax: incomplete: 
premature end of input ...
# Nhiều biến trung gian
w_tmp = select(wages, :state, :year, :eff_2020)
year_groups = groupby(w_tmp, :year)
combine(year_groups, :eff_2020 => mean)
# Dễ ghi đè dữ liệu quan trọng
select!(wages, :year, :eff_2020)
groupby(wages, :state)
ArgumentError: 
column name "state" not found ...
Xử lý dữ liệu trong Julia

Piping là gì?

  • Cách viết mã
  • Kết hợp nhiều lời gọi hàm liên tiếp
  • Giữ mã dễ đọc
  • Không cần lưu biến trung gian
  • Không lồng nhau

Piping

Xử lý dữ liệu trong Julia

Dùng Chain.jl

Tính lương tối thiểu trung bình theo năm

  • chọn đúng cột
  • nhóm DataFrame theo :year
  • tính trung bình theo năm
@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
...
Xử lý dữ liệu trong Julia

Pipe với _

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

# Dùng _ để pipe ở nhiều chỗ plot(_.year, _.eff_2020_mean)
end

Biểu đồ lương tối thiểu hiệu lực theo năm

Xử lý dữ liệu trong Julia

Bỏ qua pipe với @aside

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

# Dùng @aside để bỏ qua pipe @aside plot(_.year,_.eff_2020_mean) plot!(_.year,_.state_2020_mean)
end

Biểu đồ so sánh lương bang và lương tối thiểu

Xử lý dữ liệu trong Julia

Lưu kết quả

# Lưu kết quả của macro chain vào biến
wages_mean_by_year = @chain wages begin
    select(:state, :year, :eff_2020, :state_2020)
    groupby(:year)
    combine([:eff_2020, :state_2020] .=> mean)
end
# In dòng đầu tiên
println(first(wages_mean_by_year))
DataFrameRow
Row | year     eff_2020_mean   state_2020_mean
    | Int64    Float64         Float64
____|_________________________________
   1| 1968     9.28529         6.21549
Xử lý dữ liệu trong Julia

Ayo berlatih!

Xử lý dữ liệu trong Julia

Preparing Video For Download...