python」カテゴリーアーカイブ

python data.DataReader yahooファイナンスからデータ取得でエラー

参考サイト

https://qiita.com/namkim/items/9b520d9c609cdca2b0fepandasから株価のデータ取得できなくなった件

https://www.bookloveru2.com/post/python-analysis16python(pandas_datareader)の株価取得でエラーが出た方へ

・エラー内容

久しぶりに株価チャートを描画して、グラフの比較をしようと思ったら、以下のエラーが発生。

エラー

RemoteDataError: Unable to read URL: https://finance.yahoo.com/quote/4082.T/history?period1=1647156086&period2=1653278399&interval=1d&frequency=1d&filter=history

調べると仕様が変わったみたい

・対応

モジュール(?ライブラリ)をインストール、自分の場合は、
pip install yfinance

そして以下のモジュールを追記
#2022/05/22 追記
import pandas
from pandas_datareader import data as pdr
import yfinance as yfin
yfin.pdr_override()
#2022/05/22 追記

nlistは配列として使用。個別では’9102.T’みたいに記載する
#df=data.DataReader(nlist,’yahoo’,start,end)#2022/05/22 エラー発生


df = pdr.get_data_yahoo(nlist,start, end) #2022/05/22修正

モジュールを追記して、dfのところを修正すればよい

python 勉強中、 文字列 改行ごとに配列にしたい

テストコード、2022/05/03

実際の使用するコードはこちら

出力結果

Blender3.0 Pythonで3Dテキスト作成でエラー

症状:Mac Blender3.0、 Python3.0を使用してフォント指定して3Dテキスト作成でエラーが発生

去年(Ver2.91?)使ったときはエラーはなかった。おそらくOSのバージョンによりフォントが変わったか
Blender3.0になってBlenderPythonのコマンドが変わったのかも?

原因:

bpy.data.fonts[“HiraginoSans-W6”].nameが使えなくなったかも?詳しくは調べていない。
また、前回のエラーで中途半端なオブジェクトが作成されていたようだ。

エラー内容:

 

調査:

ヒラギノ角ゴシックは存在する。
なのでフォントの指定方法が異なっているかもしれない。
フォントにこだわりがあるわけでもない。
ロードはできているかもしれない。

該当の部分である以下の行
bpy.data.fonts[“HiraginoSans-W6”].name = “HiraginoSans-W6”
をコメントにして動作するかを確認する。
コメントしてエラーはなくなった。

(2)次のエラー

どうやら、テキストオブジェクト名が、「O:27965.94」になっていなくて、標準の「Text.001」みたいになってた。
たぶんオブジェクトNameが正しく更新されていないようだった。
オブジェクトリストのところの、「Text.001」とか「Text.002」とか「Text」を全部削除した。
これでどうなるか試す。
OK
前回のエラーで中途半端なオブジェクトが作成されていたようだ。

また、もし、以下のところでエラーがでたらコメントにしておく
bpy.data.fonts[“HiraginoSans-W6”].name = “HiraginoSans-W6”

今後の対応:

Blenderのバージョンアップがあった場合、
最新版とこのローソク足実行用のバージョンの両方を残すようにする。
つまり、バージョンアップで上書きをしない。(旧版を削除しない)
そして、最新版で動作が確認できたときに、旧版削除する。

MacのBlender3.0で、pythonのpandas_datareaderを実行したらNo module namedというエラーが発生

環境:MacOS、Blender3.0
Macにて、Pythonスクリプトを使用してBlender3.0からPythonスクリプトを実行すると
エラー内容:
ModuleNotFoundError: No module named ‘pandas_datareader’
Error: Python script failed, check the message in the system console

やったこと
ターミナルから
pip uninstall pandas_datareader
pip install pandas_datareader
pip3 install pandas_datareader

でもだめ

結論

以前使用したのはBlender2.91から、新しく3.0にした。そうなると当然Blender3.0のPythonに置き換わってしまう。
よって2.91のときにインストールしたpandas_datareaderは消去されているので、3.0用に
またインストールする必要がある。頻繁にBlenderのPython使わないから忘れている。

やったこと

自分でメモしてた
Mac版BlenderのPythonにPip、pandas_datareaderインストールしたメモ
https://pikucha.sakura.ne.jp/blog/2020/12/27/mac%E7%89%88blender%E3%81%AEpython%E3%81%ABpip%E3%80%81pandas_datareader%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F%E3%83%A1%E3%83%A2/

MacOSのPythonとBlenderのPythonが存在する。つまりBlenderのPythonにpandas_datareaderを個別に
インストール必要がある。Pipもインストールする

