そろそろ julia 0.6 から julia 1.0 に移行できるかな? でも変更点多数ですね。

RCall と PyCall が動いたので julia 0.6 から julia 1.0 に移行できるかもしれません。

でも、なぜか .juliarc を読んでくれていないようです。

他にも、戸惑うこと多数です。0.6 のコピー&ペーストは、まず動きません。

きっと短めのプログラムから、少しずつ、自分の方が、適応していかないといけないのでしょう。

日付を扱う Base.Dates が、Dates になっているようです

               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.0.0 (2018-08-08)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> Date(2018)
ERROR: UndefVarError: Date not defined
Stacktrace:
 [1] top-level scope at none:0

julia> using Base.Dates
ERROR: UndefVarError: Dates not defined

julia> using Dates

julia> Date(2018)
2018-01-01

パスの指定時のエスケープシークエンスの使い方が代わっているようです

julia> cd("./Google\ ドライブ/")
ERROR: syntax: invalid escape sequence

julia> cd("./Google ドライブ/")

missing だらけの Array や DataFrame を作ってくれる

julia> Array{Any}(missing, 5,5)
5×5 Array{Any,2}:
 missing  missing  missing  missing  missing
 missing  missing  missing  missing  missing
 missing  missing  missing  missing  missing
 missing  missing  missing  missing  missing
 missing  missing  missing  missing  missing

julia> A1[1,1] = "foo"
"foo"

julia> A1[1,2]=3.14
3.14

julia> DataFrame(A1)
5×5 DataFrame
│ Row │ x1      │ x2      │ x3      │ x4      │ x5      │
├─────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ 1   │ foo     │ 3.14    │ missing │ missing │ missing │
│ 2   │ missing │ missing │ missing │ missing │ missing │
│ 3   │ missing │ missing │ missing │ missing │ missing │
│ 4   │ missing │ missing │ missing │ missing │ missing │
│ 5   │ missing │ missing │ missing │ missing │ missing │

julia> A2 = Array{Any}(missing,8,5)
8×5 Array{Any,2}:
 missing  missing  missing  missing  missing
 missing  missing  missing  missing  missing
 missing  missing  missing  missing  missing
 missing  missing  missing  missing  missing
 missing  missing  missing  missing  missing
 missing  missing  missing  missing  missing
 missing  missing  missing  missing  missing
 missing  missing  missing  missing  missing

julia> DataFrame(A2)
8×5 DataFrame
│ Row │ x1      │ x2      │ x3      │ x4      │ x5      │
├─────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ 1   │ missing │ missing │ missing │ missing │ missing │
│ 2   │ missing │ missing │ missing │ missing │ missing │
│ 3   │ missing │ missing │ missing │ missing │ missing │
│ 4   │ missing │ missing │ missing │ missing │ missing │
│ 5   │ missing │ missing │ missing │ missing │ missing │
│ 6   │ missing │ missing │ missing │ missing │ missing │
│ 7   │ missing │ missing │ missing │ missing │ missing │
│ 8   │ missing │ missing │ missing │ missing │ missing │

ERROR syntax が容赦ない

julia> &(false, true)
ERROR: syntax: invalid syntax &(Core.tuple(false, true))

julia> .&(false, true)
false

mean() すら using Statistics が必要で、dims= というのが必要

julia 1.0 は起動が早いが、色々なものが動いていないようです。

julia> mean
ERROR: UndefVarError: mean not defined

julia> using Statistics

julia> mean
mean (generic function with 7 methods)

julia> A = [1 2 ; 3 4]
2×2 Array{Int64,2}:
 1  2
 3  4

julia> mean(A,1)
ERROR: MethodError: no method matching mean(::Array{Int64,2}, ::Int64)
...略

julia> mean(A,dims=1)
1×2 Array{Float64,2}:
 2.0  3.0

DataFrame を Array に変換できない

julia> using DataFrames # 今のところ、毎回必要!!

julia> hoge = DataFrame(a=[1,2],b=[3,4])
2×2 DataFrame
│ Row │ a │ b │
├─────┼───┼───┤
│ 1   │ 1 │ 3 │
│ 2   │ 2 │ 4 │

julia> Array(hoge)
ERROR: MethodError: no method matching Array(::DataFrame)
...略

今のところ、下記のようにするしかないようです。

julia> Array(hcat(df[1],df[2]))
2×2 Array{Int64,2}:
 1  2
 3  4

もちろん、関数を定義するもよろし。


julia> function df2array(df1::DataFrame)
         A = Array{Any}(missing, size(df1))
         for i in 1:length(df1)
           A[:,i] = df1[:,i]
         end
         return A
       end
df2array (generic function with 1 method)

julia> hoge = DataFrame(a=[1,2],b=[3,4])
2×2 DataFrame
│ Row │ a │ b │
├─────┼───┼───┤
│ 1   │ 1 │ 3 │
│ 2   │ 2 │ 4 │

julia> df2array(hoge)
2×2 Array{Any,2}:
 1  3
 2  4

julia> mean(df2array(hoge), dims=2)
2×1 Array{Float64,2}:
 2.0
 3.0

"2×2 Array{Int64,2}" よりも、メモリーを食べるのかもしれませんが、まあ、ご愛嬌

Array でないと mean() やら std() やら色々動かないので、現段階では、仕事になりません。

もちろん julia 0.6 なら動きます。

               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: https://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.6.4 (2018-07-09 19:09 UTC)
 _/ |\__'_|_|_|\__'_|  |  Official http://julialang.org/ release
