(概要)
pandasは、Rのデータフレームのようなものを
python上で、動かすライブラリ。
(詳細)
Rの場合、さらに進化しているので
それに比べると、pandasは
少し洗練されていない感がある。
例えば、下記等。
(1)dplyrライブラリの様には、メソッドチェーンを実行できないこと。
(2)関数型言語で言う所の、flatmapが無く、追加要望のプルリクエストは否決されている。
(なんとなく、この部分は作成者の後進性にも見える。)
しかしながら、pythonの前処理では
現状デファクトスタンダードであるので
無視することはできない。
より良いライブラリが登場するまでは
工夫して使用していくしかない。
また、pythonでは、daskという並列処理に得化した
データフレームのライブラリがある。
使用できるapiが少なくなるので
そのままポーティングできる訳ではないが
チューニング時の逃げ道にはなる。
以下、工夫した点について書いていく。
(工夫点)
(1)欠損値について
数値で、欠損値が出た場合に、「nampy.nan」が当てられてしまう欠点がある。
「日にち」や「実行回数」など、浮動小数点数では本質的に表せない数値があり
後続の処理によっては、「nampy.nan」は不都合である。
まずいことに、「nampy.nan」が当てられると、その列の他の有効値が整数でも
すべて、floatに変換されてしまう。
(例えば、「5」→「5.0」となるが、これが後続処理で、繰り返し5回の意味だとすると、ループ構文でエラーとなる。)
この欠損値が発生するパターンは、2通りある。
・入力レコードリストに、元々欠損値がある場合。
・margeで外部結合した場合に、マスターに結合キーに当たるレコードが存在しない場合。
欠損値は、デフォルト値で埋める等するが
この場合の回避策として考えられることを以下に上げる
(a)pythonの言語機能で処理する
速度を落とさないように、pythonの内包表記などを使用して
前処理の前処理を作成する。
その場合に辞書を使用すると、外部結合相当の処理の
1レコード分の結合の計算量はO(1)となる。
つまり、ハッシュ計算だけで直接アドレスから値取得可能となる。
逐次処理となるが、daskを使用した場合と遜色ない速度がでると予想される。
(実験で確かめるべきだが、次の課題とする。)
(b)作業用の列を作成し、あくまでもpandasで処理する。
(あ)すべてのキーを作成して、それから作業用データフレームを作る
(い)作業用データフレームで、デフォルト値を対象列にセットする
(う)作業用データフレームを駆動表として、入力値のデータフレームを結合する
(え)入力値のデータフレームの値がある列値のみ、対象列にコピーする
上記(b)の方法は、少し難しい点がある。
上記(b)の方法は、少し煩雑であることがネックである。
人によっては、「floatに変換されてしまう」問題自体に対し
腹落ちするまでの理解が、中々得られないこともある。
(データサイエンスを志向する人たちの、集団で問題提起しても
大部分の人は、何が問題なの ? というふうである。
まあ、本処理が統計処理ならば問題にならないので
そう思ってしまうのも無理はないですが。)
あまりレベルが高くない人の場合
実装者中途半端な理解で実装してしまい
(b)の実装法は面倒くさい、あるいは汚い実装に思えてしまい。
注意指摘したとしても、ノーガードで
margeをしてしまう実装に改悪してしまいう
誘惑があるようです。
(人は、分からないものは、見えないものと考え
見えないものは、存在しないものと考え
結果無視することが多々あります。)
ノーガードの実装は、後続処理が
整数を求めているならばバグ実装なので
間違いであるが、事は簡単ではない。
他人の視野の狭さを矯正するのは
中々難しいので、自分を変えるしか
方法はないと思われます。
(結論)
上記理由で、(a)の前処理中の前処理を実装するのが得策と見える。
(おわり)
(実装例を挟みながら、レポートを書いたほうが良いが
今回 はも、時間がないので省略する。追記するかもしれない。)
ところで、黒川先生訳本が出版される予定。
https://www.amazon.co.jp/dp/425412242X
黒川先生だから、よさげに見える。
下記のような本も出るみたい。
原題が「Pandas for Everyone」だから
直訳すると、「みんなのPandas」になるけど
https://www.amazon.co.jp/Pythonデータ分析/機械学習のための基本コーディング!-pandasライブラリ活用入門-impress-top-gear/dp/4295005657/ref=sr_1_5?s=books&ie=UTF8&qid=1546782535&sr=1-5&keywords=pandas