以下はターミナルにて、Blenderディレクトリで実行した例である

(1)pipのインストール

ディレクトリのファイルを確認する
get-pip.pyがあるはず。なければBlenderのバージョンディレクトリ(2.9とか3.0とか)が違うか、グーグル先生に聞く。
>あった
(base) ToshironoiMac:bin toshiromaseda$ ls
get-pip.py python3.9

(2)次にget-pip.pyを実行

(3)pandas_datareaderをpipでインストール

/Applications/Blender.app/Contents/Resources/3.0/python/bin/pip install pandas_datareader

pythonでlocalからGoogle Driveへファイルアップロード、テスト中

環境:MacOS
Python
Anaconda、JupiterLab(結果はJupyterLabでは実行できない)、Chrome
ターミナル(こっちでPython実行)

GoogleCloudPlatformの認証設定とJsonファイルのダウンロードが必要

目的:ローカルドライブのCSVをグーグルドライブにアップロードしたい

エラーになったスクリプト、動作しない

 

(1)ライブラリ、モジュールインストール

pip install google-api-python-client
pip install oauth2client
したあとで
WEBで拾ったPythonスクリプトをjupyterで実行したら、
以下のエラー ’client_secret.json’がないということか?


/Users/toshiromaseda/opt/anaconda3/lib/python3.7/site-packages/oauth2client/_helpers.py:255: UserWarning: Cannot access credentials.json: No such file or directory
warnings.warn(_MISSING_FILE_MESSAGE.format(filename))
(略)
InvalidClientSecretsError: (‘Error opening file’, ‘client_secret.json’, ‘No such file or directory’, 2)

(2)間違い

サービスアカウントキー(JSONファイル)の発行が必要らしい
参考
https://algorithm.joho.info/programming/python/google-spread-sheet-py/

GoogleCloudPlatformでプロジェクトを作成して、「ウェブアプリケーション」として
作成した。
https://console.developers.google.com/cloud-resource-manager
>>>これは後ほど間違いで「デスクトップアプリ」で作成する

そのJsonファイルをダウンロードして、実行するPyファイルと同じ階層に
入れておいてリネームしておく
yearhigh2022-4fe5fcXXXXXX.json(ファイル名は仮名)

client_secret.json

そして、スクリプト内のファイル名だけだと、No such fileになるので、フルパス+ファイル名にした。

(3)他のJsonファイルを作成

次のエラー

InvalidClientSecretsError: Invalid file format. See https://developers.google.com/api-client-library/python/guide/aaa_client_secrets Expected a JSON object with a single property for a “web” or “installed” application」

たぶん(2)で取得したJsonファイルではだめらしい。
他のJsonファイルを作成してみる。

スプレッドシートのキーではなくて、ドライブのキーを作成してみる。2022/03/08
https://dev.classmethod.jp/articles/google-spreadsheet-append-csv-from-command-line/

OAuth 2.0 クライアント IDのキーをダウンロードした。
画面の右側に操作という項目があるので、その下にダウロードアイコン(下矢印)をクリックすると
ダウンロードできた。
「client_secret_XXXX.apps.googleusercontent.com.json」というファイルがダウンロードできた。
これをリネームすればよさそう

(4)不要

(>>結果的に、アプリケーションの種類では「デスクトップアプリ」なので
このリダイレクトは不要になった)

次のエラー
Jsonファイルを作成したところまでできた。
「redirect_uris」についてなにか違うようだ。


InvalidClientSecretsError: Missing property “redirect_uris” in a client type of “web”.

https://stackoverflow.com/questions/48362621/oauth2client-clientsecrets-invalidclientsecretserror-missing-property-redirect

GoogleCloudPlatform画面のどこかにURIを設定するようだ

>GoogleCloudPlatform画面の「認証情報」のOAuth 2.0 クライアント IDの欄で
作成したウェブクライアントの編集を行う。

「ウェブ アプリケーション のクライアント ID」画面で
「承認済みのリダイレクト URI」を設定する
http://localhost:8080
そして再度、またJsonファイルをダウンロードする。
リネームした。

jupyterで実行すると、また別のエラーになった
「credentials.json」がないそうだ。2022/03/09


