pandasのdataframeの列名に「&」が入っているとpycharmのdebug時に確認できない

題名の通り。

理由は調べられていないが、pycharm使ってpandasのdataframeをdebugして中身を確認していたときに、何故かデータが表示されなくて悩んだ。

カラム名「&」が含まれるものがあり、「&」を削除したら表示された。

 

(追記)

 

stackoverflow.com

Bandit Algorithms Book

有力な情報を観測したのでここにメモ。

pythonのparamikoを使用したSFTPで、GETしたときに「PermissionError: [Errno 13] Permission denied: windowsのフォルダ名」

久しぶりに大ハマリ。。。

pythonのparamikoというライブラリを使用してSFTPダウンロードしたファイルをwindowsに保存するだけのプログラムなんだけど、「PermissionError: [Errno 13] Permission denied: フォルダ名」というエラーになってしまう。

Windows10のセキュリティ設定の問題かと思い下記を疑い試してみたが全く改善しなくてハマった。

・フォルダが読み取り専用になっているためにダウンロードしたファイルを置けないため、該当フォルダへの書き込み権限をユーザに与える → それでもPermissionError: [Errno 13] Permission denied
・pycharmを起動しているユーザの権限が足りないため、Administratorで起動して実行してみる → それでもPermissionError: [Errno 13] Permission denied
・pycharmを起動しているユーザが作成したフォルダへ、新しくフォルダを作成してそこにダウンロードを試みる → それでもPermissionError: [Errno 13] Permission denied

これで完全にお手上げで困ったが、ふとプログラムを見直してみる。

import paramiko

ssh_client = paramiko.SSHClient()

ssh_client.connect(hostname, port, username, password)
sftp_connection = ssh_client.open_sftp()
sftp_connection.get(remote, local)

ここでremoteにはファイル取得先SFTPサーバのディレクトリ名を含めたファイル名を、localにはファイルをダウンロードする場所のフォルダ名を指定していた。これが間違い。
getの第2引数であるlocalにはフォルダ名だけではなく、ファイル名まで指定したものを指定しなければならない。
これをフォルダ名だけにしておくとPermissionError: [Errno 13] Permission denied: windowsのフォルダ名」というエラーとなるようだ。

pandasメモ

#1列目取得(列番号指定)
df.iloc[:, [0]] ← DataFrameで取得
df.iloc[:,1] ← Seriesで取得

#1行目取得(列番号指定)
df.iloc[0,:]

#1〜3行目取得
df[0:3]
#データフレームdfの2列目にKeyWordが含まれるかを調べてbooleanのDataframeで返す。
df.iloc[:, [1]].isin(['KeyWord'])


#データフレームdfの2列目にKeyWordが含まれるかを調べてbooleanのSeriesで返す。
df.iloc[:, 1].isin(['KeyWord'])

#booleanのSeriesを利用してデータフレームdfからTrueの行だけを抽出してDataFrameで返す
#df[BooleanのSeries]として記述
df[df.iloc[:, 1].isin(['KeyWord'])]

#列番号でdataframeの特定の列を消す
df.drop(df.columns[[0, 18]], axis=1)
#1行目を列名に設定して1行目を消す
df.columns = df.iloc[0]
df = df.drop(0)

#インデックスの振り直し(インデックス列は削除して列に追加しないようにする)
df = df.reset_index(drop=True)

pythonでの相対パスの扱い

ちょっと勘違いしていたことがあったのでメモ。

次のようなパッケージの階層構造を考える。

package1
 −fileDir(ファイル置き場)
  −file.conf
 −package2(共通クラス置き場)
  −common.py
 −package3-1
−aaa.py
  −test
   −test_aaa.py
  −package4
−bbb.py
   −test
    −test_bbb.py

当初、common.pyからファイル置き場ディレクトリを参照する際に、次のように書いていた。

codecs.open('../../fileDir/file.conf', 'r', encoding='utf-8')


この状態でtest_aaa.pyからcommon.pyのインスタンスを作成して呼びだしてその中でfile.confを読み込もうとした場合は問題なく動いていた。
ただ、test_bbb.pyから同じようにcommon.pyのインスタンスを作成して呼び出してその中でfile.confを読もうとしても、「FileNotFoundError: [Errno 2] No such file or directory」となる。

つまり、相対パスは、common.pyからの相対パスではなく、test_aaa.pyやtest_bbb.pyからの相対パスとなる。

これを解消するには絶対パスを取得して相対パスとつなげれば良さそう。
下記によって調べたところ、os.path.dirname(os.path.abspath(__file__))を使えば良さそう。

os.path.dirname(os.path.abspath(__name__)) ← これだとtest_aaa.pyやtest_bbb.pyの絶対パスとなる。
os.path.dirname(os.path.abspath(__file__)) ← これだとcommon.pyの絶対パスとなる。

EURUSDは漸く下がってきた

EUR意外と下がらんなぁ」で書いてから1ヶ月。
漸くいい感じに下げてきている。相場を見ている暇は無いが。

すぐには下げずに、そこは想定外だったけど、EURは下がるしかないと思っているからね。

全ての理由は「ECB後の期待はずれでEUR売り。EURも期待で買われて事実で売られる。」で書いた通り。

ドル円が下げているのは円買なんだろうね。トルコリラとか下げている状況でのリスクオフなんだろうね。

KU描きたいけど、ReuterのEikonを解約したというか兎に角使えなくなったので、MT4を再開するとか何らかのデータソースを確保するまではお預け。ただ、当分余裕が無いので描かない予定。

Google Cloud Visionを使ってみようとしたときの「TypeError: Object of type 'bytes' is not JSON serializable」

久しぶりにGoogle Cloud Visionを使ってみようとしたら「TypeError: Object of type 'bytes' is not JSON serializable」。

巷に落ちているサンプルコードをそのまま試してみた。
それが次のようなやつ。

# 画像読み込み
img_file_path = './input/'
img_file_name = 'sample.jpg'
img = open(img_file_path+img_file_name, 'rb')
img_byte = img.read()
img_content = base64.b64encode(img_byte)

# リクエストBody作成
item = {
    'requests': [{
        'image': {
            'content': img_content
        },
        'features': [{
            'type': 'LABEL_DETECTION',
            'maxResults': 10,
        }]
    }]
}
req_body = json.dumps(item)

そしたら、次のエラーが出たの。

TypeError: Object of type 'bytes' is not JSON serializable

ライブラリのバグなのか仕様変更なのか調べたら、ここで議論されているように「img_content = base64.b64encode(img_byte).decode("utf-8")」としてutf-8でdecodeすれば解決した。
なんで?base64encodeしてからutf-8でdecode。

# 画像読み込み
img_file_path = './input/'
img_file_name = 'sample.jpg'
img = open(img_file_path+img_file_name, 'rb')
img_byte = img.read()
img_content = base64.b64encode(img_byte).decode("utf-8")

# リクエストBody作成
item = {
    'requests': [{
        'image': {
            'content': img_content
        },
        'features': [{
            'type': 'LABEL_DETECTION',
            'maxResults': 10,
        }]
    }]
}
req_body = json.dumps(item)