python」タグアーカイブ

python スクレイピング、BeautifulSoupライブラリ

#株探先物オプションのスクレイピング。取得した文字列をコピペしてTEXTにして、
#CSVに出力してMysqlにインサートするコード
#URLと日付と月限は手動で毎回入力する必要がある。

#以前はファイル作成まで手動で作業していた。
#WEBページを開き
#先物オプションの出来高データを取得して
#テキストファイルにする
#所定のフォルダにコピー、移動する
#個人用クラスメソッドを使う。

いままでWebdriverライブラリを使用していたが、空白部分が自動で削除されてしまった。
削除してほしくなかったので、BeautifulSoupライブラリを使用した。こちらのほうはクロムは起動しないし純粋にhtmlの文字を空白を含めて取得してくれた。
以下は今回作ったコードの一部。class cGetOption()
なおdef returnDriver(self,lurl)はwebdriverを使用したもので実際には採用しなかった。
株探の先物オプションのURLを取得して
そのページの文字列を取得。このとき、ある文字列Aと文字列Bの間の文字を取得(findFirstStrのところ)
そしてタプルで、文字列とファイル名文字列を出力する

https://github.com/maseda1030/yahoofinance_python.git

 

 

MySqlでDB、テーブル作成メモ 備忘録

MySqlでDB、テーブル作成メモ(条件はユーザはすでに作成済)
株式市場の企業の株価と出来高を登録する。
pythonを使ったスクレイピング処理をこれから行う。この記事にはPythonの記載はない。
mysqldbを使用していたがmysql-connector-pythonが良いらしいのでpip install済

ターミナルでの作業

最近忘れっぽくて、使っていないコマンドをどんどん忘れている。SQL文も忘れてるので、備忘録メモとして記載しておく。記憶力の低下に抵抗せずに、メモをしていつでも思い出せるかメモを見ながら作業するようにする。

 

python、テキストファイル出力、配列に文字を連結するだけ

#python、トレーディングビューのリストに追加するテキストファイル出力、配列に文字を連結するだけ
#必要な情報は、リスト名(テキストファイル名)、企業コード(このコードは調べたい企業コードなので、これだけは自分で探さないといけない)

pythonスクレイピング,yahooふぁいファイナンス

#トレーディングビューのウォッチリスト(右側)のインポート(、、、のようなアイコン)で取り込める。テキスト名がリスト名になる
#複数企業の登録が楽になるのでチャートを選ぶのが楽になる。

出力例

Pythonを使ってヤフーファイナンス日経平均株価の時系列を取得、スクレイピング

Python を使ってヤフーファイナンス 日経平均株価の時系列を取得、スクレイピング
#https://stocks.finance.yahoo.co.jp/stocks/history/?code=998407.O
#日経平均株価の時系列のテーブル表から該当の文字列を取得する、日付 始値 高値 安値 終値

https://github.com/maseda1030/yahoofinance_python.git

 

出力例

 

今日のPythonエラー クラスを作ったときにtakes 0 positional arguments but 1 was given

Pythonで
クラスを作ってメソッドを作ったらエラーになった。
takes 0 positional arguments but 1 was given

https://qiita.com/matsuida55/items/4188430631353a7a1194
「pythonはクラスメソッドの引数1つ目に必ず self を取らなければならない。」

・結論
クラスのメソッドの引数は必要なくても、 引数selfを入れなくてはならない。

誤り:エラーになるtakes 0 positional arguments but 1 was given

正しい

 

Pythonを使ってヤフーファイナンス情報を取得、スクレイピング

#複数企業コード対応版 企業コードから企業名と株価を取得する
#Anaconda JupyterLabによる動作 Shift+Enterで実行になる

動作環境:MacOS 、Python、Anaconda JupyterLab

https://github.com/maseda1030/yahoofinance_python.git