/Users/toshiromaseda/opt/anaconda3/lib/python3.7/site-packages/oauth2client/_helpers.py:255: UserWarning: Cannot access credentials.json: No such file or directory
warnings.warn(_MISSING_FILE_MESSAGE.format(filename))
usage: ipykernel_launcher.py [–auth_host_name AUTH_HOST_NAME]
[–noauth_local_webserver]
[–auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT …]]]
[–logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
ipykernel_launcher.py: error: unrecognized arguments: -f /Users/toshiromaseda/Library/Jupyter/runtime/kernel-ba689470-fac8-4b05-9082-70df85f8e27f.json
An exception has occurred, use %tb to see the full traceback.

SystemExit: 2

空のファイルcredentials.jsonを作成する必要があるらしいので、
空のファイルcredentials.jsonをテキストエディタ(CotEditor)で作成した

(5)ターミナルコンソールでPython

jupyterで実行したらまたエラー


usage: ipykernel_launcher.py [–auth_host_name AUTH_HOST_NAME]
[–noauth_local_webserver]
[–auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT …]]]
[–logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
ipykernel_launcher.py: error: unrecognized arguments: -f /Users/toshiromaseda/Library/Jupyter/runtime/kernel-ba689470-fac8-4b05-9082-70df85f8e27f.json
An exception has occurred, use %tb to see the full traceback.

コマンドライン引数は jupyter では対応できないらしい
https://qiita.com/uenonuenon/items/09fa620426b4c5d4acf9

ということは、JupyterLabで実行しなければよいということか?
つまり、ターミナルコンソールでPythonで実行すればよいのかな?

(6)承認エラー

ターミナルで実行した。
するとChromeが開き、
「承認エラー
エラー 400: redirect_uri_mismatch
このアプリは Google の OAuth 2.0 ポリシーを遵守していないため、ログインできません。

となった。

参考
pydriveで「エラー 400: redirect_uri_mismatch」
https://awesome03.com/2021/01/10/pydrive%E3%81%A7%E3%80%8C%E3%82%A8%E3%83%A9%E3%83%BC-400-redirect_uri_mismatch%E3%80%8D/

GoogleCloudPlatform画面で
アプリケーションの種類では「デスクトップアプリ」を選択する必要があるらしい

GoogleCloudPlatform画面で「+認証情報を作成」をクリック
OAuth 2.0 クライアント IDでアプリケーションの種類では「デスクトップアプリ」を選択
して作成した。
そして、Jsonファイルをダウンロード
client_secret.jsonにリネームした

(7)承認エラー エラー 403: access_denied

実行したらChromeが開き、

アカウント(自分が持ってるアカウント)の選択で、アカウントを選択したらアクセス権がないらしい

承認エラー
エラー 403: access_denied
The developer hasn’t given you access to this app. It’s currently being tested and it hasn’t been verified by Google. If you think you should have access, contact the developer (maXXX@gmail.com).

アクセス権を与えてみる
https://console.developers.google.com/cloud-resource-manager

サービスアカウントの管理から
サービス アカウントでグーグルのアカウントを追加した。
いつも使っているグーグルメール mas***@gmail.com

画像

でもだめだったので
OAuth 同意画面
にテストユーザとして
グーグルアカウントのメールを追加した。

いくつかの画面が表示された
そしてChrome画面に

The authentication flow has completed.

もう一度ターミナルで実行すると
python upload_gdrive.py
Chromeには何も表示されず
ターミナル側にエラーになってた。


Traceback (most recent call last):
File “upload_gdrive.py”, line 32, in <module>
fields=’id’).execute()
File “/Users/toshiromaseda/opt/anaconda3/lib/python3.7/site-packages/googleapiclient/_helpers.py”, line 131, in positional_wrapper
return wrapped(*args, **kwargs)
File “/Users/toshiromaseda/opt/anaconda3/lib/python3.7/site-packages/googleapiclient/http.py”, line 901, in execute
_, body = self.next_chunk(http=http, num_retries=num_retries)
File “/Users/toshiromaseda/opt/anaconda3/lib/python3.7/site-packages/googleapiclient/_helpers.py”, line 131, in positional_wrapper
return wrapped(*args, **kwargs)
File “/Users/toshiromaseda/opt/anaconda3/lib/python3.7/site-packages/googleapiclient/http.py”, line 1021, in next_chunk
raise ResumableUploadError(resp, content)
googleapiclient.errors.ResumableUploadError: <HttpError 403 when requesting None returned “Insufficient Permission: Request had insufficient authentication scopes.”. Details: “[{‘domain’: ‘global’, ‘reason’: ‘insufficientPermissions’, ‘message’: ‘Insufficient Permission: Request had insufficient authentication scopes.’}]”>

このエラーを分析する

(8)エラー

