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))

MarketSpeed 自動ログイン Windows10 VBA

環境;Windows10,VBA
WindowsのMarketSpeedを便利にする。
スクリプト実行でログインまでを自動処理
いちいちパスワードを入力する手間を省く。
あくまでも利用者が限定されている前提。

Macの場合はAutomatorを使った Macはこちら

詳しくは参考サイトにて
なおスクリプトの実行の際は
システム環境設定のセキュリティで、許可が必要

<スクリプト例>IDはMarketSpeed側に設定済。パスワードのみ入力
テキストファイルの拡張子をvbsにする。そしてそのファイルをダブルクリックすれば処理が始まる。
注意点
SJISで保存すること
アプリの絶対パスを確認する

 

参考

【Automator】アプリを起動してパスワードを自動入力する
https://kinopy-techhack.hateblo.jp/entry/180308

システム環境設定のセキュリティで、許可
https://www.dev-dev.net/entry/2019/08/25/091633

以下の内容をテキスト化して拡張子をVBAにする

'マーケットスピードの起動
Set WshShell = CreateObject("WScript.Shell")
WshShell.CurrentDirectory = "C:\Program Files (x86)\MarketSpeed\MarketSpeed"
WshShell.Exec("C:\Program Files (x86)\MarketSpeed\MarketSpeed\MarketSpeed.exe")
'マーケットスピードの最大化
WshShell.CurrentDirectory = "C:\Program Files (x86)\MarketSpeed\MarketSpeed"
Set objMS = WshShell.Exec("C:\Program Files (x86)\MarketSpeed\MarketSpeed\MarketSpeed.exe")
WshShell.AppActivate(objMS.ProcessID)
WScript.Sleep(1000)
WshShell.SendKeys("% X")
WScript.Sleep(1000)


'マーケットスピードのアクティブ化
WshShell.AppActivate("Market Speed Ver16.93")     
WScript.Sleep(1000)
'マーケットスピードの自動ログイン
MS_WINDOW_TITLE = "Market Speed Ver16.93"
MS_WINDOW_LOGIN_TITLE = "Market Speed - ログイン"

ret = WshShell.AppActivate(MS_WINDOW_TITLE)
WScript.Sleep(1000)
'2.マケスピのログインパスワードを編集します。

WshShell.SendKeys("{F7}")'環境設定でF7(他のファンクションでもOK)に総合サマリを登録しておく必要がある
WshShell.SendKeys("{ENTER}")'enterでログインWindowが表示されるのでログインボタンをクリックしなくてよい

'マーケットスピードのパスワード入力 IDはMarketSpeedに事前に登録するので再入力はない
WshShell.SendKeys("PASS")
WScript.Sleep(1000)
WshShell.SendKeys("{ENTER}")
WScript.Sleep(1000)

WshShell.Exec("C:\Program Files (x86)\MarketSpeed\MarketSpeed\RSS.exe")

 

MarketSpeed 自動ログイン Mac Automator

環境;Mac Big Sur,Automator (LaunchPadの「その他」)

MacのMarketSpeedを便利にする。

スクリプト実行でログインまでを自動処理

いちいちパスワードを入力する手間を省く。

あくまでも利用者が限定されている前提。

AutomatorはLaunchPadの「その他」の中にある。

新規スクリプトは新規からアプリケーションを選択する。

詳しくは参考サイトにて

なおスクリプトの実行の際は

システム環境設定のセキュリティで、許可が必要

<スクリプト例>IDはMarketSpeed側に設定済。パスワードのみ入力

tell application "/Applications/MARKETSPEED.app"
  activate
  tell application "System Events"
    tell application process "MARKETSPEED"
      delay 2
      keystroke "Y" #passwordを1文字ずつ入力する
      keystroke "M"
      keystroke "2"
      keystroke tab #//入力欄から決定ボタンまで移動する為のtabキー
      key code 76 #//Enter
      
    end tell
  end tell
end tell

 

参考

【Automator】アプリを起動してパスワードを自動入力する

https://kinopy-techhack.hateblo.jp/entry/180308

システム環境設定のセキュリティで、許可

https://www.dev-dev.net/entry/2019/08/25/091633

株価チェックEXCELマクロ、安値高値

株価をチェックして、安値高値でサウンドを再生