面倒だった点は、複数タグが存在するタグ名tr,td,ddの扱い。複数の場合forで回して配列みたいにしてデータを取得する必要があるし、スペースが含まれるクラス名は別のプロパティ?で読み込む必要がある。

find_element_by_class_nameでスペースを含むクラス名はエラーとなるので、find_element_by_css_selectorとしてドット.で接続する。

誤り:el.find_element_by_class_name(‘stocksDtl clearFix’)

正:el.find_element_by_css_selector(“.stocksDtl.clearFix”)

以下はサンプルコード。使い方は、codelistに企業コードを入力すると、ヤフーファイナンスからスクレイピングして「コード、企業名、終値株価、前日比、日付」を半角スペース区切りで出力するだけ。ヤフーファイナンスに接続するときは、取得間隔を1,2秒程度空けている。連続で取得するとサーバ負荷が増えるから強制切断とかアクセスをブロックされてしまうかもしれない。

>>コード修正、Spanタグが存在しない時間帯があるみたいなので、存在するかどうかのチェックを追記した。2021年2月8日、12時06分

 

更に修正した。メソッドをクラスにした。また始値、高値、安値を入れた。2021/02/12

 

pythonでCSVを読み込みクラスオブジェクトを配列に入れる

CSVを読み込みクラスオブジェクトを配列に入れる

CSV例,6列必要。1行目は除外する。米ヤフーファイナンスから日経平均株価データを取得すると、今日の分は取得できるのに、なぜか前日のデータが時間帯によって取得できない。そのため、取得できたデータと取得できないデータをCSVにしておいて使用する。

日付,高値,安値,始値,終値,調整終値

となっている。

クラスから実際のデータを取得するときは

df[0].indexとかdf[0].closeみたいにして取得する。つまり1行分が1オブジェクトの配列として登録されている。

 

python便利なコマンド使い方、備忘録チートメモ、pythonにはswitch case文はない

配列の要素数はlen(array)で数える

メソッドはdefを先頭に付ける。def funcname():。メソッドを外部ファイルにしたいときは、ファイル名:testfunc.pyだったらimport testfunc(ファイル名、拡張子を除く)とする。

if文でelse ifは pythonではelif(勝手にエリフと読んでる)。一致条件はイコール2つ== if :elif:
elseは同じ。中括弧は使わない。

pythonには、switch case文はない

1行コメントは先頭に#
コメントの複数行はシングルクォーテーション3つかダブルクォーテーション3つで囲む。”’ commnet ”’

改行(折返し)は行末にバックスラッシュ\を付けて改行できる(マックの場合はOptionキーと¥キー、Winの場合はAltキーと¥キー)

文字の結合はプラス+。’abc’+’def’ >>abcdef

print(‘Max:’,max(df))#配列dfに複数の数値が入ってるとしてmax()で最大値が取れる。最小値はmin()

c,mod=divmod(a,b) 商cと余りmodが同時に取得できる

ループ、途中の3から5の数字を使って計算したいときrangeを使う。
for i in range(3,6):で、rangeを使うと3,4,5のように途中から取得できる但し、6は出力されないので注意。ここでは5までが対象になる。6を対象にしたかったら1加算してrange(3,7)のようにする

ディレクトリのTXTファイル一覧を取得 import glob, files=glob.glob(path+’*.txt’)、pathにはディレクトリのパスを入れること。

Int moji=5(int型)を文字にしたいstr(moji)で文字5になる

インクリメントi++、デクリメントi–は存在しない。i+=1,i-=1とする

文字列の挿入は、文字列の2番めの文字(1の後ろ)にabc文字を挿入したい。
tmpstr=’0123456′
hoge=tmpstr[:2]+’abc’+tmpstr[2:]
print(hoge)#01abc23456
[:0][0:]だとabc0123456になる

正規表現はimport re 、re.compile,searchがある。#findで正規表現ができない(と思う)

置換はsub