2022/03/10
わかったスコープのURLがReadOnlyだ。ファイルをアップロードするからリードオンリーではだめなはず。
スクリプトに記載のURLがreadonly、読み込みのみ。アップロードするからReadではだめ。
SCOPES = ‘https://www.googleapis.com/auth/drive.metadata.readonly’
#https://www.googleapis.com/auth/drive
#https://www.googleapis.com/auth/drive.file
#https://www.googleapis.com/auth/drive.appdata
#https://www.googleapis.com/auth/drive.apps.readonly

参考8
[Python]GoogleDriveAPIの基本的な使い方
https://zenn.dev/wtkn25/articles/python-googledriveapi-operation
>>わかりやすい
最初にWebで拾ったスクリプトの内容が怪しい、自分の思うように動作しない
ように思えたので、「参考8」サイトを参考にして作り直す。

現在、2022/03/13作業中で、まだ実行すらしていない状態のスクリプト、参考8から抜粋した。

でも実行したらエラー。今ここ。

 

エラー

「Traceback (most recent call last):
File “uploadgoogledrive2.py”, line 26, in <module>
fields=’id’).execute()
File “/Users/toshiromaseda/opt/anaconda3/lib/python3.7/site-packages/googleapiclient/_helpers.py”, line 131, in positional_wrapper
return wrapped(*args, **kwargs)
File “/Users/toshiromaseda/opt/anaconda3/lib/python3.7/site-packages/googleapiclient/http.py”, line 937, in execute
raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/drive/v3/files?fields=id&alt=json returned “Insufficient Permission: Request had insufficient authentication scopes.”. Details: “[{‘domain’: ‘global’, ‘reason’: ‘insufficientPermissions’, ‘message’: ‘Insufficient Permission: Request had insufficient authentication scopes.’}]”>

>たぶんグーグルドライブのフォルダーのパーミッションの読み書きとかの設定が、
違っているのだろう。
またグーグル先生に頼る

(9)
Googleドライブの[設定]-> [アプリの管理]にリストされているアプリケーションを確認
認証しているスコープを確認

>>わかった。スコープの設定を飛ばしたから認証情報(/auth/drive 、auth/drive.file 等の設定)
がなかったのでエラーになってた。

もう一度認証情報を作成することにした。
作成のときにウィザードを選択

 

一度削除して、
設定して、再度Jsonファイルをダウンロードして、リネームした。client_secret.jsonにした
credentials.jsonも空のファイルにした。

2022/03/13、17:34

とりあえず、Chromeで認証まで進めた。
「$ python uploadgoogledrive2.py

Your browser has been opened to visit:

https://accounts.google.com/o/oauth2/auth?client_id=548555605276-j7kpa1otv5b387ekn3ndf6ktlp5aubs3.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&access_type=offline&response_type=code

If your browser is on a different machine then exit and re-run this
application with the command-line parameter

–noauth_local_webserver

Authentication successful.
Traceback (most recent call last):
File “uploadgoogledrive2.py”, line 29, in <module>
print (‘Folder ID: %s’ % file.get(‘id’))
AttributeError: module ‘oauth2client.file’ has no attribute ‘get’

printのところでエラーになってるからとりあえずコメントにしておく
再度実行する


(10)成功、アップロードできた