ちなみにヤフーファイナンスでも安値、高値に達したらメールで知らせてくれるサービスは存在するが、メールを見ないといけないし、複数の銘柄をチェックする場合は面倒になってくる。エクセルシートを見ながら、再生音で安値、高値をチェックできたら便利と思った。

エクセルを複数起動したい場合は、Windowキー+Rファイルを指定して起動で[excel /x]と入力して起動させて、エクセルブックを開けばよい。

仕様
楽天証券、マーケットスピード、RSS.exeが必要。Windowsのみ。
VBAによるループ処理で、現在値と安値、高値を比較します。
DoEvntsでイベントを受け付けます。
安値、高値になるとサウンドが1回再生されます。達成チェック列(H2以降)の文字を消すと再度再生します。サウンドファイルは個別に用意をする必要があります。
コードを入力後は銘柄ボタンをクリックしないと株価を取得しません。

参考にしたサイト

https://dp-invest.hateblo.jp/entry/2020/11/09/192427

使い方

(1)コードを入力して銘柄ボタンをクリックすると銘柄名と株価を取得します。
(2)安値と高値を入力します。省略可能。
(3)チェック開始ボタンで比較実行
(4)終了ボタンで処理を停止

Public goFlag
Public endFlag
Sub mycolor(cell As String)
'
' color Macro
'マクロの記録で作成

'
    Range(cell).Select
    With Selection.Font
        .color = -16776961
        .TintAndShade = 0
    End With
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent4
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
    End With
End Sub
Sub colorBack(cell As String)
'
' colorBack Macro
'

'
    With Selection.Font
        .color = -16776961
        .TintAndShade = 0
    End With
    With Selection.Font
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
    End With
    With Selection.Interior
        .Pattern = xlNone
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    ActiveCell.FormulaR1C1 = ""
    Range(cell).Select
    Range(cell).Value = ""
    
End Sub


Sub meigara()
'https://dp-invest.hateblo.jp/entry/2020/11/09/192427
'を参考にした

Dim i As Integer
Dim n, m As Integer
Dim code

n = Cells(Rows.Count, "A").End(xlUp).Row

For i = 2 To n 'A2から以降のコード
    code = Cells(i, 1)
    If code <> "" Then
        Cells(i, 2).Value = "=RSS|'" & code & ".T’!銘柄名称"
        Cells(i, 3).Value = "=RSS|'" & code & ".T’!現在値"
    Else '
        Cells(i, 2).Value = "" 'B cell
        Cells(i, 3).Value = "" 'C
        Cells(i, 8).Value = "" 'H cell
    End If

Next i

m = Cells(Rows.Count, "B").End(xlUp).Row
For i = 2 To m
    If Cells(i, 1) = "" Then
        Cells(i, 2).Value = "" 'B cell
        Cells(i, 3).Value = "" 'C
        Cells(i, 4).Value = "" 'D
        Cells(i, 6).Value = "" 'F
        Cells(i, 8).Value = "" 'H cell
        colorBack ("H" & i)
    End If
Next i

m = Cells(Rows.Count, "D").End(xlUp).Row
For i = 2 To m
    If Cells(i, 1) = "" Then
        
        Cells(i, 4).Value = "" 'D
        Cells(i, 6).Value = "" 'F
        Cells(i, 8).Value = "" 'H cell
        colorBack ("H" & i)
    End If
Next i

End Sub
Sub endCheck()
    Range("E14").Value = "停止"
    endFlag = False
    Debug.Print "end"
    MsgBox "株価チェック終了しました"
End Sub

