始めてPythonをやってみたので、備忘録。オッサンなので記憶メモリが全くないのです。乱文すいません。
始めてのPython
Stay homeで「何かプログラムを作ろう」と考えて思いついたがのが、「ネットにある投資信託CSV情報を取得して、Spreadsheetに書き込む」
というもの、Pythonとは相性良さそうですし、Spreadsheetは普段から触っているのでグラフの表示等がいろいろ便利かな、と思い企画。
Pythonは「米国の金融トレーダにはPythonが必須である」みたいな話もあり、どんなものか興味が湧きました。
ですがプログラムはしない主義だったので、実際は、家のWindows PCに、Pythonインストールし、プログラムを書くエディター選択・インストールからで、予想以上時間がかかり、勉強しながら3日で12時間ぐらいかけました。
主な流れは下記です。
1.Google Cloud PlatformでSpreadsheetから書き込みできる様にする(Python関係なし)
2.サイトからCSVをダウンロードするコードを書く
3.ダウンロードしたデータを該当Spreadsheetにアップデートするコードを書く
Google Cloud PlatformでSpreadsheetから書き込みできる様にする
Pythonと関係なく、セキュリティの関係上、自分のGoogle DriveやGoogle Spreadsheetに「API経由でのアクセスの設定が必要」
自分のGoogleのアカウントで「Google Cloud Platform」のアカウントも作って、自分のスプレッドシートにアクセスできる様にしなければいけない。
手順1.Google APIコンソールでプロジェクトを作成する
手順2.プロジェクトで「アクセスできるAPI」を許容する
手順3.アクセスを許容するCredentialを発行する。
ハマりポイントはアクセス認可だった。
「OAuth 2.0 クライアント ID」と「サービスクライアント」があり、前者はユーザにGoogleアカウントで認証させ、後者はクレデンシャルを抱えたサービスロボット等で使われる。
「OAuth2.0クライアントID」による認証はPythonのサンプルコードも多いが、多数ユーザ向けなので「認証同意画面」を作成しアプリケーション等を登録しなければならず、バッチを動かすのに適さない。
「サービスクライアント方式」の方が良いが、google-api-python-clientやそれをWrapしたPydriveでのcredentialの設定方法が読んでもパッとわからず、結局下記が少し古いが、該当スプレッドシートをアクセスさせるためのクレデンシャルを発行して、クライアントプログラムに埋め込み動かすやり方を参考にしました。
サイトからCSVをダウンロードするプログラムを書く
これはPythonをやっている人なら、一瞬でできますよね。
Chromedriverをダウンロードして、SBIバンガードS&P500の基準価格をCSVをダウンロードするサイトを指定すればOKでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# SBIバンガードのサイトからCSVをダウンロードするプログラム # import os from selenium import webdriver import time # ファイルがあるか確認し、ダウンロード済だったら消しておく # Widnwosのファイルパスの仕方がわからん。/ にしてcp932にしておく if os.path.exists("C:/Users/fintaka/Downloads/基準価額データ.csv"): filepath = "C:/Users/fintaka/Downloads/基準価額データ.csv" filepath.encode('cp932') os.remove(filepath) time.sleep(10) else: print("there is no file") # 実行にファイルパスを入力。 path = os.getcwd() Exefile= path + "\\chromedriver.exe" driver = webdriver.Chrome(executable_path=Exefile) # CSVファイルをダウンロードする driver.get("http://apl.morningstar.co.jp/webasp/yahoo-fund/fund/download.aspx?type=1&fnc=89311199") #CSVダウンロード用のURLを入れる time.sleep(10) #ダウンロードに要する時間を確保する # プログラム終了の合図 print("successful") |
ハマりポイントは、
Windowsのファイルパスにハマる
ダウンロードするとファイル名が「基準価格(1).csv」みたいになるので、ファイルがあったら消す様にするのですが、Windowsのパス指定がややこしい! ファイルパスを”/”にして、SHIFT-JIS(CP932)でエンコードしたら動きました。若干無理やりな感じです。プログラムするのにWindowsって向かないのですね。
ChromedriverとChromeのバージョンが違うと動かない
日本語対応している最新のChromeを使っていたのですが、Chromedriverの方がバージョンが新しくエラーになるということに遭遇しました。バージョンを合わせたら解決。
始めて動かしてこの時点でちょっとワクワクしました。
ダウンロードしたデータを該当Spreadsheetにアップデートする
CSVをSpreadsheetに書き込む処理です。
CSVをアップロードして、Spreadsheetから参照させる方法でも良いのですが、こちらが先に動いたのでこちらにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
import gspread import json import csv import pprint import os import pdb import itertools pdb.set_trace() #ServiceAccountCredentials:Googleの各サービスへアクセスできるservice変数を生成します。 from oauth2client.service_account import ServiceAccountCredentials #Google Cloud APIのScopeの記載。記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive'] #認証情報設定 #ダウンロードしたjsonファイル名をクレデンシャル変数に設定(秘密鍵、Pythonファイルから読み込みしやすい位置に置く) credentials = ServiceAccountCredentials.from_json_keyfile_name('credential.json', scope) #Google APIにログインします。 gc = gspread.authorize(credentials) # URLを指定してワークブックを選択を開く workbook = gc.open_by_url('https://docs.google.com/spreadsheets/d/xxxxxxxxx') worksheet = workbook.sheet1 # csvから読み込 if os.path.exists("C:/Users/fintaka/Downloads/基準価額データ.csv"): print("true") filepath = "C:/Users/fintaka/Downloads/基準価額データ.csv" filepath.encode('cp932') else: print("there is no file") with open(filepath) as f: csvlist = [row for row in csv.reader(f)] #どうもSpreadsheetに食わせるためには一次元配列にするらしい。 datalist = list(itertools.chain.from_iterable(csvlist)) # 列は2つで決め打ち。下記式でセルの書き込み数が取れた。 cell_list = worksheet.range('A1:B'+ str(len(csvlist))) # csvファイルを書き込み for i,cell in enumerate(cell_list): cell.value = datalist[i] # アップデート worksheet.update_cells(cell_list) |
ハマりポイントは、csvの内容をgspreadsheetに書き込むところでした。ここはサンプルコードが見つけられず。
そのまま二次元配列をコピーできることを期待したいのですが上手く行きませんでした。
解りづらいのですが gspreadのcellは「セルの位置、値」との一次的な配列データ構成でした。ですのでcsv側のトータルのデータ量分for分を回す必要がありました。
無事、僕のGoogle Drive上にSBIバンガードS&P500のCSVファイルが引き込めたので、データを加工し、毎日積み立ての損益が出る様グラフを作成しました。
今年から、「SBIバンガードS&P500」を毎日1000円積み立てをやってます。
それなりに戻したのですが、まだマイナスなんですよね。
多分次の好景気まで我慢できればそれなりにプラスになるかと期待いています。 pic.twitter.com/EPkaZ5k8YJ— たかやま@Takayama.O (@takayama70) May 4, 2020
感想
手持ちのWindowsにPythonインストールして、Editorインストールして、後はWebでサンプルや情報を漁ってという進め方でしたが、開発環境はタダだし、ネットに情報は落ちてるし、素晴らしいな。と思いました。
動かしながら記事を漁っていると「グラフがこんな簡単に表示できるんだー」とか「機会学習の画像認識ぐらいだったら簡単そうだな。。」とか、
ですが、現実は知らないことだらけで、実際動かすとハマりポイントも多く時間がかかります。
セミリタイアしたら(できないけど)、プログラムを勉強するのも遊ぶのも楽しいだろうな、と思いました。