「Traceback (most recent call last):
File “uploadgoogledrive2.py”, line 42, in <module>
file = drive_service.files().create(
AttributeError: ‘dict’ object has no attribute ‘files’」

dictオブジェクトにfielsアトリビュートがないらしい。でもそんなdictなんてしらない。

25行目で自分に代入しているので別のオブジェクトにしておく
drive_service = drive_service.files()

file = drive_service.files()
ターミナルから実行して、うまくいった。グーグルドライブの指定フォルダにCSVがアップロードできた

以下にうまく行ったコードを記入

Documents/2020年株関連/kabu_python/

uploadgoogledrive2.py

。不要なコードもある

最新版2022/03/22

pythonの引数は原則参照渡しだが、実際は限定的で注意

pythonの引数は、ミュータブル(変更が可能)とイミュータブル(変更ができない)ものが存在する。
つまり参照渡しをしてもイミュータブルの型(int,str,floatなど)は値が変わらないから値渡しと同じになる。ミュータブル型(list,setなど)を使えば参照渡しになる。
引数の値を変えたい場合はミュータブル型にするか、メソッドの返り値として変更した値を受け取るほうが理解しやすい。

参考URL

Python♪次は理屈で覚えよう「参照渡し」「浅いコピー」「深いコピー」
https://snowtree-injune.com/2019/09/16/shallow-copy/#toc7

 

【Python】参照渡しと値渡しの違い

https://algorithm.joho.info/programming/python/call-by-reference/

ボートレース公式サイトから情報を取得するスクレイピング

#2021/07/07
#環境:OS:Mac, 言語python, anaconda, 作業をするときはanaconda jupterのエディタよりMS Codeのほうがやりやすい。
#boatRaceCompuYosou.ipynbで使用
”’
・仕様
ボートレース公式https://www.boatrace.jp/
から「本日の払戻金一覧」のところを
クリックして、本日開催の場の開催時間をクリックする
出走表から結果までの情報を掲載したページが表示される
コンピュータ予想 https://www.boatrace.jp/owpc/pc/race/racelist?
その中のコンピュータ予想タブをクリック
「予想フォーカス」という項目に予想が表示される。
蒲郡  jcd=07 hd=20210707
1R rno=1

 

・目的:予想するレースの当選番号が出現するかもしれないレースを探す。

例えば6-全-全が出現するレースを探したい。その場合コンピュータ予想の予想フォーカスで予想されている番号に
6-全-全に該当しそうな予想が表示されていたら、そのレースを出力したい。
なお、コンピュータ予想は当然ながら、当たるとは限らず確率は低い
すべてのレースの予想を手動で探すのは面倒なので、自動で探したい。

 

・機能:該当のページから必要な情報を取得して、該当の情報(ここでは予想番号)を取得して

CSV出力する。

・予想が当たったか?

結果、ほとんど当たらなかった

作業内容

1.「本日の払戻金一覧」7月7日の場合
https://www.boatrace.jp/owpc/pc/race/pay?hd=20210707
から開催される全レースのURLを取得
2.取得したURLを場ごとに取得。ループ
3.レースごとにループする
4「予想フォーカス」という項目のところの予想番号を取得する
5.予想する番号、例えば6,1の数字があればリストに追加する
6.CSV出力する。該当する予想がなければ出力しない。

 

※使用上の注意点

一度のスクレイピングとCSV出力だけに対応していて、前回作成したCSVを読み込んで処理を追記する仕様はない。
一度作成したファイルに、レース結果を追記変更することはしない。
ようするに、朝実行して、夜に実行しても朝作成したファイルを読み込んで処理をするものではない。
朝実行すると、朝のファイルを作成し、その後実行すればそのWebサイトの情報をCSVとして出力する。

 

>>なぜこのように書くかというと、レースが開催されるとレース結果が払戻金一覧ページに表示される。
レースが開催されていない場合は時刻が記載されていて、出力されるCSVの記載が異なるので、後日CSVの内容を
確認すると、「レース結果が後で追記されるのか?」と勘違いするかもしれない。
現時点では、払戻金一覧のレース前の状態で、コンピュータ予想を知りたいだけの機能である。
よってコンピュータ予想を取得してCSV出力して、その後の処理は何もしない。

 

ソースコード

クラスコード

CSVの出力例 6コースが予想されている番号を出力

その後、改良したクラスコードはこちら

今日のエラー、Python,JupyterLab「ChromeDriver only supports」

環境MacOS,Python,Chrome,JupyterLab、Mysql

症状:JupyterLab上でPythonを実行したらエラーが表示

エラー「

原因:Chromeドライバーのバージョンが異なる。

対応:ドライバーを最新に更新する 最新のバージョンを入れるpipとBrew

ターミナルでバージョンを確認するバージョンをチェックする たぶん古いものが入っている
chromedriver –version

https://sites.google.com/a/chromium.org/chromedriver/downloads
にアクセスして最新の番号を取得する。以下の==の右の方にバージョン番号を入れる。そしてMacのターミナルに以下を実行する

pip install chromedriver-binary==91.0.4472.101
brew reinstall chromedriver
#再度

chromedriver –versionを実行してダイアログエラーが表示された、セキュリティとプライバシーで許可する

Google Colaboratory python df.head 出力されない printで囲め

こんな感じでGoogle Colaboratoryでpythonを実行してheadの中身が表示されなかった。Colabでは単にprintで囲めばよいだけだった。

誤り
dflist=[6050,
3546
]
for list in dflist:
nlist=str(list)+’.T’
df=data.DataReader(nlist,’yahoo’,start,end)
df.head(2)
正しくは
dflist=[]
#1
dflist=[6050,
3546
]
for list in dflist:
nlist=str(list)+’.T’
df=data.DataReader(nlist,’yahoo’,start,end)
print(df.head(2))