Sub kabuCheckAlert() 'チェック開始ボタンで実行
    '株価をチェックして、指定した値に達したら警告音やアラートを表示する
    Dim t As Long
    Dim nTime As Long
    Dim n As Integer
    Dim strYasune
    Dim strTakane
    endFlag = True 'falseで処理を終わる
    nTime = 3
    t = Timer
    strYasune = "安値です"
    strTakane = "高値です!!"
    'H列を空欄にする
    m = Cells(Rows.Count, "H").End(xlUp).Row
    For i = 2 To m
        Range("H" & i).Value = ""
    Next i
    
    meigara
   Range("E14").Value = "実行中"
    Do
        DoEvents
     '------Start Timer
        If t + nTime < Timer Then '秒単位のタイマー Timeは時刻nTimeで指定した秒間隔でコピー処理を行う
            Debug.Print nTime&; "秒間隔 株価チェック 実行中"
            t = Timer
            'nTime毎に株価をチェックする
            'ここを行数分ループする
            n = Cells(Rows.Count, "A").End(xlUp).Row
            'For next Start
            For i = 2 To n
                If Range("C" & i).Value <> "" And Range("D" & i).Value <> "" Then
                    If Range("C" & i).Value <= Range("D" & i).Value Then
                        If Range("H" & i).Value <> strYasune Then 'Hセルが空のときだけ再生し、すでにHセルに記載があれば音を再生しない
                            Debug.Print "株価が安値に達しました"
                            Range("H" & i).Value = strYasune
                            mycolor ("H" & i)
                            Shell "C:\Program Files\Windows Media Player\wmplayer.exe C:\Users\mased\Music\ヒューンと落下.mp3", 1
                        End If
                    End If
                    
                End If
                If Range("C" & i).Value <> "" And Range("F" & i).Value <> "" Then
                    If Range("C" & i).Value >= Range("f" & i).Value Then
                        If Range("H" & i).Value <> strTakane Then 'Hセルが空のときだけ再生し、すでにHセルに記載があれば音を再生しない
                            Debug.Print "株価が高値に達しました"
                            Range("H" & i).Value = strTakane
                            mycolor ("H" & i)
                            Shell "C:\Program Files\Windows Media Player\wmplayer.exe C:\Users\mased\Music\決定、ボタン押下37.mp3", 1
                        End If
                    End If
                End If
            Next i
            'For next end
        End If
     '----End Timer
     
        If endFlag = False Then
            Debug.Print "exit loop"
            Range("E14").Value = "停止"
            Exit Do
        End If
    Loop
    Debug.Print "End"
End Sub

 

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

import MySQLdb
import os
import re
import sys
import time
import datetime
import glob#ファイル一覧
import shutil#move
from selenium import webdriver
import importlib#再読み込みのためのライブラリ

import requests#スクレイピング
from bs4 import BeautifulSoup#スクレイピング

import methodMysql#個人用メソッド pyファイル

###START
importlib.reload(methodMysql)

##以下は毎回手動で確認すること
#株探の市況の先物オプション、市場が開いている当日のPM4:06分頃と、翌日の朝AM6:30以降に更新される。
#土日祝は更新されないが、前日が市場が開いていると更新される。
optionUrl='https://kabutan.jp/news/marketnews/?b=n202103010692'#都度修正、毎日
useDate='2021/3/1'#オプション取り込みの日付               #都度修正、毎日
useMonth=3#月限 12月の作業はたいてい翌月である1月            #都度修正、月
useTable='Table_StockOption'#テーブルは固定

#
print('START')
print('chrome起動')
obj=methodMysql.cGetOption()
#このURLは手動でコピペする
#BeautifulSoup版
tupleArray=obj.getOptionDataByBeautifulSoup(optionUrl)

#webdriver版
#tupleArray=obj.getOptionData(optionUrl)
a,b=tupleArray
print(a)#text
print(b)#年月日時分


path='/Users/toshiromaseda/Documents/2020年株関連/kabu_python/'
obj.outputText(path,tupleArray)
#file名は、年月日時分.txtになって保存される。

#ファイルの存在チェックで拡張子をつけてチェックする
if b.find('.txt')>=0:
    pass
else:
    ifile=b+'.txt'

##--
checkFlag='nashi'
files=glob.glob(path+'*.txt')
for file in files:
    if ifile in file:#ファイル名を含んでいればTRUE
        print(file)
        checkFlag='ari'
        break
    else:
        #print(file)
        checkFlag='nashi'
if checkFlag=='nashi':
    print('ファイルが存在しないか、ファイル名が間違っています')
    sys.exit()

        
csvfile='c_'+ifile.split('.')[0]+'.csv'

methodMysql.checkFile(ifile)#check 取り込み済みのファイルかどうかを調べる

try:
    ofile=open(csvfile,'tw') 
except FileNotFoundError as e: # FileNotFoundErrorは例外クラス名
   print("ファイルが見つかりません", e)
   #print("強制終了")
   sys._exit()#ファイルがなければ終了#tryのときは_exit()が良いらしい
except Exception as e: # Exceptionは、それ以外の例外が発生した場合
   print(e)

