m2jのデータを加工するのに、通貨ペアの名前が
‘USD/JPY’だったり’USDJPY’だったりするので統一したい。
とりあえず、さくっと書いてみたけど、
思ったように動作しなくて、データフレームが壊れてしまう。
1 |
self.order = self.order.replace('/','') |
数字はちゃんと変換されるので、文字コード関係かも知れない。
Shift-JISで使いたいからなぁ。。。
1 |
self.order = self.order.replace('10000','0') |
replaceには、encodingオプションなどないし。
ファイルから読み込む時に、str型に変換してしまっているし。
もう少し見てみると。
中でUnicodeに変換するのに失敗しているみたい。
1 2 |
.../pandas/core/common.py:495: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal mask = arr == x |
試しに、unicodeのデータフレームを作ってみたら、
正しく検索や置換が動作ることを確認した。
わざわざstr型に変換してみたけれど、
やっぱりUnicodeに統一するのが正解みたいだ。
という訳で。
Pythonの文字コードの扱いについて調べてみた。
PythonのUnicodeEncodeErrorを知る
http://lab.hde.co.jp/2008/08/pythonunicodeencodeerror.html
とは言え。
外のShift JISなcsvファイルからpandasに読み込むときには
どうするのが良いのかな。
read_csvした直後は、もうstr型になってしまっているし。
全部の要素をチェックするループを書くのはチョット。。。
なので、Series用のstr アクセサを書くのが、妥当そう。
strアクセサは、 内部のデータ型が文字列(str か unicode ) 型のとき、
その要素に対して、一通りの文字列用メソッドを適用することができる。
使えるstrアクセサ一覧
http://pandas.pydata.org/pandas-docs/stable/api.html#string-handling
当然、encodeやreplaceもあった。
例えば
1 2 3 4 5 6 7 8 |
self.order.no.str.encode('cp932') self.order.name.str.encode('cp932') self.order.dir.str.encode('cp932') self.order.no = self.order.no.str.replace(u'トラリピ#', u'') self.order.name = self.order.name.str.replace(u'/', u'') self.order.dir = self.order.dir.str.replace(u'買',u'BUY') self.order.dir = self.order.dir.str.replace(u'売',u'SELL') |
これで、文字列の要素がUnicodeに置き換わって、必要な文字置換も完了。
アクセサを使わないで文字列検索や置換を行なう時には、
encode(‘cp932’)しなくても動作するのに。
知らないとハマるよね、コレ。