「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

Juliaを使うときのTipsをまとめる(その10/X)

 \mathrm{Julia}を使うのに、今一度

で使い方を整理する。

注意

 参照文献はかなり古い(2019年)ため、現在のバージョンでは動作しない関数などが多いとの評判がある。そこでそういった齟齬があった場合は随時コメントする。なお筆者の環境は、

アプリケーション バージョン
\mathrm{Julia} 1.8.0
\mathrm{Jupyter} \mathrm{Notebook} 6.5.2

である。

2. Juliaによるデータエンジニアリング

2.9 Featherデータを扱う

 \mathrm{Feather}は、バイナリの列指向データシリアライズファイル形式である。この形式はもともと\mathrm{Python}\mathrm{R}間のデータ交換のために開発された。

###
###
###

using Feather
using DataFrames
using Random
Random.seed!(0)

# 
df = DataFrame(x1=[1:3..., missing], x2 = rand(4), x3 = rand(1:10, 4))
#
Feather.write("df.dat", df)
df2 = Feather.read("df.dat")

# 2つが等価なのかを確認
println(isequal(df, df2))

println(" ")
println(describe(df))
println(" ")
println(describe(df2))

2.10 csvファイルとfwfファイルを読み込む

 \mathrm{csv}ファイルを読み込むには\mathrm{DelimitedFiles.jl}モジュールの\mathrm{readdlm}関数を2つのオプションを指定して呼び出せばよい。
 \mathrm{FWF}ファイルを読み込むには独自のパーサを作成しなければならない。ここでは以下に注意しなければならない。

  • \mathrm{nextind}は、\mathrm{nextind}関数を\mathrm{charfrom},\mathrm{charto}に対してブロードキャストし、その結果を...を用いて\mathrm{Substring}の位置引数として展開する。
  • \mathrm{readfwf}関数の引数\mathrm{pairs}の型として指定している\mathrm{AbstractVector}{<\mathrm{:Pairs}}は、\mathrm{AbstractVector}の要素として\mathrm{Pairs}型の任意の具象型を利用できるようにするためである。
  • 全データを\mathrm{IOBuffer}yomiオブジェクトから読み出すと、オブジェクトは空になる。
  • \mathrm{readfwf}関数の最後の行は、配列の配列を簡単に多次元配列に変換できることを意味する。
# IOBufferオブジェクトの生成
csv = """a,b,c
         11,2,3
         4,555,6
         7,8,9999"""
iocsv = IOBuffer(csv)

fwf = """a  b   c   
         11 2   3   
         4  555 66  
         7  8   9999""" # c列は文字数を揃えている→たとえば1行目は「c」ではなく「c   」(半角空欄3文字分)
iofwf = IOBuffer(fwf)

using DelimitedFiles

# csvの読み込み
datacsv, headercsv = readdlm(iocsv,',', header = true)

println("ヘッダー:",headercsv)
println(datacsv)


# fwfの読み込み:組み込み関数は無いので自作
function getsubstring(s::AbstractString, charfrom::Int, charto::Int)
    SubString(s, nextind.(s,0,(charfrom, charto))...)
end

# パーサ
function readfwf(io, ranges::AbstractVector{<:Pair})
    datafwf = []
    starts = first.(ranges)
    ends = last.(ranges)
    while !eof(io)
        line = readline(io)
        push!(datafwf, getsubstring.(line, starts, ends))
    end
    [datafwf[i][j] for i in 1:length(datafwf), j in 1:length(ranges)]
end

datafwf = readfwf(iofwf, [1=>3, 4=>7, 8=>11])
プライバシーポリシー お問い合わせ