try:#ファイルが存在しないときのエラー処理try
    with open(ifile,'tr') as fin:
        for iline in fin:
            #ilineに、”コール”、”出来高”の文字がある行は無視するようにする
            #countで探すか 1行目、2行目は不要なのでDBにインサートしないための処理
            if iline.count('コール')>=1 or iline.count('出来高')>=1:
                continue#以下は実行されない
            if len(iline)==1:#1文字は改行コードだろうから何もしない
                continue
            try:
                ofile.write(methodMysql.outMojiMKIII(iline)+'\n')#MKIII改良版2020/12/18
                #次はMysqlに直接インサートするバージョンを作業する
            except Exception:
                print("do not")
        ofile.close()
except FileNotFoundError as e: # FileNotFoundErrorは例外クラス名
    print("ファイルが見つかりません。パス、ファイル名を確認してください", e)
    ofile.close()
    print("強制終了")
    sys._exit()#ファイルがなければ終了 #tryのときは_exit()が良いらしい
except Exception as e: # Exceptionは、それ以外の例外が発生した場合
   print(e)

#CSVからMysqlへ CSVファイルがないと実行できない。重複チェックなし
#csvToMysql(difileはCSVファイル名,dtablename、doptionDate日付、dmonth月限)
#テスト用テーブルTest_Table_StockOption
print("csvtoMysql")
methodMysql.csvToMysql(csvfile,useTable,useDate,useMonth)

#Testが終わったら試す。 単独実行可能 但し、ファイルの移動先チェックがないので、他で移動がないことをチェックする必要あり
methodMysql.fileMove(ifile,'./option_python_execute')
methodMysql.fileMove(csvfile,'./option_python_execute')

#表、グラフを出力する 単独実行可能
##methodMysql.selectMysql('Table_StockOption')

print("終わりました。")
print('+++++++')
print('chrome終了')
print('END')


'''
mysql> mysql> SELECT SUM(Volume1) as callVolume1, ExercisePrice,  SUM(Volume2) as putVolume2 
FROM Table_StockOption WHERE Month=3 GROUP BY ExercisePrice ORDER BY Exerce Desc;
'''

 

