カテゴリー別アーカイブ: program

python pandas データフレームの日本語で、文字の検索・置換がうまくいかない

m2jのデータを加工するのに、通貨ペアの名前が
‘USD/JPY’だったり’USDJPY’だったりするので統一したい。

とりあえず、さくっと書いてみたけど、
思ったように動作しなくて、データフレームが壊れてしまう。

数字はちゃんと変換されるので、文字コード関係かも知れない。
Shift-JISで使いたいからなぁ。。。

replaceには、encodingオプションなどないし。
ファイルから読み込む時に、str型に変換してしまっているし。

もう少し見てみると。
中でUnicodeに変換するのに失敗しているみたい。

試しに、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もあった。

例えば

これで、文字列の要素がUnicodeに置き換わって、必要な文字置換も完了。

アクセサを使わないで文字列検索や置換を行なう時には、
encode(‘cp932’)しなくても動作するのに。

知らないとハマるよね、コレ。

python pandas データフレームへの代入で警告が出る

Cygwinのpythonだと問題なかったプログラムで、
Macだと SettingWithCopyWarning の警告が出た。

何でCygwinだと稽古が出なかったのかは不明だけど。
SettingWithCopyWarning は出ないようにした方が良さそうだ、
という話。

外のcsvの内容をpandasに読ませたのは良いけど、
そのままの文字列では不都合なので要素の中身を加工しようとして、
アクセサを使ってこんな風に書くと。

警告が出てくる。
結果を見たところ、意図した通りに動作はしているけれど、大変気持悪い。

この原因は、pandasの便利機能を使って要素の選択を行う際に、
中で二度呼びされる…うんぬん。で、予期しない結果になるかも知れないよ、とのこと。

So, why does this show the SettingWithCopy warning / and possibly not work when you do chained indexing and assignment:

dfmi[‘one’][‘second’] = value
Since the chained indexing is 2 calls, it is possible that either call may return a copy of the data because of the way it is sliced. Thus when setting, you are actually setting a copy, and not the original frame data. It is impossible for pandas to figure this out because their are 2 separate python operations that are not connected.

The SettingWithCopy warning is a ‘heuristic’ to detect this (meaning it tends to catch most cases but is simply a lightweight check). Figuring this out for real is way complicated.

The .loc operation is a single python operation, and thus can select a slice (which still may be a copy), but allows pandas to assign that slice back into the frame after it is modified, thus setting the values as you would think.

The reason for having the SettingWithCopy warning is this. Sometimes when you slice an array you will simply get a view back, which means you can set it no problem. However, even a single dtyped array can generate a copy if it is sliced in a particular way. A multi-dtyped DataFrame (meaning it has say float and object data), will almost always yield a copy. Whether a view is created is dependent on the memory layout of the array.

pandasの実装を気にして使っていられないし、
予想外の箇所でこのエラーに遭遇することもある。

なので、アクセサを避けて、言われた通りの使い方をしてみる。

ところが、このままでは警告は消えない。
データのクレンジング作業途中でindexに欠番があったりすると、
そのままでは、さくっと差し替えることも、ちょっと面倒。

あぁ、同じことを言ってる人がいる。
http://stackoverflow.com/questions/25698710/replace-all-occurrences-of-a-string-in-a-pandas-dataframe-python

アクセサを使わないで全体に正規表現で置換をかけると、
SettingWithCopyは出ない。

Columで限定できてないけど、これでOK。

しかも、 encode(‘cp932’) しなくても文字列置換ができた。

この変のAPIの動きは、最近のバージョンで変更になったみたいなので、
要注意。

せっかく便利なアクセサなのに、かえって混乱してしまった。
今後、また仕様が変わるのかも。

python pandasで日本語のcsvファイルを読み込む

pandasのデータフレームやなんかを使いたいけど
読みたいcsvファイルが日本語で、コードがShift-JISな場合、
ちょっとイヤな実装になる。

Python3に乗り換えれば幸せになれるのかな。
でも、GAEやなんかは、まだ当分2.7だろうし。。。

m2jの注文履歴のcsvとか。

予めcsvファイルをUTF-8に変換しておけば、文字コードを意識しなくて済む。

ダウンロードしたままのShift-JISだと、
read_csvで encoding を指定しなければならない。

で、中で使われているstr型の文字コードはUnicodeかutfか、
何かに統一されているのかと思ったら、そうじゃないみたい。

なので、表示したり比較したりするたび
.encode(‘utf-8’) とか、つけないといけない。

場当たり的に対応してると、出来上がったコードは汚くなるなぁ。
良い方法はないものか。

macでOctaveを使う

MATLABが必要になったのだけれど、そんな物を買う予算がある訳もなし、
Octaveをインストールしてみました。

