2
1

俺はRubyでの表 (csv, xlsx, xls) 読み込みを少し簡単にしたかもしれない

Posted at

きっかけ

  • Pythonで数値計算とかデータ解析とか触ってみた。
  • Rubyでもやりたくなった。
  • DaruやRoverと言うものを知った。
  • 意外とちゃんと機能が揃っており(失礼)楽しく使っている。
  • が、CSVやExcelの読み込みがpandasよりどうもややこしい。
  • 特にExcelだとGemが乱立している状態で厄介に感じた。
  • というわけで、これもっとシンプルにできないかな?と思ってやってしまった。
  • そしたら、あれ?これ意外と便利じゃない?と思ったので記事にする。

この記事は

Yomiseという自作gemの紹介です。ぶっちゃけ宣伝です。

始め方

ここにあります。
まずはGemのインストール。

gem install yomise

これをやるとDaruやRoverがない場合に一緒にインストールできます。つまり、とりあえずRubyでデータ解析したいって人はyomiseをインストールすると始められます。

使い方

読み込むだけなら至ってシンプルです。
拡張子変わったとき、どのgemを使えばいい?ってもう迷わない。

require "yomise"
df = Yomise.read "test.csv"
df = Yomise.read "test.xlsx"  # エクセル形式もOK。1シート目が読み込まれる
df = Yomise.read "test.xls"   # 古いエクセル形式もOK。同上

こうすると、上記dfはデフォルトでDaru::DataFrameになります
別フォーマットのインスタンスが欲しければオプションにつけます。

require "yomise"
df = Yomise.read "test.csv", format: rover   # Rover::DataFrame
df = Yomise.read "test.xlsx", format: array  # 二次元配列
df = Yomise.read "test.xls", format: hash    # ハッシュ

もうDaruはレガシーって事なんで、Roverをデフォルトにすることも検討中。
あとはNumo::NArrayには対応させたい。これは宿題。

読み込み行の指定

line_from: オプションで読み込み開始行を指定できます。
line_until: は読み込み終了行(指定行の 一行前まで 読み込み)です。
両者とも0以上の整数または正規表現を指定します。

require "yomise"
df = Yomise.read "test.csv", line_from:1  # 1行目(0から数えて2番目の行)以降を読み込み
df = Yomise.read "test.csv", line_from: /Start/  # /Start/に合致する行以降を読み込み
df = Yomise.read "test.csv", line_until: 100  # 0から数えて99行目まで読み込み
df = Yomise.read "test.csv", line_from: 3, line_until: /End/  # 両方指定も可能

ここら辺、とりあえず読み込んでから行削除のプロセスを追加するのが一般的かもしれませんが、上記の記法はpandasのskiprowsみたいに使えて直感的でいいのではと思います。

さらに列に対してcolumn_from, column_untilオプションが使用できますが、正規表現が使えなかったり色々未整備なので飛ばします。

ヘッダー、インデックス

header: オプションで行番号を指定できます。nilにするとデフォルトのヘッダー名をデータフレームに設定します。重複したheaderがあっても末尾に数値を付加することでエラーを回避するあたり、自分に優しい設計です。
index: はインデックス機能をもつDaru::DataFrameのみ対象です。こちらは重複エラー回避機能未整備です。

require "yomise"
df = Yomise.read "test.csv", line_from:5, header: 3

エンコーディング

encoding: オプションで指定できます。ただし現状csv, xlsのみです。

require "yomise"
df = Yomise.read "test.csv", line_from:5, header: 3, encoding: "cp932"

欠損値変換機能

地味に気に入ってる機能です。
現実のcsvやエクセルは、数値行で欠損値とすべきところに余計な文字列が入っていたりします。こういう時、replaced_by_nil: オプションの配列内に指定した文字列を強制的に欠損値(RoverはNaN, それ以外はnil)に変換できます。JuliaのCSVパッケージにおける missingstring オプションの要領ですね。

require "yomise"
df = Yomise.read "test.csv", replacd_by_nil: ["Error", "Range Over"]

上記の場合、Error や Range Over と書かれたセルは NaN や nil に変換されます。

基本的な機能は以上です。

このGemの名づけセンスどうなん

俺もわからん。とりあえず「読み」を頭に付けました。さして意味はないです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1