julia で CSV ファイルを編集

julia もversion 1 が出て仕様の変更が少なくなりました。それでも慣れた R や Pythone と比べると、いまひとつという印象の方もいらっしゃるでしょう。

さて、この Julia は、CUI で CVS ファイルを編集するのに、実はとても向いています。住所録、顧客情報のような CSV の編集に、用途によってはとても向いています。たとえば、Unix のファイル、ディレクトリー、 ユーザー管理のような気分で、CSV 編集をしたい場合には、選択肢になるかもしれません。

仮に、 R で因子 (表計算ソフトで言うところのセルの値) を上書きをしようとすると level などの様々な因子が障害になってしまします。連結も、特に下方向に連結時は、単なる行と列の大きさのみでは語れないことがあります。
良くも悪くも、Julia は、素直に上書きしてくれます。もともと R を使っていましたので、DataFrames パッケージを使うのが好みです。 julia は日本語の文字列も、予想以上に上手に扱います。ただし、エンコードは、UTF-8 にしないといけません。
julia では、DataFrames は、カンマ区切り、つまり、CSV ファイルをオプションなしの CSV.read()、CSV.write() で扱え、CSV形式との親和性の良さを感じます。

列方向や行方向の追加も、とても簡単です。連結可能な大きさと要素のベクトルまたはデータフレーム a と b について、[a b] で a の左に、[a;b] で、a の下に b をたしてくれます。 hcat(a,b), vcat(a,b) の方が実行速度は速いです。ただし、下に足す場合は、上の DataFrame の属性に合せる必要があります。具体的には、文字列か、数値か (Int, Float) の程度の区別は必要になります。事前に、表の設計が、しっかりと決っている場合は、ありま問題にならないと思います。なお、missing (NA) については、タテ方向の結合 vcat() 時に問題になることがあります。それでも、なんだか、とても自由に表を結合、分割し、編集できる印象です。

日付は、"yyyy-mm-dd" で入力しておくと、Date("yyyy-mm-dd") で日付に読みかえが可能です。計算しないなら、文字列のままでも、支障はないでしょう。

注意点は、上書きを間違えると、元には戻せないことです。バックアップ用にデータフレームを deepcopy() でコピー (操作は "=" 代入です) しておくのが良いでしょう。単純な "=" での代入は、リンクが貼られるので注意です。このあたりは python と同じでしょう。python なら [:] を使うということです。sort() などでも、リンク全体の順番が換ることがありますので、別の表として編集時は、deepcopy() しておくと良いことが多いと思います。

住所録などを手で修正や編集の場合は、

  • 編集対象の特定領域と残りの領域に分ける
  • データを編集
  • 連結しなおす
のが良いと考えています。とびとびの番地を手入力はとても危険です。採り出しておいてから編集することで、一旦、目で確認しやすくなります。もちろん、上書きしなければ、元のデータは、そのままです。
数百行を越えるような、データフレームの入力で、繰り返しや、複雑なソートなどがある場合は、julia での編集は、とても良い手段になります。julia は、プログラム言語ですから、for ~ end での繰り返し構文や、if ~ end 構文、複数要素での優先順位をつけたソートも sort() でできます。さらに、julia は for ~ end のループ構文に強いので、ともかく、単純に繰り返すような計算には、とても向いています。計算の複雑さにもよりますが、四則程度や相関を見る程度なら、10^8 回の繰り返しも実用範囲内だと考えています。行列計算を器用に使いこなさなくても、for ~ end のループ構文で、なんとか切り抜けられるはずです。

R の dplyr パッケージのようなパイプ処理については、まだ、R の方が使いやすいかもしれません。やはり、dplyr のようなパイプ処理への要望は強いようです。dplyr のようなパイプ処理も、query.jl で静かに実装されています。dplyr がお好きな人は、試してみても良いと思います。2018年7月の時点では、query.jl は、DataFrame 等に組み直すところで、時間がかかります。パイプ内の演算はとても高速です。query.jl の速度については、別記の 密かに dplyr 様のパイプ処理を可能にしていた julia の Query.jl の異常な速度の不思議 もご覧いただければ幸いです。

速度について、現在、1回目の実行は、コンパイルが入る為、とても遅いです。2回目からは、驚く程、速くなることが多いです。それも、遅いと感じる場合は、結果を、全部表示させているからかもしれません。DataFrame や Array の表示は、インデント計算のためか、体感速度が落ちるように感じています。";" を最後に添えると、表示しなくなるので、体感速度が速くなるかもしれません。

B! LINE