#先物オプションテキストコピペ 2021/02/28
class cGetOption():
    def __init__(self):
        pass

    def returnDriver(self,lurl):
        # 仮想ブラウザ起動、URL先のサイトにアクセス
        driver = webdriver.Chrome('/usr/local/bin/chromedriver')#ここでエラーになったらパスが違うかchromedriverをインストールする
        #他のエラーで、「unexpectedly exited. Status code was:-9」だったら、Macの場合はシステム環境設定 → セキュリティとプライバシー で許可すればよい
        url=lurl
        driver.get(url)
        mydriver=driver
        return mydriver
    #BeautifulSoup版はクロムは起動しない
    def getOptionDataByBeautifulSoup(self,lurl):#BeautifulSoup対応版、別途Importが必要、2021/03/01
        target_url = lurl
        r = requests.get(target_url)         #requestsを使って、webから取得
        soup = BeautifulSoup(r.text, 'lxml') #要素を抽出
        shijyounews=soup.find(id="shijyounews")#id
        article=shijyounews.find("article")#tag
        tagTime=article.find("time")#tag
        mono=article.find(class_="mono")#class

        print("BeautifulSoup")
        #print(mono.text)
        outputFileName=tagTime.text#年月日時分
        #ここに処理を入れる。
        #2021/03/01
        findFirstStr='コール      プット'#を探して
        findSecondStr='株探ニュース'#の前までを取得する
        findFirstPosition=mono.text.find(findFirstStr)
        findSecondPosition=mono.text.find(findSecondStr)
        if(findFirstPosition>=0 and findSecondPosition>=0):
            print('search success.')
            outputText=mono.text[findFirstPosition:findSecondPosition]
        else:
            print('先物オプションが見つかりませんでした。URLが正しいか確認してください。')
            sys.exit()       

        output=()#初期化
        output=(outputText,outputFileName)#タプルで出力する,この時点で拡張子.txtは付記していない。
        time.sleep(1)       
        return output

    #webdriver版は、クロムが起動する。こっちは文字の先頭に空白を自動で削除する。この処理がよいときもあるが、今回は空白が必要だったのでB4にした
    def getOptionData(self,lurl):
        driver=self.returnDriver(lurl)
        time.sleep(1)
        #tag,id,css
        main = driver.find_element_by_id("wrapper_main")
        container=main.find_element_by_id("container")
        container_main=container.find_element_by_id("main")
        shijyounews=container_main.find_element_by_id("shijyounews")
        article=shijyounews.find_element_by_tag_name("article")

        tagTime=article.find_element_by_tag_name("time")
        mono=article.find_element_by_class_name("mono")
        #brs=mono.find_elements_by_tag_name("br")
        print(tagTime.text)
        outputFileName=tagTime.text#年月日時分
        #tagTimePosition=tagTime.text.find('日')
        #print(tagTime.text[0:tagTimePosition+1])#年月日
        #print(mono.text)

        findFirstStr='コール      プット'#を探して
        findSecondStr='株探ニュース'#の前までを取得する
        findFirstPosition=mono.text.find(findFirstStr)
        findSecondPosition=mono.text.find(findSecondStr)
        if(findFirstPosition>=0 and findSecondPosition>=0):
            print('search success.')
            outputText=mono.text[findFirstPosition:findSecondPosition]
        else:
            print('先物オプションが見つかりませんでした。URLが正しいか確認してください。')
            sys.exit()
        output=()#初期化
        output=(outputText,outputFileName)#タプルで出力する,この時点で拡張子.txtは付記していない。
        time.sleep(1)
        driver.close()#起動したウィンドウを閉じる
        return output

    def outputText(self,path,tupleArray):#ここで受け取るタプルは2つ
        #getOptionData()からテキストとファイル名をタプルを受け取る
        outputText,filename = tupleArray
        if outputText=='' or filename=='' or path=='':
            print("パスかファイル名かテキストがありませんでした。filename,outputText")
            sys.exit()
        os.chdir(path)#ディレクトリ変更
        print(os.getcwd())#ディレクトリ確認
        if filename.find('.txt')>=0:
            pass
        else:
            filename+='.txt'
        try:
            ofile=open(filename,'tw') 
        except FileNotFoundError as e: # FileNotFoundErrorは例外クラス名
           print("ファイルが見つかりません", e)
           sys._exit()#ファイルがなければ終了#tryのときは_exit()が良いらしい
        except Exception as e: # Exceptionは、それ以外の例外が発生した場合
           print(e) 
        
        ofile.write(outputText)
        ofile.close()

 

GOPRO9やっと届いた。注文から約1週間ほどかかる

2021/02/22
自撮りもしないし、最近はスポーツしないし、アクティブなこと一切ないけど携帯性の良さと手揺れに強いGOPRO9買った。
公式サイトのネット注文で約1週間ほどかかった。(以前アマゾンからも販売されていたがいつの間にか消えた)
海外からの発送らしい。
今回非常に安く買えた。約4万3千円。(特典付きのサブスクリプション加入が条件)
付属品も多くて、バッテリー2個(本体接続のUSBコードあり)、32GBマイクロSDカード、ハンディグリップ、3つの接続パーツとケースも付いてた。

ソニーのハンディカム持ってるけど、ちょっと携帯性が悪い。
いつでもどこでも持っていけるサイズではない。
機能に不満があるわけではない。

感想はこれから
>>充電器は別途必要と感じた

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

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

ターミナルでの作業

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

・ユーザはmaseda
mysql -u maseda -p
psssはTes*****にした。上に記載。このパスワードはデモ用なので知られてOK

・DBを作成
CREATE DATABASE YahooFinance DEFAULT CHARACTER SET utf8mb4;

・DBを指定する
use YahooFinance;

重複を避けるときはUNIQUEを使う
UNIQUE uni_Code int(5) NOT NULL,
>>今回は使用せず
mysqlのコメントは #,--(ハイフン2つ) /*  */ がある
CodeについてはUNIQUEユニークにしない、毎回同じ企業コードが入るかも

