Julia でやる方法は幾通りかあるが,Query を使う方法を示しておこう。ただし,Query が対応していないものについては,別法で。
using DataFrames, CSV
df = CSV.read("df.csv", DataFrame);
df_long = CSV.read("df_long.csv", DataFrame);
df
3×4 DataFrame
Row | date | USDJPY | EURJPY | SPX |
---|---|---|---|---|
Date | Float64 | Float64 | Int64 | |
1 | 2023-01-01 | 130.0 | 140.0 | 3800 |
2 | 2023-01-02 | 131.0 | 141.0 | 3900 |
3 | 2023-01-03 | 130.5 | 143.5 | 4000 |
df_long
9×3 DataFrame
Row | date | index | value |
---|---|---|---|
Date | String7 | Float64 | |
1 | 2023-01-01 | USDJPY | 130.0 |
2 | 2023-01-01 | EURJPY | 140.0 |
3 | 2023-01-01 | SPX | 3800.0 |
4 | 2023-01-02 | USDJPY | 131.0 |
5 | 2023-01-02 | EURJPY | 141.0 |
6 | 2023-01-02 | SPX | 3900.0 |
7 | 2023-01-03 | USDJPY | 130.5 |
8 | 2023-01-03 | EURJPY | 143.5 |
9 | 2023-01-03 | SPX | 4000.0 |
using Query
以下で, df |> ホニャララ |> DataFrame
のように最後が |> DataFrame
になっているのは,Query の結果が DataFrame ではないためである。DataFrame にしなくても良い場合は,それを省くことができる。また,結果を別のデータフレームにしたい場合は df2 = df |> ホニャララ |> DataFrame
にすればよい。ホニャララは何回も書くことができる。
# 列の選択
df |>
@select(:date, :USDJPY) |>
DataFrame
3×2 DataFrame
Row | date | USDJPY |
---|---|---|
Date | Float64 | |
1 | 2023-01-01 | 130.0 |
2 | 2023-01-02 | 131.0 |
3 | 2023-01-03 | 130.5 |
# 列の変更・追加
df |>
@mutate(USDJPY = 2_.USDJPY) |>
DataFrame
3×4 DataFrame
Row | date | USDJPY | EURJPY | SPX |
---|---|---|---|---|
Date | Float64 | Float64 | Int64 | |
1 | 2023-01-01 | 260.0 | 140.0 | 3800 |
2 | 2023-01-02 | 262.0 | 141.0 | 3900 |
3 | 2023-01-03 | 261.0 | 143.5 | 4000 |
df |>
@mutate(EURUSD = _.EURJPY / _.USDJPY) |>
DataFrame
3×5 DataFrame
Row | date | USDJPY | EURJPY | SPX | EURUSD |
---|---|---|---|---|---|
Date | Float64 | Float64 | Int64 | Float64 | |
1 | 2023-01-01 | 130.0 | 140.0 | 3800 | 1.07692 |
2 | 2023-01-02 | 131.0 | 141.0 | 3900 | 1.07634 |
3 | 2023-01-03 | 130.5 | 143.5 | 4000 | 1.09962 |
# 複数追加する場合は @mutate を繰り返す
df |>
@mutate(EURUSD = _.EURJPY / _.USDJPY) |>
@mutate(foo = 100_.EURUSD) |>
DataFrame
3×6 DataFrame
Row | date | USDJPY | EURJPY | SPX | EURUSD | foo |
---|---|---|---|---|---|---|
Date | Float64 | Float64 | Int64 | Float64 | Float64 | |
1 | 2023-01-01 | 130.0 | 140.0 | 3800 | 1.07692 | 107.692 |
2 | 2023-01-02 | 131.0 | 141.0 | 3900 | 1.07634 | 107.634 |
3 | 2023-01-03 | 130.5 | 143.5 | 4000 | 1.09962 | 109.962 |
# 行の選択
df |>
@filter(_.date == Date("2023-01-02")) |>
DataFrame
1×4 DataFrame
Row | date | USDJPY | EURJPY | SPX |
---|---|---|---|---|
Date | Float64 | Float64 | Int64 | |
1 | 2023-01-02 | 131.0 | 141.0 | 3900 |
# ソート
df |>
@orderby(_.date) |>
DataFrame
3×4 DataFrame
Row | date | USDJPY | EURJPY | SPX |
---|---|---|---|---|
Date | Float64 | Float64 | Int64 | |
1 | 2023-01-01 | 130.0 | 140.0 | 3800 |
2 | 2023-01-02 | 131.0 | 141.0 | 3900 |
3 | 2023-01-03 | 130.5 | 143.5 | 4000 |
df |>
@orderby_descending(_.date) |>
DataFrame
3×4 DataFrame
Row | date | USDJPY | EURJPY | SPX |
---|---|---|---|---|
Date | Float64 | Float64 | Int64 | |
1 | 2023-01-03 | 130.5 | 143.5 | 4000 |
2 | 2023-01-02 | 131.0 | 141.0 | 3900 |
3 | 2023-01-01 | 130.0 | 140.0 | 3800 |
# 重複行の削除 全列を対象にする
df_long |>
@unique() |>
DataFrame
9×3 DataFrame
Row | date | index | value |
---|---|---|---|
Date | String7 | Float64 | |
1 | 2023-01-01 | USDJPY | 130.0 |
2 | 2023-01-01 | EURJPY | 140.0 |
3 | 2023-01-01 | SPX | 3800.0 |
4 | 2023-01-02 | USDJPY | 131.0 |
5 | 2023-01-02 | EURJPY | 141.0 |
6 | 2023-01-02 | SPX | 3900.0 |
7 | 2023-01-03 | USDJPY | 130.5 |
8 | 2023-01-03 | EURJPY | 143.5 |
9 | 2023-01-03 | SPX | 4000.0 |
# 重複行の削除 特定の列を対象にする
df_long |>
@unique(_.date) |>
DataFrame
3×3 DataFrame
Row | date | index | value |
---|---|---|---|
Date | String7 | Float64 | |
1 | 2023-01-01 | USDJPY | 130.0 |
2 | 2023-01-02 | USDJPY | 131.0 |
3 | 2023-01-03 | USDJPY | 130.5 |
# 縦長データに変換
stack(df, [:USDJPY, :EURJPY, :SPX])
9×3 DataFrame
Row | date | variable | value |
---|---|---|---|
Date | String | Float64 | |
1 | 2023-01-01 | USDJPY | 130.0 |
2 | 2023-01-02 | USDJPY | 131.0 |
3 | 2023-01-03 | USDJPY | 130.5 |
4 | 2023-01-01 | EURJPY | 140.0 |
5 | 2023-01-02 | EURJPY | 141.0 |
6 | 2023-01-03 | EURJPY | 143.5 |
7 | 2023-01-01 | SPX | 3800.0 |
8 | 2023-01-02 | SPX | 3900.0 |
9 | 2023-01-03 | SPX | 4000.0 |
# 横長データに変換
unstack(df_long, :index, :value)
3×4 DataFrame
Row | date | USDJPY | EURJPY | SPX |
---|---|---|---|---|
Date | Float64? | Float64? | Float64? | |
1 | 2023-01-01 | 130.0 | 140.0 | 3800.0 |
2 | 2023-01-02 | 131.0 | 141.0 | 3900.0 |
3 | 2023-01-03 | 130.5 | 143.5 | 4000.0 |
# グループ化
gd = groupby(df_long, :index);
using StatsBase
combine(gd, :value => mean => :ave, :value => maximum => :max, :value => minimum => :min)
3×4 DataFrame
Row | index | ave | max | min |
---|---|---|---|---|
String7 | Float64 | Float64 | Float64 | |
1 | USDJPY | 130.5 | 131.0 | 130.0 |
2 | EURJPY | 141.5 | 143.5 | 140.0 |
3 | SPX | 3900.0 | 4000.0 | 3800.0 |