2019年5月24日金曜日

[Julia] CSVデータを読み込む

JuliaでCSVデータを読み込む際のメモです.

まずはdownload関数でサンプルデータファイルをインターネットからダウンロードして,データフレームに読み込みます.以下の例では,インターネット上のCSVデータを読み込んでいます.
julia> download("https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data", "iris.csv")
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4551  100  4551    0     0   3003      0  0:00:01  0:00:01 --:--:--  3003
"iris.csv"

isfile関数でファイルがダウンロードできたことを確認します.
julia> isfile("iris.csv")
true

readline関数で1行目を表示します.

julia> readline("iris.csv")
"5.1,3.5,1.4,0.2,Iris-setosa"
readline関数による表示で,1行目がカンマで区切られていて,ピリオドは小数点でヘッダ行がないことがわかります.

CSV.read関数でデータを読み込み,データフレームを確認する.CSV.read関数はCSV形式のファイルを読み込んで,内容をDataFrameに書き込む関数.

julia> using CSV, DataFrames

julia> df = CSV.read("iris.csv", 
                     header = ["PetalLength", "PetalWidth", "SepalLength", "SepalWidth", "Class"]);

thread = 1 warning: only found 1 / 5 columns on data row: 151. Filling remaining columns with `missing`

julia> describe(df)
5×8 DataFrame. Omitted printing of 1 columns
│ Row │ variable    │ mean    │ min         │ median │ max            │ nunique │ nmissing │
│     │ Symbol      │ Union…  │ Any         │ Union…Any            │ Union…  │ Int64    │
├─────┼─────────────┼─────────┼─────────────┼────────┼────────────────┼─────────┼──────────┤
│ 1   │ PetalLength │ 5.84333 │ 4.3         │ 5.8    │ 7.9            │         │ 1        │
│ 2   │ PetalWidth  │ 3.054   │ 2.0         │ 3.0    │ 4.4            │         │ 1        │
│ 3   │ SepalLength │ 3.75867 │ 1.0         │ 4.35   │ 6.9            │         │ 1        │
│ 4   │ SepalWidth  │ 1.19867 │ 0.1         │ 1.3    │ 2.5            │         │ 1        │
│ 5   │ Class       │         │ Iris-setosa │        │ Iris-virginica │ 3       │ 1        │

データフレームの最後の6行を見てみます.

julia> last(df, 6)
6×5 DataFrame
│ Row │ PetalLength │ PetalWidth │ SepalLength │ SepalWidth │ Class          │
│     │ Float64⍰    │ Float64⍰   │ Float64⍰    │ Float64⍰   │ String⍰        │
├─────┼─────────────┼────────────┼─────────────┼────────────┼────────────────┤
│ 1   │ 6.7         │ 3.0        │ 5.2         │ 2.3        │ Iris-virginica │
│ 2   │ 6.3         │ 2.5        │ 5.0         │ 1.9        │ Iris-virginica │
│ 3   │ 6.5         │ 3.0        │ 5.2         │ 2.0        │ Iris-virginica │
│ 4   │ 6.2         │ 3.4        │ 5.4         │ 2.3        │ Iris-virginica │
│ 5   │ 5.9         │ 3.0        │ 5.1         │ 1.8        │ Iris-virginica │
│ 6   │ missing     │ missing    │ missing     │ missing    │ missing        │


julia> eltypes(df)
┌ Warning: `eltypes(df::AbstractDataFrame)` is deprecated, use `eltype.(eachcol(df))` instead.
  caller = top-level scope at none:0
@ Core none:0
5-element Array{Union,1}:
 Union{Missing, Float64}
 Union{Missing, Float64}
 Union{Missing, Float64}
 Union{Missing, Float64}
 Union{Missing, String} 

データ中の最後の行には,missingしかありません(ファイルの末尾に余計な改行が入っていたため).この問題を回避するために,最後の行を切り捨てて,行の型をmissing値を許さない方に変換し,データフレーム中にmissing値がないようにします.

julia> df = disallowmissing!(df[1:end-1, :]);

julia> eltype(df)
Any

データを整理できたので,CSVファイルに書き出します.

julia> CSV.write("iris2.csv", df);

上記の事柄をJupyter Notebook上で実行してみた結果は,GitHubで見ることができます.

0 件のコメント :

コメントを投稿