・テーブルを作成
CREATE TABLE Table_Dekidaka(
ID int(11) NOT NULL AUTO_INCREMENT,
Code int(5) NOT NULL,
Market text,
Name text,
Price int(11) ,
Volume int(14),
PreviousVolume int(14),
VolumePer float,
StockDate DATE,
CreateDate DATETIME,
Yobi text,
PRIMARY KEY (ID)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

>>オートインクリメントのIDは、PRIMARY KEY(ID)が必要。ないとエラーになる。

mysql> show tables;
mysql> show columns from Table_Dekidaka;

+----------------+----------+------+-----+---------+----------------+
| Field          | Type     | Null | Key | Default | Extra          |
+----------------+----------+------+-----+---------+----------------+
| ID             | int      | NO   | PRI | NULL    | auto_increment |
| Code           | int      | NO   |     | NULL    |                |
| Market         | text     | YES  |     | NULL    |                |
| Name           | text     | YES  |     | NULL    |                |
| Price          | int      | YES  |     | NULL    |                |
| Volume         | int      | YES  |     | NULL    |                |
| PreviousVolume | int      | YES  |     | NULL    |                |
| VolumePer      | float    | YES  |     | NULL    |                |
| StockDate      | date     | YES  |     | NULL    |                |
| CreateDate     | datetime | YES  |     | NULL    |                |
| Yobi           | text     | YES  |     | NULL    |                |
+----------------+----------+------+-----+---------+----------------+
11 rows in set (0.03 sec)

mysql> 
権限がないときは、権限を与える。
GRANT SHOW DATABASES ON *.* to maseda@localhost;
これでいいはず。もしこれでだめな場合は、必要な権限を与えて。

---
python
mysqldbを使用していたがmysql-connector-pythonが良いらしい。
pip install mysql-connector-python

pip list 一覧表示 OK

 

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

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

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

import os
import re
import sys
import datetime
import glob#ファイル一覧
import shutil#move


class twList:
    def __init__(self):
        print()
    def outputText(self,codeList,filename):
        print("文字列処理開始")
        path='/Users/toshiromaseda/Documents/2021年/2021年株/トレーディングビュー/'
        os.chdir(path)#ディレクトリ変更
        print(os.getcwd())#ディレクトリ確認
        try:
            ofile=open(filename+'.txt','tw') 
        except FileNotFoundError as e: # FileNotFoundErrorは例外クラス名
            print("ファイルが見つかりません", e)
        except Exception as e: # Exceptionは、それ以外の例外が発生した場合
            print(e)
        #ここで処理する
        #
        addStr="TSE:"
        outputStr=""

        i=0
        for f in codeList:
            if i==len(codeList)-1:
                outputStr+=addStr+str(f)#最後の配列の要素にはカンマを付けない。
            else:    
                outputStr+=addStr+str(f)+','#配列の要素ごとにカンマを付ける
            i+=1    
        print(outputStr)    
        print("文字列処理終了")
        i=0
        #OUTPUT
        ofile.write(outputStr)
        ofile.close()
        
###START
print("START#####################################")
codeList=[2345,
         2670,
         2700,
         3486,
         3646,
         3696,
         4004,
         4544,
         4587,
         4619]#0217記事
fileName="0217記事"#.txtなしで記載すること

if fileName!='' and len(codeList)!=0:
    cList=twList()
    cList.outputText(codeList,fileName)
    print(fileName)


print("End#####################################")

出力例

START#####################################

文字列処理開始
/Users/toshiromaseda/Documents/2021年/2021年株/トレーディングビュー
TSE:2345,TSE:2670,TSE:2700,TSE:3486,TSE:3646,TSE:3696,TSE:4004,TSE:4544,TSE:4587,TSE:4619
文字列処理終了
0217記事
End#####################################

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

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

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

import time
from selenium import webdriver
import csv
import datetime
import os

class jikeiretsu:
    def __init__(self,day,kopen,khigh,klow,kclose):
        self.day=day
        self.kopen=kopen
        self.khigh=khigh
        self.klow=klow
        self.kclose=kclose
        
class yahooFinanceTimeline:
    def __init__(self):
        self.hello="yahoo Finace"
        
    def getTimeline(self):
        #print("カプセルにして取得")
         #動作確認のためのメソッド
        # 仮想ブラウザ起動、URL先のサイトにアクセス
        driver = webdriver.Chrome('/usr/local/bin/chromedriver')#ここでエラーになったらパスが違うかchromedriverをインストールする
        #他のエラーで、「unexpectedly exited. Status code was:-9」だったら、Macの場合はシステム環境設定 → セキュリティとプライバシー で許可すればよい
        url='https://stocks.finance.yahoo.co.jp/stocks/history/?code=998407.O'
        driver.get(url)
        time.sleep(1)
        #title = driver.title
        #print(title)
        main = driver.find_element_by_id("main")
        el = main.find_element_by_css_selector(".padT12.marB10.clearFix")
        tableElem = el.find_element_by_tag_name("table")
        trs = tableElem.find_elements_by_tag_name("tr")
        ths = trs[0].find_elements_by_tag_name("th")
        kabuka=""
        #thタグは1行目のTRにだけ存在する。
        for f in range(0,len(ths)):#日付	始値	高値	安値	終値
            ths[f].text
            kabuka+=ths[f].text+" "
        print(kabuka)
        jikeiretsuArray=[]
        for i in range(0,len(trs)):
            tds = trs[i].find_elements_by_tag_name("td")
            if len(tds)>=5:
                getJikeiretsu=jikeiretsu(tds[0].text,tds[1].text,tds[2].text,tds[3].text,tds[4].text)
                jikeiretsuArray.append(getJikeiretsu)
            else: 
                print("tdsの数が足りない行があるので無視")
        time.sleep(1)    
        driver.close()#起動したウィンドウを閉じる
        print("通常出力日付	始値	高値	安値	終値")
        for f in range(0,len(jikeiretsuArray)):
            print(jikeiretsuArray[f].day,jikeiretsuArray[f].kopen,jikeiretsuArray[f].khigh,jikeiretsuArray[f].klow,jikeiretsuArray[f].kclose)
        print('+----------------------+')
        print("個人的出力順、CSVカンマ区切りで 桁区切りのカンマは削除、昇順day,High,Low,Open,Close,AdjClose")#("個人的な利用の出力順、昇順day,High,Low,Open,Close,AdjClose")    
        count=len(jikeiretsuArray)
        tmpstr=""    
        for n in reversed(range(count)):#).replace(',','') カンマを削除
            tmpstr=jikeiretsuArray[n].day+","+jikeiretsuArray[n].khigh.replace(',','')+","+jikeiretsuArray[n].klow.replace(',','')+","+\
                  jikeiretsuArray[n].kopen.replace(',','')+","+jikeiretsuArray[n].kclose.replace(',','')+","+\
                  jikeiretsuArray[n].kclose.replace(',','')
            print(tmpstr)

    #テスト用のメソッドなので実際は不要なメソッド        
    def getTimelineTest(self):
        print("test")
        #動作確認のためのメソッド
        # 仮想ブラウザ起動、URL先のサイトにアクセス
        driver = webdriver.Chrome('/usr/local/bin/chromedriver')#ここでエラーになったらパスが違うかchromedriverをインストールする
        #他のエラーで、「unexpectedly exited. Status code was:-9」だったら、Macの場合はシステム環境設定 → セキュリティとプライバシー で許可すればよい
        url='https://stocks.finance.yahoo.co.jp/stocks/history/?code=998407.O'
        #driver.get(url+str(code)+'.T')
        driver.get(url)
        time.sleep(1)
        #title = driver.title
        #print(title)
        main = driver.find_element_by_id("main")
        #el = main.find_element_by_id("stockinf")
        #nextClass = el.find_element_by_css_selector(".stocksDtl.clearFix")
        el = main.find_element_by_css_selector(".padT12.marB10.clearFix")
        tableElem = el.find_element_by_tag_name("table")
        trs = tableElem.find_elements_by_tag_name("tr")
        ths = trs[0].find_elements_by_tag_name("th")
        kabuka=""
        #thタグは1行目のTRにだけ存在する。
        for f in range(0,len(ths)):#日付	始値	高値	安値	終値
            ths[f].text
            kabuka+=ths[f].text+" "
        print(kabuka)
        kabuka=""
        for i in range(0,len(trs)):
            tds = trs[i].find_elements_by_tag_name("td")
            for m in range(0,len(tds)):
                kabuka+=tds[m].text+" "#ここはカプセルにしてクラスオブジェクトを配列に入れたほうがいいかも
                #print(kabuka)
            print(kabuka)
            kabuka=""
        time.sleep(1)    
        driver.close()#起動したウィンドウを閉じる
###START
print("START#####################################")
print("Japan yahoo financeの日経平均株価の時系列")
getstock=yahooFinanceTimeline()
getstock.getTimeline()

print("End#####################################")

 

出力例

START#####################################
Japan yahoo financeの日経平均株価の時系列
カプセルにして取得
日付 始値 高値 安値 終値 
tdsの数が足りない行があるので無視
通常出力日付	始値	高値	安値	終値
2021年2月16日 30,229.46 30,714.52 30,191.65 30,467.75
2021年2月15日 29,662.41 30,092.34 29,662.41 30,084.15
2021年2月12日 29,635.88 29,650.51 29,417.32 29,520.07
2021年2月10日 29,412.55 29,562.93 29,368.18 29,562.93
2021年2月9日 29,435.61 29,585.75 29,350.48 29,505.93
2021年2月8日 28,831.58 29,400.56 28,817.6 29,388.5
2021年2月5日 28,631.46 28,785.71 28,548.27 28,779.19
2021年2月4日 28,557.46 28,600.22 28,325.89 28,341.95
2021年2月3日 28,482.71 28,669.95 28,402.3 28,646.5
2021年2月2日 28,207.48 28,379.31 28,089.12 28,362.17
2021年2月1日 27,649.07 28,107.1 27,649.07 28,091.05
2021年1月29日 28,320.72 28,320.72 27,629.8 27,663.39
2021年1月28日 28,169.27 28,360.48 27,975.85 28,197.42
2021年1月27日 28,665.34 28,754.99 28,542 28,635.21
2021年1月26日 28,696.3 28,740.71 28,527.81 28,546.18
2021年1月25日 28,698.89 28,822.29 28,566.85 28,822.29
2021年1月22日 28,580.2 28,698.18 28,527.16 28,631.45
2021年1月21日 28,710.41 28,846.15 28,677.61 28,756.86
2021年1月20日 28,798.74 28,801.19 28,402.11 28,523.26
2021年1月19日 28,405.49 28,720.91 28,373.34 28,633.46
+----------------------+
個人的出力順、カンマを削除、昇順day,High,Low,Open,Close,AdjClose
2021年1月19日,28720.91,28373.34,28405.49,28633.46,28633.46
2021年1月20日,28801.19,28402.11,28798.74,28523.26,28523.26
2021年1月21日,28846.15,28677.61,28710.41,28756.86,28756.86
2021年1月22日,28698.18,28527.16,28580.2,28631.45,28631.45
2021年1月25日,28822.29,28566.85,28698.89,28822.29,28822.29
2021年1月26日,28740.71,28527.81,28696.3,28546.18,28546.18
2021年1月27日,28754.99,28542,28665.34,28635.21,28635.21
2021年1月28日,28360.48,27975.85,28169.27,28197.42,28197.42
2021年1月29日,28320.72,27629.8,28320.72,27663.39,27663.39
2021年2月1日,28107.1,27649.07,27649.07,28091.05,28091.05
2021年2月2日,28379.31,28089.12,28207.48,28362.17,28362.17
2021年2月3日,28669.95,28402.3,28482.71,28646.5,28646.5
2021年2月4日,28600.22,28325.89,28557.46,28341.95,28341.95
2021年2月5日,28785.71,28548.27,28631.46,28779.19,28779.19
2021年2月8日,29400.56,28817.6,28831.58,29388.5,29388.5
2021年2月9日,29585.75,29350.48,29435.61,29505.93,29505.93
2021年2月10日,29562.93,29368.18,29412.55,29562.93,29562.93
2021年2月12日,29650.51,29417.32,29635.88,29520.07,29520.07
2021年2月15日,30092.34,29662.41,29662.41,30084.15,30084.15
2021年2月16日,30714.52,30191.65,30229.46,30467.75,30467.75
End#####################################

 

今日の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 class サンプル
class nikkeiClass: 
    def __init__(self, cindex, chigh):
        self.index = cindex 
        self.high = chigh 

    def sample():#引数はないのでブランクにした>> ここが誤り
        print(self.index)
        
##START
test=nikkeiClass("aa","bb")
test.sample()
>>>エラー発生 takes 0 positional arguments but 1 was given

正しい

#python class サンプル
class nikkeiClass: 
    def __init__(self, cindex, chigh):
        self.index = cindex 
        self.high = chigh 

    def sample(self):#引数にselfがないとエラーになる
        print(self.index)
        
##START
test=nikkeiClass("aa","bb")
test.sample()
出力結果
aa