|__/                   |  x86_64-apple-darwin14.5.0

julia> hoge = DataFrame(a=[1,2],b=[3,4])
2×2 DataFrames.DataFrame
│ Row │ a │ b │
├─────┼───┼───┤
│ 1   │ 1 │ 3 │
│ 2   │ 2 │ 4 │

julia> Array(hoge)
2×2 Array{Int64,2}:
 1  3
 2  4

contains() が廃止、ismatch()は occursin() になっている

contains() が廃止で、ismatch() が occursin() になっています。julia 0.6 で warning が出ていませんでしたが、突如(?) 起き変っています。ismatch() と同じ文法らしので、contains() とは ()内は、逆順です。もちろん、ブロードキャストも動きます。正規表現も効きますが、下記の注意を参照です。julia 0.6 までのコードは書き変えが必要です。

正規表現を使う時は、1つの要素なら良いですが、ベクトルやArray に使うには、map または broadcast が必要なようです。

julia> occursin(r"^り", string("りんご"))
true

julia> A1 = ["りんご","バナナ","ぶどう"]
3-element Array{String,1}:
 "りんご"
 "バナナ"
 "ぶどう"


julia> occursin(r"^り", A1[1])
true

julia> occursin(r"^り", A1)
ERROR: MethodError: no method matching occursin(::Regex, ::Array{String,1})
Closest candidates are:
  occursin(::Regex, ::SubString; offset) at regex.jl:160
  occursin(::Regex, ::AbstractString; offset) at regex.jl:154
Stacktrace:
 [1] top-level scope at none:0

julia> occursin.(r"^り", A1)
ERROR: MethodError: no method matching length(::Regex)
略

julia> map(x->occursin.(r"^り", x), A1)
ERROR: MethodError: no method matching length(::Regex)
略

julia> map(x->occursin(r"^り", x), A1)
3-element Array{Bool,1}:
  true
 false
 false

find が findall などに置き換わっている

julia> find([false, true])
ERROR: UndefVarError: find not defined
Stacktrace:
 [1] top-level scope at none:0

julia> findall([false, true])
1-element Array{Int64,1}:
 2

ベクトルの一部を書き変える時の ".=" が厳格化している

A というベクトルの特定の要素だけを、ベクトルBを作りたいとします。

[1,2,3] の3だけ、4に起き変えたいと、しましょう。1つだけですが、".="になります。

1.0

julia> A = [1,2,3]
3-element Array{Int64,1}:
 1
 2
 3

 julia> B= deepcopy(A)
 3-element Array{Int64,1}:
  1
  2
  3

  julia> B[B.==3]=4
ERROR: MethodError: no method matching setindex_shape_check(::Int64, ::Int64)
...略

julia> B[B.==3].=4
1-element view(::Array{Int64,1}, [3]) with eltype Int64:
 4
StatsBase.df なる関数が増えている ?

なにげなく、df= DataFrame(hoge,hoge) みたいに書きたくなります。なんと、StatsBase.df とダブると怒られます。私は StatsBase.countmap() を良く使うので、StatsBase を using している為です。

julia> df = deepcopy(df_hoge)
ERROR: cannot assign variable StatsBase.df from module Main

julia> df1 = deepcopy(df_hoge) # これはOK


help?> df
search: df df1 df_in1 df2array df_total1 df_disease df_residual df_age_group df_prefecture modf ecdf findfirst meltdf RoundFromZero stackdf dof diff dof_residual undef isdefined rcdefaults

  No documentation found.

  StatsBase.df is a Function.

  # 1 method for generic function "df":
  [1] df(obj::StatisticalModel) in StatsBase at deprecated.jl:53


type ... end が、struct ... end に変更になっている (python の class ... __init__ ...ってやつです)

python で言うところのクラスの定義は、0.6 までは、type ... end でした。1.0 は、struct ... end になっているようです。

julia> struct Points
           x::Float64
           y::Float64
       end

julia> Points(1,2)
Points(1.0, 2.0)

julia> p1=Points(1,2)
Points(1.0, 2.0)

julia> p1.x
1.0

julia> p1.y
2.0

文字列Array に、replace. が効かない -> map() が必要

文字列の Array やベクトルに replace のブロードキャストが働かなくなっています。map を使わないといけません。

julia> A = ["ABC", "BCD" , "CDF"]
3-element Array{String,1}:
 "ABC"
 "BCD"
 "CDF"

julia> replace.(A, "B" =>"b")
ERROR: DimensionMismatch("arrays could not be broadcast to a common size")
Stacktrace:
 [1] _bcs1 at ./broadcast.jl:439 [inlined]
 [2] _bcs at ./broadcast.jl:433 [inlined]
 [3] broadcast_shape at ./broadcast.jl:427 [inlined]
 [4] combine_axes at ./broadcast.jl:422 [inlined]
 [5] instantiate at ./broadcast.jl:266 [inlined]
 [6] materialize(::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Nothing,typeof(replace),Tuple{Array{String,1},Array{String,1}}}) at ./broadcast.jl:748
 [7] top-level scope at none:0

julia> map(x -> replace(x, "B" =>"b"), A)
3-element Array{String,1}:
 "AbC"
 "bCD"
 "CDF"

まだ、色々ありそう。しばらく、おとなしく、julia 0.6 を使うも、ひとつの判断ですね。

B! LINE