年月日の取得例
from datetime import datetime
end = datetime.now()
start = datetime(end.year, end.month, end.day)
print(‘start:’,start.strftime(“%Y/%m/%d”))
print(‘today:’,end.strftime(“%Y/%m/%d”))
–月をまたいでもOKな記載は以下
from datetime import datetime,timedelta
end = datetime.now()
#start = datetime(end.year, end.month, end.day-8)#こっちだと月マタギでエラーになる。
start = end – timedelta(days=7)

pass で何もしない。!=を使いたくないときやとりあえずコードを書いて実行したいときに使える
if i==10:
pass
else:
a=20

Blender2.91、Pythonで日経平均株価のローソク足を3Dにしてみた

PythonをBlenderで実行する時
Blenderをターミナルから起動(print出力を確認するためにターミナルが必要)
/Applications/Blender.app/Contents/MacOS/Blender

そして、BlenderのPythonスクリプトのWindowを表示させて、実行する。実行はアイコンの右三角か、メニュのText>Run Scriptを選ぶとPythonスクリプトが実行される

Blenderのバージョンアップで、Pythonモジュールであるpandas_datareaderが入っていないときは以下のようにpipインストールする
例ターミナルを使用して、Blenderのバージョン2.91のときに、pandas_datareaderをインストールした場合、Blenderのバージョンのディレクトリに移動して実行する。
pip install [module]
以下はターミナル似て、python/binに移動して実行した例である
/Applications/Blender.app/Contents/Resources/2.91/python/bin/pip install pandas_datareader

ターミナルで実行した履歴を記載

内容

2020年12月〜2021年1月のある期間の日経平均株価チャートを自動作成
約1、2週間分程度の株価

3Dローソク足(株に興味のない人はつまらないかも、、、)
BlenderのPythonを使うとこんなこともできるということを実践しただけの紹介動画

>>作成したローソク足の3D オブジェクトの紹介、BlenderのPython実行

ユーチューブ動画

参考サイト

https://qiita.com/kjunichi/items/a36fdc9db3876e068249
https://qiita.com/hibit/items/1ac97c71d5adc5b45f85

ブログに記載したインストール内容はこちら
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/

#日経平均株価 とは
「東京証券取引所第一部に上場する約2,000銘柄の株式のうち225銘柄を対象」原則「225銘柄の株価の合計 ÷ 225」となる。修正等ある。
https://ja.m.wikipedia.org/wiki/%E6%97%A5%E7%B5%8C%E5%B9%B3%E5%9D%87%E6%A0%AA%E4%BE%A1

#ローソク足とは、
https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%82%BD%E3%82%AF%E8%B6%B3%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88

「単位期間中に初めに付いた値段を始値(はじめね)、最後に付いた値段を終値(おわりね)、最も高い値段を高値(たかね)、最も安い値段を安値(やすね)」の値をもとにローソクの形状のように表現したもの
ローソク足は江戸時代に出羽国の本間宗久が発案

日経平均株価のデータを取得して、BlenderのPythonを使いローソク足の3D オブジェクトを作成した。

環境:MacOS BigSur

#Blender2.91
Blender用pythonモジュール: #pandas_datareader
準備:Pythonモジュールをインストールする必要がある。
Mac版BlenderのPythonにPip、pandas_datareaderインストールしておく。
・PythonはMacOS BigSur用とBlender用とが存在する。つまり保存場所が異なる。
よってBlenderで使いたいモジュールが必要なときは、個別でインストールが必要。
つまり、MacOSでpandas_datareaderをインストールしても、BlenderのPythonでは
使えない。よって、Blenderの階層にそれぞれのモジュール等をインストールする

目的

:Blender2.91、Pythonスクリプトで日経平均株価データを米ヤフーファイナンスからネット上で取得して、ローソク足として3D(円柱)オブジェクトを作成する。
チャートデータは数日〜1週間程度のデータ

注意事項:

Pythonの文法の説明はほとんどしません。
BlenderのPythonの仕様について投稿者は、よく理解しておらず試行錯誤で作成し、推奨ではないコードの記述や間違いがあります。よって質問等があっても正しく答えられる知識がないため回答できない場合があります。
ご承知おきください。(他の人の回答を期待します。)

・Pythonスクリプトコードの概略説明

米ヤフーファイナンスから日経平均株価のデータを取得
始値、終値、高値、安値データを取得
始値より終値が大きければ陽線(赤)
小さければ陰線(青)とする
始値、終値からローソク本体の大きさ位置を決める
高値、安値からローソクのひげの大きさ位置を決める
直近の日のローソク足だけ横を向いた円錐を配置
直近のローソク足の始値終値を記載
直近の日付を記載
目盛りを配置

^読み方:キャロット

オブジェクトの原点がオブジェクトの中心に配置されていて、オブジェクトの移動やリサイズをする場合は問題は発生しないが、オブジェクトの頂点がオブジェクトの原点(中心点)より離れた位置に配置されていると、
Resizeしたときに、ポイントの縮尺が変わり、想定した位置に配置されない(バグではなく、操作や理解の問題)。
よって、リサイズして、ポイントを移動させたいときは、
オブジェクト自体を移動させてから、リサイズや個別頂点ポイントを移動させたほうが良いと思う。

 

・実行するときの補足説明

Blenderをターミナルから起動(print出力を確認するためにターミナルが必要)
/Applications/Blender.app/Contents/MacOS/Blender

そして、BlenderのPythonスクリプトのWindowを表示させて、実行する。実行はアイコンの右三角か、メニュのText>Run Scriptを選ぶとPythonスクリプトが実行される

Blender2.91のpython場所 –MacOSpythonと異なる場所にある(バージョンが変わる毎にディレクトリが変わる。2.91の部分)
/Applications/Blender.app/Contents/Resources/2.91/python

 

Pythonコード

2021/01/04時点の分、Blenderで実行する。できれば、ターミナルからBlenderを起動してから、Scriptingで使用

修正履歴:2021/01/06、始値終値が重ならないように位置を調整

 

別コード、株価を記載したCSVファイルを読み込んで立体ローソク足にした

米ヤフーファイナンスに接続して当日にデータを取得すると、前日データが欠落するし、データが公開されるまで時間がかかる(20分)ので
CSVで当日データを記載したファイルを読み込んだほうが早いと思ってCSV読み取りでローソク足を立体化するPythonコードを書いた。日経平均株価データのクラスオブジェクト、カプセルデータとして扱う。CSVの場合は、数字が文字列扱いになるので、floatにするなどの型変換が必要だった。
なお、このコードには、別ファイルのBlendファイルからオブジェクト(猫)を読み込むコードを記載してある。
ファイルパスはフルパス。

 

python,株データ取得pandas_datareader 米ヤフーファイナンスからデータ欠落する時間帯があるメモ

#Blenderにpandas_datareaderインストール済

python,株データ取得のためのコード、Anaconda、JupyterLabで実行
#日経平均株価のデータを取得したときに、前日分が欠落することがあった。今日の分は取得できたのに、、、
#過去1週間のデータを取得とするはずだったが一部の日付データが取得できず。
#start: 2020/12/22
#today: 2020/12/29
#df=data.DataReader(‘^N225′,’yahoo’,start,end)
#しかし、午前中は 12/29当日データは取得できたけど、前日12/28分は取得できず。
#AM9-11ごろ x
#AM11:07分頃
#AM11:30 x
#11時53分 今度は28日が取得できて、今日の分が取得できず
#12:07 正常に取得できた。28日と今日の29日

結論:たぶん午前中は欠落するデータがあるかもしれない。午後12:05になると当日の日経平均株価が正常に取得できるようだ。正常に取得できないときは、日付が今日の分29日はあっても前日の28日がない。ちなみに25日分はあった