すんなりは動作せず。

No Java runtime present, requesting install.

Javaはインストール済みだけど、ここで必要なのは Java6のruntimeらしい。

そこで、Apple Support Communities の “Java SE 6 on Yosemite?”
https://discussions.apple.com/thread/6601242?start=15&tstart=0

を参考に、以下のURLからパッケージを取得してインストール。
https://support.apple.com/kb/DL1572?locale=ja_JP

無事、OctaveがMacBokkAirで動作するようになりました。

ワーニングは結構でますね。

warning: docstring file ‘/usr/local/Cellar/octave/3.8.1_1/share/octave/3.8.1/etc/built-in-docstrings’ not found
GNU Octave, version 3.8.1
Copyright (C) 2014 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. For details, type ‘warranty’.

Octave was configured for “x86_64-apple-darwin14.1.0”.

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.
For information about changes from previous versions, type ‘news’.

warning: /Users/**/**.m: possible Matlab-style short-circuit operator at line 81, column 76
warning: /Users/**/**.m: possible Matlab-style short-circuit operator at line 81, column 49
error: invalid use of script /Users/*/*.m in index expression

ワーニングの方は、元のソースが ‘&’ と ‘&&’ を混同していたため。
エラーの方は、

少し手直しすれば、MATLABのソースが動きそう。

カレコとオリックスのカーシェアリング比較

そろそろ家の車も古くなって、使わない割に維持費もかかるから
今年は買い替えなくて処分する予定。

何と、この4年の間、家の車を動かしたのはたったの3回。
その内2回は車検に持っていくため…

出張先や旅行先じゃレンタカーだし。
極たまに自家用車が必要になった時にバッテリーが上ってたりして、
ますます使わない。

車… 持ってる意味ないじゃん。

という訳で。
昨年末にキャンペーンでお特に入会できた、
カレコとオリックスのカーシェアリングを試してみた。

カレコ
・首都圏中心のサービス
・家の近所に車が少ない、あっても予約が一杯
・入会と同時に近所のステーションが無くなった
・HPが見易くて予約が簡単
・安い!けど、月会費が必要 (会費をレンタル費用にあてられる)
・予約より早く返却すれば、使った時間分だけ請求される

オリックス
・カレコよりサービス範囲が広い
・家の近所に車が少ない、けど空車が多い
・月会費が無料のプランがあるけど、カレコより結構高い
・HPが使い難くて、検索やweb予約に手間がかかる
・予約より早く返却しても、予約した時間分を請求される

使ってみた感じでは、とでも便利。
うちみたいに普段自家用車が必要ない家庭には良い!
レンタカーより気楽に借りられるし、
レンタル代にガソリンが含まれていて、満タン返ししなくて良いのが便利。

カレコの場合は特に費用が安い。
でも、近所ではなかなか空きがないし、ステーションも少ないから、
実際に急な用事の時には使えなかった。
回転率重視なんだろうなぁ。小さいステーションがポツポツある感じ。
全体的なサービスは満点なんだけど、急ぎの時に借りられないのは致命的。

オリックスでも納得の値段。
探す範囲を少し広げれば、いつでも空車が見付かりそう。
色々不満はあるけれど、家の場合はオリックスの方が向いている。
値段は仕方ないとしても、HPは是非とも改善してほしい。

タイムズは試していないけど、こんな感じ。
・お特なキャンペーンが、なかなか無い (待ってるのに)
・あちこちにステーションがある
・月会費が無料のプランがない

大本命なんだけど、月会費払う程は使わないからなぁ。
カレコ位安ければ、月会費を払っても良いんだけど。

pythonでメソッドをオーバーロードしたいのに

ついC++のオーバーロードの習慣で、メッソや関数を多重に定義してしまうと、
pythonの場合は単に上書きされてしまうので、思った動作をしてくれない。

ある程度ソフトの規模が大きくなった後に
「オーバーロードした」と思い込んで修正を加えて、
しかも、しばらくしてから動作がおかしい事に気付いたりすると、
なかなか原因が解らなくて時間をとられてしまう。

というか、何度もやってしまった。

pythonのFAQ:

Python では、一つのコンストラクタでデフォルトの引数を使ってすべての場合に対応するように書かなければなりません。例えば:

class C:
def __init__(self, i=None):
if i is None:
print “No arguments”
else:
print “Argument is”, i

これで完全に等価とは言えませんが、実用上は十分に近いです。

長さが変えられる引数のリストを試すには、例えば:

def __init__(self, *args):

これと同じやり方がすべてのメソッド定義で使えます。

引数の数が違う場合には、こういう手もあるけど、引数の型違いで区別したい場合…

そもそも python には変数型の概念があまりないのが良いところなのだけど。

仕方がないので、自分のコードで型判定を行なう必要がある。

とか。

う〜ん。カッコ悪い

2015年の3月末までの成果

2015年の3月末までの成果を振り返ってみます。

裁量取引の成果

dyerware.com


2015年の3月の利益はおよそ 27万円/月で、年率 35%のペースです。

3月は、6日の雇用統計があまりに見え見えだったので、発表直後の5分間で10万円ほど上乗せできました。
これが無ければ利益は15万円程度なので、月の目標利益20万円を達成できないところでした。

今後の裁量取引の課題

為替予測プログラムの的中率はやや回復してきましたが、まだまだ頼れるまでではありません。

しばらくは、普通にテクニカル指標を使ったトレードをする予定です。

先月予想した通り3〜5月は難しい季節になりそうなので、控え目なポジションで小まめに利食いしていきたいと思います。

「セルインメイ」の5月に向けて、ポジションを減らしていきます。

月の目標利益は20万円を維持します。

トラリピ成果

トラリピも振り返りたいと思います。

dyerware.com


2015年の3月の利益はおよそ 38万円/月で、年率 30%のペースです。

先月に続いて予算を増やした結果年率は大幅に落ちましたが、動きの少ない中で30%の利益率はなかなかの成果です。
今後も、維持率をみつつ、予算を増やす予定です。

今後のトラリピの課題

先月と変わって、ドル以外の調子が今一つです。

動きの怪しかったポンドと、豪ドル、南アフリカランドのトラリピを止めていたのですが、
それが裏目に出てしまい利益機会が減ってしまいました。

先月の計画通り、増やした予算を使って各通貨の安値のところを厚めに補強しておきました。

予算を増やした分、月の目標利益を10万円に変更します。

裁量取引とトラリピの予算の比率は現在2:1なのですが、今後は逆にトラリピを増やしてしていきたいと考えています。

ようやく調整入り、来年に向けて押し目を拾っていきます

name dir date last-price target losscut score
USDJPY SELL 12/10 118.100 116.200 118.600 100%
AUDJPY SELL 12/08 100.050 96.300 100.950 100%
CADJPY SELL 12/10 103.600 101.900 104.800 100%
EURJPY SELL 12/10 146.500 144.000 147.200 100%
AUDUSD SELL 11/25 0.858 0.825 0.873 100%
NZDUSD BUY 12/10 0.780 0.795 0.775 100%

ようやく、大きめの調整入りです

調整入りを待ち始めてから、結局10円近くも円安がすすみました
かなりの利益機会を逃してしまいましたので
もう少し攻めても良かったかも知れません

とは言え
今回の調整前に全ての建玉を決済しておきましたので
損失は何もありませんし、投資額全てが自由な状態です

この調整では、きちんと押し目を拾っておきたいと思います

GBP買いシグナル点灯、USDJPYの売りシグナルもチラホラ出始めました 待ってた調整はすぐそこ

name dir date last-price target losscut score
GBPJPY BUY 11/26 185.850 186.950 184.250 100%

少し長めに見てみると、USDJPYの売りサインも出てきます

name dir date last-price target losscut score
USDJPY SELL 11/26 117.450 114.750 118.200 100%
GBPJPY BUY 11/24 185.800 189.000 181.800 100%

115円辺りまで落ちたら買いを再開したいと思います。

一方で、トラリピが順調で、トラリピだけで今月の目標20万円を突破しました。
これは楽でいいです。

円安シグナル続出、でも急過ぎるので調整待ち 一方、トラリピは好調

name dir date last-price target losscut score
USDJPY BUY 11/11 115.400 118.600 113.400 100%
AUDJPY BUY 11/11 99.450 101.850 93.000 100%
NZDJPY BUY 10/31 86.000 93.200 83.800 100%
HKDJPY BUY 11/11 14.850 15.010 14.650 100%
ZARJPY BUY 11/12 10.300 10.420 9.550 100%
NZDUSD BUY 11/12 0.781 0.790 0.771 100%

相変わらず、「休むも相場」してます

112円で手仕舞いして
目標額を大きく上回る利益は出ているのですが

その後5円も円安に動いた様子を眺めていると
手仕舞いが早すぎなたなぁ
と、3割位残念なきもちです

ただ、
ここで追いかけて痛い目を有ったことは何度もあるので
大きめの調整が入るのを
辛坊しながら待つことにします

対して、トラリピの方では
積極的に仕掛けているので
11月は既にトラリピだけで20万弱の利益が出ています

裁量取引に慎重になる場面で
トラリピの効果は絶大です

お陰で、手仕舞いが早すぎても
3割位の後悔ですみます