Julia&Juno: Get started 2_data frames and pipe operators ver. 6

Last Updated on December 7, 2021 by shibatau

I’m rewriting now.

はじめ方1_インストールとグラフの作成

はじめ方2_データフレームとパイプ演算子

はじめ方3_データフレームの集計

はじめ方4_グラフにラインと文字を入れる

I.Data frames

次に説明があります。

DataFrames

1.直接書く

データフレームの形通りに書けるのがいいです。

区切りをスペースとしていますが、スペースの数は関係ないので、スペースを適当な幅にすれば、きれいな表のスクリプトになります。Rのtribbleと同様です。

julia> supplytable = CSV.read(IOBuffer("""
       prod Epinel Bordeaux Grenoble
       Fuelwood 400 700 800
       Sawnwood 800 1600 1800
       Pannels 200 300 300
       """), delim=" ", ignorerepeated=true, copycols=true)
3×4 DataFrame
│ Row │ prod     │ Epinel │ Bordeaux │ Grenoble │
│     │ String   │ Int64  │ Int64    │ Int64    │
├─────┼──────────┼────────┼──────────┼──────────┤
│ 1   │ Fuelwood │ 400    │ 700      │ 800      │
│ 2   │ Sawnwood │ 800    │ 1600     │ 1800     │
│ 3   │ Pannels  │ 200    │ 300      │ 300      │

2.データを読み込む

CSVファイルの場合

myData = CSV.read("ファイルのパス") 

タブレター区切りの場合

CSV.read("ファイルのパス", delim='\t')  

ネット上のデータの場合

あらかじめ、1行目のライブラリをインストールしておく必要があります。

using DataFrames, HTTP, CSV
resp = HTTP.request("GET", "https://data.cityofnewyork.us/api/views/kku6-nxdu/rows.csv?accessType=DOWNLOAD")
df = CSV.read(IOBuffer(String(resp.body)))
 

スクラッチから作成する場合

df = DataFrame(
colour = ["green","blue","white","green","green"],
shape = ["circle", "triangle"], "square","square","circle"],
border = ["dotted", "line", "line", "line", "dotted"],
area = [1.1, 2.3, 3.1, missing, 5.2])
 

3.よくつかうファンクション

first(df, 6)
show(df, allrows=true, allcols=true)
last(df, 6)
describe(df)
names(df) returns array of column names
[eltype(col) for col = eachcol(df)] returns an array of column types
size(df) (r,c), size(df)[1] (r), size(df)[2] (c)
for c in eachcol(df) iterates over each column
for r in eachrow(df) iterates over each row
 

4.アクセスとフィルター

列にアクセス

「データ名.列名」で列にアクセスできます。Rの「データ名$列名」と同じです。上の文書ではもう一つの書き方がありましたが、なぜかエラーになります。いまのところ原因不明です。

julia> supplytable.prod
3-element WeakRefStrings.StringArray{String,1}:
"Fuelwood"
"Sawnwood"
"Pannels"
 

値(リスト)で行を選び出す

julia> supplytable[ [i in ["Fuelwood","Sawnwood"] for i in supplytable.prod], :]
2×4 DataFrame
│ Row │ prod     │ Epinel │ Bordeaux │ Grenoble │
│     │ String   │ Int64  │ Int64    │ Int64    │
├─────┼──────────┼────────┼──────────┼──────────┤
│ 1   │ Fuelwood │ 400    │ 700      │ 800      │
│ 2   │ Sawnwood │ 800    │ 1600     │ 1800     │

値(数値)で行を選び出す

julia> supplytable[ [i in [400] for i in supplytable.Epinel], :]
1×4 DataFrame
│ Row │ prod     │ Epinel │ Bordeaux │ Grenoble │
│     │ String   │ Int64  │ Int64    │ Int64    │
├─────┼──────────┼────────┼──────────┼──────────┤
│ 1   │ Fuelwood │ 400    │ 700      │ 800      │

II.パイプ演算子

パイプ演算子(Piping operator, |>)を使用してわかりやすいスクリプトを書くことができます。

下はhelpにあるサンプル・スクリプトです。Junoの画面一番下のREPLで、”?調べたい記号”を書き込み実行します。今回は、”|>”を調べたいので、”?|>“を実行しました。

help?> |> # julia>の後に、?|>、と書き込みます。
search: |>

  |>(x, f)

  Applies a function to the preceding argument. This allows for easy function chaining.

  Examples
  ≡≡≡≡≡≡≡≡≡≡

  julia> [1:5;] |> x->x.^2 |> sum |> inv
  0.01818181818181818

julia>

パイプ演算子を用いた次のサンプル・スクリプトが見つかりました。

[1:5;] |> x->x.^2 |> sum |> inv 

次のように、|>で行を分けてわかりやすくすることもできます。#. . .は説明です。

julia> [1:5;] |> # ベクトル[1,2,3,4,5]の
        x->x.^2 |> # 2乗する関数を作成実行し
        sum |> # 合計し
        inv # 逆数を算出する
0.01818181818181818

パイプ演算子を用いず、途中の集計結果に名をつけて、行をわけると次のように長くなります。

vec_1 = [1:5;]
x -> x.^2 # construct a function
exp_1 = (x -> x.^2)(vec_1)
sum_1 = sum(exp_1)
inv(sum_1)
 

参考に、次にそれぞれの集計結果を示します。

julia> vec_1 = [1:5;]
5-element Array{Int64,1}:
 1
 2
 3
 4
 5

julia> x -> x.^2 # make
#86 (generic function with 1 method)

julia> exp_1 = (x -> x.^2)(vec_1)
5-element Array{Int64,1}:
  1
  4
  9
 16
 25

julia> sum_1 = sum(exp_1)
55

julia> 

julia> vec_1 = [1:5;]
5-element Array{Int64,1}:
 1
 2
 3
 4
 5

julia> x -> x.^2 # construct a function
#92 (generic function with 1 method)

julia> exp_1 = (x -> x.^2)(vec_1)
5-element Array{Int64,1}:
  1
  4
  9
 16
 25

julia> sum_1 = sum(exp_1)
55

julia> inv(sum_1)
0.01818181818181818

 

About shibatau

I was born and grown up in Kyoto. I studied western philosophy at the University and specialized in analytic philosophy, especially Ludwig Wittgenstein at the postgraduate school. I'm interested in new technology, especially machine learning and have been learning R language for two years and began to learn Python last summer. Listening toParamore, Sia, Amazarashi and MIyuki Nakajima. Favorite movies I've recently seen: "FREEHELD". Favorite actors and actresses: Anthony Hopkins, Denzel Washington, Ellen Page, Meryl Streep, Mia Wasikowska and Robert DeNiro. Favorite books: Fyodor Mikhailovich Dostoyevsky, "The Karamazov Brothers", Shinran, "Lamentations of Divergences". Favorite phrase: Salvation by Faith. Twitter: @shibatau

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.