経済指標の値の取得と計算

経済指標の値の取得と計算

とりあえず経済指標の基準値は調べたので

まずは売買するロジックを作成する

経済指標で結果が予測値より悪いなら売り

結果が予想より良いのなら書い

という簡単なロジックを実装する

def dealing_logic(forecast,actual_news):

    deal_flag = actual_news - forecast

    if deal_flag <0:

        print("売り")

    else:

        print("書い")

まずは簡単に実験

forecast = 962

actual = 853

dealing_logic(forecast,actual)

で売りになったので

次は
マイナスの値で
マイナスの値でも動作するのを確認

次に判定
フラグ変数を用意し

経済指標
債権
株価指数
Vix
といった値で売買判定をする

Vix は警戒とかはマイナスの値を多くすることにする

つまり

Vix は0〜100で
20までは安定しているとみるので

値を0
30で警戒なので-1
40を超えたらパニックなので-2
50 以上はリーマンショッククラスなので-3
とする

このように結果をもとにして

判定するフラグのトータルが+なら書い

マイナスなら売りとする

ダウの下げとかを気にするのではなく

これらをフラグとしておけば市場の数値ではなく

売り買いのみの判定に使える

https://note.nkmk.me/python-pandas-read-excel/

をみた感じだと

read_excel()

Pandas でexcel を読み込んでいる

Vix の取得は

import investpy

from datetime import datetime, date, timedelta

from dateutil.relativedelta import relativedelta

import altair as alt

import pandas as pd



today = datetime.today().strftime('%d/%m/%Y')



vix = investpy.get_index_historical_data(index='S&P 500 VIX',country='united states',

                                        from_date='01/01/2010',to_date=today)



vix.loc["2022-06-02"]["High"]

25.78

と Hight の値を取得できた

あとは日付の部分を自動で取得したいので

index_date に格納して指定する

index_today = datetime.today().strftime('%Y-%m-%d')

vix.loc[index_today]["High"]

としても同じ

25.78

となったので成功

問題はこれが数値か文字列かによるので

if flag_vix > 50:

    print("市場はパニック")

elif flag_vix > 20:

    print("市場は正常")

で判定できているので数字になっている

同様に経済指標カレンダーの

Forecast actual previous

の値も取り出してみる

あとtwitter で取得したツイート内容の切り出し

数字以外は削除しないと比較できない

とりあえず  broomberg のツイートを取得し

不要な部分を削除し経済指標の数値のみにする

https://teratail.com/questions/266272
によれば

特定ユーザの特定キーワード検索が可能

for tweet in tweepy.Cursor(api.search, q='"2020年05月28日" from:@TakumiSoftware').items(10):

    if (tweet.text[:2] == 'RT'): continue



    print(tweet.user.name)

    print(tweet.text)

    print('-----------------------------------------------')


しかしエラーになる

api.search_tweets(q='"RBA Rate Statemen"', lang='ja', result_type='recent',count=12)

もだめ

api.search_tweets(q='"#経済指標"', lang='ja', result_type='recent',count=12)

は動作する

ツイート取得したあとはテキストから数字のみ取り出せればいいので

これを先にやる

for tweet in tweepy.Cursor(api.search_tweets, q='GDP(YoY)').items(10):

    print(tweet.text)

としたら10件取得できた

結果が

⠀#EU 1Q 2022

#GDP = 5,4% YoY (5,1% previous)

#GDP = 0,6% QoQ (0,3% previous)

Grammar check: Eurozone GDP in Q1 better than estimated, QoQ +0,6% (estimated +0,3%) vs 0,3% in Q4 2021, YoY +5,4%… https://t.co/T2QYk1MzMT

RT @PatelisAlex: Powering ahead.



Greek real GDP surges 7.0%yoy in Q1 (real, not nominal) https://t.co/pWQqFZB8bi

BNP inom EURO-området bättre än väntat.



European Gross Domestic Product (GDP) YoY 5.4% - https://t.co/R9Ra2BQVGK

Euro area GDP came in stronger than expected for Q1:

+5.4% YoY (est. 5.1%); .6% QoQ (est. .3%).



Output rose .5% Q… https://t.co/U2xUt4c083

RT @Financialjuice1: EUROZONE GDP REVISED YOY ACTUAL 5.4% (FORECAST 5.1%, PREVIOUS 5.1%) $MACRO

EUROZONE GDP REVISED YOY ACTUAL 5.4% (FORECAST 5.1%, PREVIOUS 5.1%) $MACRO


 European GDP Growth Rate YoY 3rd Est (Q1)



Actual: 5.4%


Expected: 5.1%

Previous: 4.7%



#EUR

Euro Zone Econ. Stats Released:

GDP (YoY) (Q1)

Actual:  5.4%

Expected: 5.1%

Prior: 5.1%

Better Than Expected


 GDP Growth Rate YoY 3rd Est (Q1)

Actual: 5.4%

Expected: 5.1%

Previous: 4.7%

https://t.co/p0AAzoJmBh

なので

ほぼ取得したい内容がある

あとはここから数値のみ取り出して比較できるようにすr

https://docs.tweepy.org/en/stable/client.html#tweepy.Client.search_recent_tweets
のリファレンスを見た感じだと

since_id を指定すればユーザ指定ができそう

なので bloomberg のid を調べる

34713362
がid 

あとはこれを指定してできるかどうか

screen_name だと

@business
なので

bloomberg = api.user_timeline(screen_name='@business')

# bloomberg

for tweet in bloomberg:

    print(tweet.text)

で表示できた

あとは取得したついーとから数字だけ取り出す


for tweet in tweepy.Cursor(api.search_tweets, q='"French oil and gas" from:@business').items(10):

    if (tweet.text[:2] == 'RT'): continue



    print(tweet.user.name)

    print(tweet.text)

    print('-----------------------------------------------')

としたら特定のアカウントで検索もできた

あとはここから数値の抜き取り

https://teratail.com/questions/266272

を参考に特定ユーザツイート検索ができた

marketnews = api.user_timeline(screen_name='@Financialjuice1')

# bloomberg

for tweet in marketnews:

    print(tweet.text)

で経済指標の最も早いニュースを英語で取得

marketnews =list(marketnews)

marketnews_data = []

for tweet in marketnews:

    marketnews_data.append(tweet.text)

   

print(marketnews_data[9])

で経済指標発表時のツイート取得

次にこのツイートの中身を数字だけにする

【Python】文字列から数字だけを取り出す方法

を参考に

Re.sub()

を使い

marketnews_data[3]

を数値だけにする

actual = re.sub(r"\D","",marketnews_data[3])

actual

だと

'025'

となるので

少数だけにしたい

以前、経済指標で数値以外を削除した方法を使う

分かりやすいpythonの正規表現の例

を参考に

actual = re.sub(r"[^0-9.-]","",marketnews_data[3])

actual

としたが

'.0.25.'

となる

とりあえずリストにすれば正規表現で抜き出しはできるので
あとは処理を調べる

actual = re.sub(r"[^0-9.-]|.$","",marketnews_data[3])

というように

| で条件を追加して

.$ というように末尾が. であるものを削除

ただし最初の . が消せない

また

HONG KONG CPI MOM NSA ACTUAL -0.20% (FORECAST -, PREVIOUS -0.20%) $MACRO

を削除してみると

actual2 = re.sub(r"[^0-9.-]|.$","",marketnews_data[2])

actual2

の結果は

'-0.20--0.20'

となるので

少数を条件式に組み込んだ方がいいかもしれない

"ECB'S DE GUINDOS: EURO-ZONE INFLATION TO STAY ABOVE 8% IN COMING MONTHS."

を処理すると
-8 になる

数値とマッチする正規表現

を参考に小数点と不等号を含む数値のみ抽出する正規表現にする

しかし

[+-]?(?:\d*\.)?\d+(?:(?<!(\.\d+))\.\d*)?

だとエラ〜になる

actual2 = re.sub(r"[^\d.]|.$","",marketnews_data[2])

print(actual2)

にしたら

となった

Python の正規表現で . (ドット) を含む数値のみを抽出したい

を参考にした

ただしこれだと複数の数値を1つにしてしまうので

区切る必要がある

findall()

で試したが

actual2 = re.findall(r"\d+",marketnews_data[1])

print(actual2)

とすると

['53', '1', '52', '4', '53', '1']

となって小数点で区切ってしまう

文字列から浮動小数点数を抽出する方法

を参考に

actual2 = re.findall("\d+\.\d+",marketnews_data[1])

print(actual2[0])

としたら

53.1

が抽出できた

actual2 = re.findall("[-+]?\d*\.\d+|\d+",marketnews_data[1])

print(actual2)

とすることでマイナスの数値にも対応できた

しかし文字列なので

print(actual2+1)

としたらエラ〜となった

変換すればできそうだが小数点なので
Float になる

Vix を抽出した時
flag_vix の値は少数で比較もできた

flag_vix +1

としても演算し

+1 されている

【Python】型を確認・判定する(type関数、isinstance関数)

を参考に

type(flag_vix)

でデータ型を確認したら

numpy.float64

となった

なので float へ変換してみる

[解決!Python]文字列と数値を変換するには(int/float/str/bin/oct/hex関数)

を参考に

float(actual2)

としたがエラ〜

type(actual2)

で調べたら list だった

Python でリストを Float に変換する

を参考に

リスト内のアイテムを Python で numpy.float_() 関数を使用して Float に変換する

import numpy as np
actual2_float = np.float_(actual2)

print(actual2_float+1)

とすれば計算ができるようになった

 

Mac Jupyter notebook メモ

Mac Jupyter notebook メモ

Cmd + ←
で行頭へ移動後

Shift + cmd + →
で行を選択できる

単語ごとの選択は
Option + ←

単語の削除は
Option + backspace

これで
効率的にコードを書ける

[/python]
search_indicate[‘actual’] =search_indicate[‘actual’].str.replace(r”\D”, “”,regex=True)

search_indicate[‘forecast’] =search_indicate[‘forecast’].str.replace(r”\D”, “”,regex=True)

search_indicate[‘previous’] =search_indicate[‘previous’].str.replace(r”\D”, “”,regex=True)

search_indicate
[/python]

これで変換して

date2 =[]

for i in search_indicate['date']:

    new_date = datetime.datetime.strptime(i,"%d/%m/%Y").strftime("%Y-%m-%d")

    date2.append(new_date)

search_indicate['date']=search_indicate['date'].str.replace('/','-')

search_indicate['date'] = date2

search_indicate.fillna(0)

で日付を修正

あとは

actual =(

    alt.Chart(search_indicate)

    .mark_line(opacity=0.8,clip=True)

    .encode(

        x="date:T",

        y=alt.Y("actual:Q",stack=None)

    )

)



forecast =(

    alt.Chart(search_indicate)

    .mark_line(opacity=0.8,clip=True,color='red')

    .encode(

        x="date:T",

        y=alt.Y("forecast:Q",stack=None),      

    )

)



previous =(

    alt.Chart(search_indicate)

    .mark_line(opacity=0.8,clip=True,color='green')

    .encode(

        x="date:T",

        y=alt.Y("previous:Q",stack=None),      

    )

)

alt.layer(actual,forecast,previous).resolve_scale(

    y = 'independent'

)

それぞれのチャートを表示

次に
indicatorの ( 以降を
削除する

まずは

# s = 'abcxyz-xyz('



# print(my_removesuffix(s, '-xyz'))

txt ="ANZ Job Advertisements (MoM)"

print(txt)

として ( 以降を削除

Pythonで文字列の先頭と末尾から空白や文字列を削除する:strip()

を参考にしたが
strip ではできなかった

Replace と正規表現で行う

0回以上の繰り返し
*

任意の英数字は
[a-zA-Z0-9_]

\w

txt.replace("(","")

だとできた

エスケープは不要

year_economic_data2['event']=year_economic_data2['event'].replace("\([a-zA-Z0-9_]+\)","",regex=True)

year_economic_data2

とすることで解決

あとは経済指標カレンダーも同様に処理

# dealing_calender['event']= dealing_calender['event'].str.replace('(','\(').str.replace(')','\)')

dealing_calender['event']=dealing_calender['event'].replace("\([a-zA-Z0-9_]+\)","",regex=True)

とすることで解決

ただし

search_indicate['actual'] =search_indicate['actual'].str.replace(r"\D", "",regex=True)

search_indicate['forecast'] =search_indicate['forecast'].str.replace(r"\D", "",regex=True)

search_indicate['previous'] =search_indicate['previous'].str.replace(r"\D", "",regex=True)

search_indicate

だと

小数点のものまで書き換えてしまい
マイナス、小数点まで削除してしまう

不等号などはそのままにして
%
英数字のみ
削除すればいけるはず

Python: 正規表現ライブラリを使って、グループ化による置換

を参考に

import re

print(re.sub(r'([A-Z][a-z]?)(\d{1,3})', r"\\Nuc{\1}{\2}{}", "He4"))

# \Nuc{He}{4}{}

print(re.sub(r'([A-Z][a-z]?)(\d{1,3})L', r"\\Nuc{\1}{\2}{\\Lambda}", "He4L"))

# \Nuc{He}{4}{\Lambda}

みたいに

search_indicate['actual'] =search_indicate['actual'].str.replace(r"[a-zA-Z%]", "",regex=True)

search_indicate['forecast'] =search_indicate['forecast'].str.replace(r"[a-zA-Z%]", "",regex=True)

search_indicate['previous'] =search_indicate['previous'].str.replace(r"[a-zA-Z%]", "",regex=True)

search_indicate

とすればできた

とりあえず問題はあるけど
経済指標の取得後の処理はできてきた

次はIMM ポジションの取得

https://www.gaitame.com/market/imm/imm_currency.xls

からダウンロードしたいが

Mac だとそのままだとできないらしい

と思ったが Jupiter notebook からだとファイルを開けないみたい

Finder からだと普通にひらけた

Wgetは Mac にはないけど
Curl で代用できる

curl コマンド 使い方メモ

を参考に

-O オプションを付けることでファイル取得と保存ができる

!curl  "https://www.gaitame.com/market/imm/imm_currency.xls" -O

これで取得はコマンドでできるけど
Excel ファイル読み込みでエラー

No module xlrd

のエラーが出たので

【Python エラー】No module xlrd の対処法。権限がなくてxlrdモジュールをインストールできないとき

を参考に

!pip3 install xlrd

でインストール

あと excel の操作もできるように

!pip3 install openpyxl

で追加

あとは notebook を再起動すると
普通にExcelファイルの取り扱いできた

とりあえず
データ取得関連はほぼできた

経済指標の取得その2

経済指標の取得その2

次にpandas のカラムの結合をして新しいカラムを作成してみる

これをdate と time を合わせて
Datetime 形式にして
Datetime インデックスを作成する

https://note.com/kohaku935/n/n18205dcc60fa

を参考にまずは+で結合し

Datetime を追加する

economic_data['Datetime']=economic_data['date']+economic_data['time'].fillna('')

economic_data

で欠損値は削除できたが

Time がAllay のものだとこれになってしまう

あとくっついてるので変換できない

economic_data['Datetime']=economic_data['date']+" "+economic_data['time'].fillna('')

として余白を入れる

https://note.nkmk.me/python-pandas-datetime-timestamp/
を使えばdatetime へ変換できるはず

その前に一度フォーマットを変えないと日付が月扱いになっている

economic_data['Days']=economic_data['date']

economic_data['Days']=pd.to_datetime(economic_data['Days'])

economic_data

で確認したら

これだとだめ

date2 =[]

for i in economic_data['date']:

    new_date = datetime.datetime.strptime(i,"%d/%m/%Y").strftime("%Y-%m-%d")

    date2.append(new_date)

economic_data['date']=economic_data['date'].str.replace('/','-')

economic_data['date'] = date2

economic_data.fillna(0)

年月日へ変換

pd.to_datetime(economic_data['Days'], format="%Y%m%d %H:%M")

とすればエラーにならない

このため

あとは時間の部分で

時刻でないものを除外するようにする

正規表現で検索

economic_data['time'].tail(10).str.contains('[a-zA-Z]')

というようにすれば

アルファベットになっているものだけになる

なので

economic_data['time'].tail(10).str.contains('[1-9]')

とすれば時間は数値なので

これで調べることができる

あとはif などで条件をつけて

数値出ない場合には

Datetime には NA を入れるようにする

まずカレンダーで重要なものだけ表示してみて

これでも変わらないのなら、この措置をとる

importanceを hight にすればいけるはず

economic_data[economic_data['importance']=='high']

で前に出しているので

これでできたが日付関連が昨日と今日だと微妙におかしい

今日と明日で試してみる

Datetime index が設定できるようにすること

そして

Event の文字のエスケープをしておいて検索ができるようにしておくこと

date2 =[]

for i in dealing_calender['date']:

    new_date = datetime.datetime.strptime(i,"%d/%m/%Y").strftime("%Y-%m-%d")

    date2.append(new_date)

dealing_calender['date']=dealing_calender['date'].str.replace('/','-')

dealing_calender['date'] = date2

dealing_calender.fillna(0)

でdatetime にして

dealing_calender['DateTime']=dealing_calender['date']+" "+dealing_calender['time'].fillna('')

dealing_calender

Datetime index のためのカラムを作成

と思ったが

【Pandas】DataFrameの文字列日付データを比較して、抽出したりする
にあるようにカラムをdatetime にすれば抽出できそう

def convert_date(x):

    date = datetime.datetime.strptime(x,"%Y-%m-%d %H:%M:%S")

    return date

で変換するメソッドを用意

しかし元のデータは秒までないためエラ〜になるので

def convert_date(x):

    date = datetime.datetime.strptime(x,"%Y-%m-%d %H:%M")

    return date

とする

dealing_calender['DateTime'] = dealing_calender['DateTime'].apply(convert_date)

で変換できた

pandas.DataFrame, Seriesを時系列データとして処理
を参考に
Datetime index を設定する

今回は
既存データの列をDatetimeIndexとして指定する方法

dealing_calender.dtypes

で確認すると

id                    object

date                  object

time                  object

zone                  object

currency              object

importance            object

event                 object

actual                object

forecast              object

previous              object

DateTime      datetime64[ns]

dtype: object

となり

すでにdatetime には変換済

set_index()メソッドでdatetime64型の列をインデックスに指定する

dealing_calender.set_index('DateTime',inplace=True)

これでできた

あとは時間指定でデータ取り出し

DatetimeIndexがわからんので逆引きでまとめとくの巻
を参考に
時間を指定して取り出す

文字列で時間や日時を指定して行を取り出す, loc
でいけそう

しかしやりたいのは
指定した時間でのevent の取り出し

なので
indexとcolumnを指定してvalueを取り出す

dealing_calender.loc['2022-04-19 05:00']['event']

とすれば

経済指標は英語で

Economic indicators
なので

indicator = dealing_calender.loc['2022-04-19 05:00']['event']

print(indicator)

これで

RBNZ Gov Orr Speaks

となった

次に
この変数で経済指標のグラフの最初の検索処理ができるか試す

過去ログで見ると

economic_data = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=['japan', 'united states'], from_date='01/02/2021', to_date='28/03/2021')

economic_data.tail(5)

となっている

つまり最初の時点で国などを指定している
これだと日本とアメリカのみになっているので
これを変える必要がある

対象を全ての国にするか
メジャーカレンシーのみに絞る

https://investpy.readthedocs.io/_api/news.html

のリファレンスを見ると

investpy.news.economic_calendar(time_zone=None, time_filter='time_only', countries=None, importances=None, categories=None, from_date=None, to_date=None)

となっている

しかし期間を指定しないとエラ〜になる

economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date='01/01/2021', to_date='31/01/2021')

economic_data2

というように国コードだけ指定外して
期間を指定したらできた

せっかくなので期間を
年始から今日までとしてみる
と思ったけど年間のデータから算出した方が良さそう
そもそも年始にトレードする時
修正が必要になってしまう

[Python]昨日や明日、月末などの日付を取得したい
を参考に

# 1年前# => 2019-04-02

one_year_ago = today + relativedelta(years=-1)

でいけるはず

処理が遅いため

economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date='01/01/2022', to_date=deel_today)

economic_data2

としてみた

表示されるまで時間がかかる

ネット速度の問題か
それともマシンスペックかはわからない

つまり年ごとで取得するなら
別の時間枠でやらないと間に合わない

とりあえず直近1ヶ月で指定する

economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date=deal_one_month_ago, to_date=deel_today)

economic_data2

でいける

この中から

#重要指標で actual が NULL 以外で importance = high のものを表示

economic_data2[~(economic_data2['actual'].isnull()) & (economic_data2['importance']=='high')]

以前に経済指標グラフを出す時には
取得期間を半年にした

economic_data = investpy.news.economic_calendar(time_zone=None, time_filter='time_only', countries=['japan', 'united states'],importances=None,categories=None,from_date='01/01/2021', to_date='11/06/2021')

で1年にしたら止まった

カレンシーを絞らないとできないと思う
カレンシーの絞り込みはなく国の指定になる

取り扱っている通貨で出すと
ドル united states
ユーロ germany
ポンド united kingdom
豪ドル australia
NZドル new zealand
カナダドル canada
スイスフラン switzerland

これだけに絞る

# economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date='01/01/2022', to_date=deel_today)

# economic_data2

year_economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=[‘united states','germany','united kingdom','australia','new zealand','canada','switzerland'], from_date=deal_one_month_ago, to_date=deel_today)

year_economic_data2

これで絞り込み

さらに

# economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=None, from_date='01/01/2022', to_date=deel_today)

# economic_data2

year_economic_data2 = investpy.economic_calendar(time_zone=None, time_filter='time_only', countries=[‘united states','germany','united kingdom','australia','new zealand','canada','switzerland'], from_date=deal_one_year_ago, to_date=deel_today)

year_economic_data2

で年間にしたらできた

あとはグラフの時と同じ処理をやってみる
探す時に
経済指標の検索ワードを
カレンダーの結果で調べてみる

もしエラーならエスケープ後に再度挑戦する

まずはISMを検索

ISM =year_economic_data2[year_economic_data2['event'].str.contains('ISM Non-Manufacturing PMI')]

ISM

で1年間のISMを表示できた

チャートにするには
そのままのsate time ではできないので

date2 =[]

for i in ISM['date']:

    new_date = datetime.datetime.strptime(i,"%d/%m/%Y").strftime("%Y-%m-%d")

    date2.append(new_date)

ISM['date']=ISM['date'].str.replace('/','-')

ISM['date'] = date2

ISM.fillna(0)

と変換する

あとはチャート部分

actual =(

    alt.Chart(ISM)

    .mark_line(opacity=0.8,clip=True)

    .encode(

        x="date:T",

        y=alt.Y("actual:Q",stack=None)

    )

)



forecast =(

    alt.Chart(ISM)

    .mark_line(opacity=0.8,clip=True,color='red')

    .encode(

        x="date:T",

        y=alt.Y("forecast:Q",stack=None),      

    )

)



previous =(

    alt.Chart(ISM)

    .mark_line(opacity=0.8,clip=True,color='green')

    .encode(

        x="date:T",

        y=alt.Y("previous:Q",stack=None),      

    )

)

alt.layer(actual,forecast,previous).resolve_scale(

    y = 'independent'

)

で表示できる

なおaltair を使っているので

import altair as alt

が必要

経済指標の取得その1

経済指標の取得

行う処理は

カレンダーの予想時刻と
現在時刻

つまり date time が一緒になったら
Event で検索

とりあえず event 内容をリストに入れる

あと
Date time も格納する

Datetime に関しては
文字列から datetime に変換する

まずはリストにする

value.tolist()

でリスト変換可能

events = economic_data["event"]

economic_event = events.values.tolist()

#events=events[0]

print(economic_event[0])

economic_events="Chinese Industrial profit YTD  (Feb)"

test_event = economic_event[3]

print(test_event)

print(economic_events)

economic_event

これで

economic_event

へリストで格納できる

これを

economic_data[economic_data['event'].str.contains(economic_event[4])]

というようにすれば検索できるが

Chinese Industrial profit YTD  (Feb)

Investing.com GBP/USD Index

Chinese Industrial profit YTD  (Feb)

Out[78]:

['Chinese Industrial profit YTD  (Feb)',

'Finnish Consumer Confidence  (Mar)',

'Finnish Industrial Confidence  (Mar)',

'Investing.com GBP/USD Index',

'Investing.com Gold Index',

'Investing.com S&P 500 Index',

'Investing.com USD/CAD Index',

'Investing.com USD/CHF Index',

'Investing.com AUD/USD Index',

'Investing.com USD/JPY Index',

'Investing.com NZD/USD Index',

'Investing.com EUR/USD Index',

'Trade Balance  (Feb)',

'Credit Indicator (YoY)  (Feb)',

'Core Retail Sales (MoM)  (Feb)',

'Lithuania Retail Sales (MoM)',

'Lithuania Retail Sales (YoY)',

'Gross Wages (YoY)  (Jan)',

'Exports (MoM)  (Feb)',

'Imports (MoM)  (Feb)',

'Trade Balance',

'Irish Retail Sales (MoM)  (Feb)',

'Irish Retail Sales (YoY)  (Feb)',

'BoE Gov Bailey Speaks',

'Quarterly Unemployment Rate',

'M3 Money Supply (YoY)  (Dec)',

'Private Sector Loans (YoY)  (Dec)',

'BCB Focus Market Readout',

'Greek Credit Expansion (YoY)',

'Trade Balance  (Feb)',

'Trade Balance (USD)  (Feb)',

'GDP (YoY)',

'GDP Quarterly',

'Goods Trade Balance  (Feb)',

'Retail Inventories Ex Auto  (Feb)',

'Wholesale Inventories (MoM)',

'Current Account (USD)  (Feb)',

'Foreign direct investment (USD)  (Feb)',

'French 12-Month BTF Auction',

'French 3-Month BTF Auction',

'French 6-Month BTF Auction',

'Dallas Fed Mfg Business Index  (Mar)']

の中で

Chinese Industrial profit YTD  (Feb)

というように
(Feb)
があるとエラーになる

他の指標も試したけど
()があるものは全てエラーになる

この場合エスケープさせるか
(以降は削除するしかない

Macのキーボードの「Option」と
右上にある「¥マーク」を同時に押しすると
入力ソースが英数であろうと、
ひらがなであろうと
半角のバックスラッシュ(「\」)が入力される

Option + ¥

でバックスラッシュの\\ 2つで
エスケープできるので

economic_data[economic_data['event'].str.contains("Exports \\(MoM\\) ")]

としたらエラーがなくなった

つまりリストの中で()のある部分をエスケープしないとだめ

これは
Replace でできるので

economic_event.replace('(','\\(')

としたけど

すでにリストにしてしまうとだめ

events = economic_data["event"].str.replace('(','\(').str.replace(')','\)')

events

とすれば

/var/folders/db/tkl5w9dd3kn3h53ctyl4s6180000gn/T/ipykernel_8436/2811222662.py:4: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will *not* be treated as literal strings when regex=True.

  events = economic_data["event"].str.replace('(','\(').str.replace(')','\)')

とエラーは出るけど変換はできる

あとは

economic_event = events.values.tolist()

#events=events[0]

print(economic_event[0])

economic_events="Chinese Industrial profit YTD  (Feb)"

test_event = economic_event[3]

print(test_event)

print(economic_events)

print(economic_event)

でリストにできるので

economic_data[economic_data['event'].str.contains(economic_event[4])]

とすれば検索条件に当てはめることも可能

経済指標カレンダーの取得

経済指標カレンダーの取得

スクレイピングだけだとあっているかわからないので

Investor でも取得してみる

[Python]investpyで株、為替、経済指標データを取得する
を参考に

economic_data = invest.economic_calendar(time_zone='GMP +9:00', countries=['japan', 'united states'], from_date='01/02/2021', to_date='28/03/2021')

economic_data.tail(5)

としたがエラー

economic_data = investpy.economic_calendar(countries=['japan', 'united states'], from_date='01/02/2021', to_date='28/03/2021')

economic_data.tail(5)

というように

time_zone を省略したらできた

today =datetime.date.today().strftime('%d/%m/%Y')

today

で今日の日付を investor で検索する形式に変換して取得

economic_data = investpy.economic_calendar(countries=['japan', 'united states'], from_date=today, to_date=today)

economic_data.tail(5)

とすると今日のカレンダーと思ったけど出ない

economic_data = investpy.economic_calendar(countries=['japan', 'united states'], from_date='23/03/2022', to_date=today)

economic_data.tail(5)

というように前日の日付にすればできる

economic_data = investpy.economic_calendar(countries=['japan', 'united states'], from_date='23/03/2022', to_date=today)

economic_data.tail(5)

economic_data[economic_data['importance']=='high']

で日本とアメリカだけ出てくる

なので国コードを外してしてしてみる

まずは昨日の日付をオートで取れるようにする

[Python]昨日や明日、月末などの日付を取得したい
を参考に

import datetime

from dateutil.relativedelta import relativedelta

を追加

# 今日# => 2020-04-02

today = datetime.date.today()


# 昨日# => 2020-04-01

yesterday = today + relativedelta(days=-1)

で昨日の日付を取れる

today =datetime.date.today()

print(today)

deel_today = datetime.date.today().strftime('%d/%m/%Y')

print(deel_today)

yesterday = today + relativedelta(days=-1)

print(yesterday)

deel_yesterday = yesterday.strftime('%d/%m/%Y')

print(deel_yesterday)

とすれば取引の当日、前日を取得できる

economic_data = investpy.economic_calendar(countries=['japan', 'united states'], from_date=deel_yesterday, to_date=deel_today)

economic_data.tail(5)

で同じ結果であることを確認した

次に国コードを外してみる

# economic_data = investpy.economic_calendar(countries=['japan', 'united states'], from_date=deel_yesterday, to_date=deel_today)

# economic_data.tail(5)

economic_data = investpy.economic_calendar(countries=None, from_date=deel_yesterday, to_date=deel_today)

economic_data.tail(5)

economic_data[economic_data['importance']=='high']

で経済指標カレンダー取得はできたけど

ミシガン消費者信頼感指数が出ない

結果として対応するのは

通貨コード

指標名

予測値

前回の値

今回の値となっているが

これが遅延があるのか調べないとわからない

遅延が数秒程度なら

Twitter より早いと思う

economic_data.dtypes

でデータ型を調べたら

全て object

この中で検索などの処理で使うのは

Date

Time

Event

の3つをキーにして検索する

Pandas 特定の文字列取得

Pandas 特定の文字列取得

lst = ["近隣10分20000円","近隣5分5000円","敷地内25000円",""]
df = pd.DataFrame(lst, columns = ['駐車場'])
import re

def fee(x):
    m = re.search(r'\d+円', x)
    if m:
        return m.group()
    else:
        return ""

df['駐車料金'] = df['駐車場'].apply(fee)
print(df)

これは apply を使うとできる

「駐車場」列から、金額のみを抽出して、新たな列「駐車料金」

として追加

これだと円が入っているので
これを金額のみにする

re.search() で正規表現で探れる

[解決!Python]re.search/re.match関数と正規表現を使って文字列から部分文字列を抽出するには
を参考に

s = 'id: deep, mail: deep@foo.com, tel: 03-0123-4567'

# re.search関数は文字列にパターンとマッチする部分があるかを調べる
m = re.search('tel: [-\d]+', s)
print(m)  # <re.Match object; span=(30, 47), match='tel: 03-0123-4567'>
r = m.group()  # re.Matchオブジェクトのgroupメソッドでマッチ全体を抽出
print(r)  # tel: 03-0123-4567

つまり

def fee(x):

    m = re.search(r'\d+円', x)

の部分で

xとして渡された文字列から

'\d+円'

で検索している

re.search(r’

で検索したら
正規表現の先頭につく`r`は何ですか?エスケープシーケンスやrow文字列を解説します
とのこと

正規表現を使う時に
R をつけることを推奨しているためらしい

次にわからんのが
m.group()

マッチした文字列を取得: group()
とあった

Pythonの正規表現マッチオブジェクトでマッチした文字列や位置を取得
を参考に

つまり

    m = re.search(r'\d+円', x)

    if m:
        return m.group()

の部分で

\d+円

にマッチする部分を格納している

次に

df['駐車料金'] = df['駐車場'].apply(fee)

の部分

pandasのapply関数の代表的な使い方
が参考になる

df = pd.DataFrame({
        "col_A": [100, 300, 200, 400, 200, 700, 200],
        "col_B": ["A", "B", "C", "D", "E", "D", "C"],
        "col_C": [2, 3, 5, 1, 2, 3, 8]
        })
df.head(10)


# 受け取ったレコードに対して、やりたい操作を記述する
def func1(row):
   return row["col_A"] * row["col_C"]



# dfをレコード単位でfunc1に渡して何らかの操作をしてもらう。戻り値は新たに作成する"col_D"に保存する。
df["col_D"] = df.apply(func1, axis=1)
df.head(10)



# 受け取った値に対して、やりたい操作を記述する
def func2(x):
    return x * 100



# dfの"col_D"の値をfunc2に渡して何らかの操作をしてもらう。戻り値は新たに作成する"col_E"に保存する。
df["col_E"] = df["col_D"].apply(func2)

df

でみるとわかるけど

Def で定義した自作メソッドを

apply() で実行している

そして新しいカラムを追加して

そこへ処理した結果を格納している

とりあえず

まずは apply などで

円の文字を削除してみよう

これができればツイートから経済指標部分を「取り出し

数値以外を削除して数値を文字列に変換すれば処理できる

Pandasで不要な文字を取り除いたり置換する方法まとめ
https://deepage.net/features/pandas-str-replace.html#%E7%89%B9%E5%AE%9A%E3%81%AE%E6%96%87%E5%AD%97%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E6%B6%88%E5%8E%BB

を参考に

str.strip()

で削除できる

今回は円を削除したい

df['駐車料金'].str.strip('円.')

で削除はできる

あとは反映

df['駐車料金'] =df['駐車料金'].str.strip('円.')

df

と経済指標のときみたいに代入すればok

これで文字列の編集はできるので

次に pandas で特定の文字を含む行の抽出をする

まずはツイートの取得と変数への格納

その前に経済指標カレンダーの取得

これがあっているか調べないとだめ

import pandas as pd

url = 'https://fx.minkabu.jp/indicators' #みんかぶFXの経済指標URLを取得
dfs = pd.read_html(url)[0] #テーブルのオブジェクトを生成

#本日のカレンダーを取得

dfs

でも十分に使える

余分なものをなくしてみやすくするなら

import pandas as pd


url = 'https://fx.minkabu.jp/indicators' #みんかぶFXの経済指標URLを取得
dfs = pd.read_html(url) #テーブルのオブジェクトを生成



#前処理開始
dfs1 = dfs[0].dropna(subset = [4]) #4番にNaNが入っている行はバグなので、削除
dfs2 = dfs1.drop(2,axis =1) #2番目の列を削除。axis = 1は列を削除するオプション
dfs2.columns = ["発表時間", "経済指標", "前回変動幅(USD/JPY)","前回","予想","結果"]#列名を手動で追加。



#前処理終了
dfs2    #テーブルを表示

となる

よくみたら配列で0〜6で

0が月曜

つまりdatetime などで曜日を取得してしていする必要がある

引数に曜日を数値で指定する必要ですかあるが

https://itips.krsw.biz/python-get-week-number/#st-toc-h-4

にあるように

Pythonで曜日を数字で取得する方法 まとめ

Pythonで曜日を取得するには weekday() を使う。

weekday() は今日(today)以外にもdatetime型の変数にも適用可能。

戻り値は0から6までの数値で月曜日が0に当たる。

とのこと

つまり今日の日付を取得して

これを使えば曜日指定できるはず

import datetime



# 曜日番号を取得(0は月曜日)

week_num = datetime.date.today().weekday()

print(datetime.date.today())

print(type(datetime.date.today()))

print(week_num)

このweek_num を使えば指定できるはず

これは成功

import pandas as pd

import datetime



week_num = datetime.date.today().weekday()



url = 'https://fx.minkabu.jp/indicators' #みんかぶFXの経済指標URLを取得

dfs = pd.read_html(url) #テーブルのオブジェクトを生成

print(week_num)

で曜日の数値が出る

あとは

dfs[week_num]

で本日のカレンダーを取得できる

import pandas as pd



url = 'https://fx.minkabu.jp/indicators' #みんかぶFXの経済指標URLを取得

dfs = pd.read_html(url) #テーブルのオブジェクトを生成



#前処理開始



dfs1 = dfs[0].dropna(subset = [week_num]) #4番にNaNが入っている行はバグなので、削除

dfs2 = dfs1.drop(2,axis =1) #2番目の列を削除。axis = 1は列を削除するオプション

dfs2.columns = ["発表時間", "経済指標", "前回変動幅(USD/JPY)","前回","予想","結果"]#列名を手動で追加。



#前処理終了



dfs2    #テーブルを表示

をそのあとで実行するとよりわかりやすく表示できる

そのまま経済指標のカレンダーで

Twitter で検索しても出ないが

予測値などを取得することはできるはず

次は

Pandas で時刻の比較とかトリガーとして使う方法を探す

これは

Pandas】DataFrameの文字列日付データを比較して、抽出したりする

https://www.tcom242242.net/entry/python-basic/dataframe-date-compare-extract/#toc7

を参考にまず日時の部分をdatetime へ変換する

#Dfs2 の発表時間をdatetime へ変換



def convert_date(x):

     date = datetime.datetime.strptime(x,"%Y-%m-%d %H:%M:%S")

     return date



dfs2["発表時間"] = dfs2["発表時間"].apply(convert_date)

dfs2

だとエラー
https://qiita.com/over_di/items/1270d3737e0a81719e56

Applyだとエラーになる

Pandas の to_datetime()

だとできるけど

年数の指定がないため1900年1月1日になってしまう

これを解決しないとだめ

これを解決するには

https://qiita.com/over_di/items/1270d3737e0a81719e56
Pandasのpd.to_datetimeで時刻のみ抜き出す方法

を参考に
https://qiita.com/over_di/items/1270d3737e0a81719e56
https://qiita.com/over_di/items/1270d3737e0a81719e56

.dt.time

をつければOK

dfs2["発表時間"] = pd.to_datetime(dfs2["発表時間"],format="%H:%M",errors='coerce').dt.time

dfs2

とすることで無事に変換できた

次は時刻に応じてカレンダーの列を取り出すようにする

オブジェクトを調べたら

to_datetime()

では型変換されていない

元の状態を

dfs2.dtypes
/
で調べたら


発表時間              object

経済指標              object

前回変動幅(USD/JPY)    object

前回                object

予想                object

結果                object

dtype: object

となっていた

ロイターRSS取得

ロイターRSS取得

ニュース取得にはRSSという方法もある

https://www.google.com/amp/www.algo-fx-blog.com/python-news-headlines-rss/amp/
によれば
feedparserライブラリでできるらしい

https://qiita.com/hann-solo/items/46d2bd25667618c36a5d
を参考に

ロイターRSSのURLを変更したらできたが

# ニュースのヘッドライン
print(reuters['entries'][0]['title'])

# 公開日時
print(reuters['entries'][0]['published'])
 
# URL
print(reuters['entries'][0]['link'])

でえらーになる

entries がうまく行かない

# 取得したデータを確認
reuters

で内容を確認

# 公開日時
#print(reuters['entries'][0]['published'])
print(reuters['entries'][0]['updated'])

としたら表示できた

[/python]
# ニュースの取得件数の確認
len(reuters[‘entries’])
[/python]
で確認したら現在は10が限界

# マーケットウォッチのデータを取得
market = feedparser.parse('http://feeds.marketwatch.com/marketwatch/realtimeheadlines/')
market_df = pd.DataFrame(market['entries'])
market_df.head(2)

としたが見にくい

# データを綺麗にする
market_df = market_df[['published', 'title']]
market_df.head()

で見やすくなったが title が省略される

market_df[['title']]

としても同じ

【Python】Pandasのデータフレームを省略せずに表示する方法を紹介!
を参考に省略せずに表示する

多分表示されなくてもデータの格納はされていると思う

https://qiita.com/kiddayo/items/e5ce519a234aff88af12

を参考に

pd.set_option('display.max_rows', 1500)
pd.set_option('display.max_columns', 4096)

としたが
Summary 表示は変わらない
とりあえずは保留

またRSSだと
ニュース更新頻度に問題あるため
Twitter から取得する

すでに tweepy はインストール済

あとはツイート検索と取得
これもできたので
次はテキストのみ抽出する

Streamline でエラーになったが

https://teratail.com/questions/97557
を参考に

重複したdatetime を修正し

new_date = datetime.strptime(i,"%d/%m/%Y").strftime("%Y-%m-%d")

としたら解決した

修正したので commit しようとしたら

Author identity unknown


*** Please tell me who you are.


Run


  git config --global user.email "you@example.com"

  git config --global user.name "Your Name"


to set your account's default identity.

Omit --global to set the identity only in this repository.


fatal: unable to auto-detect email address
 

となったので

git config --global user.email "メルアド"

git config --global user.name "snowpooll"
 

を実行後

git commit -m "Correction of datetime part"
 

これで

Git push origin main
 

でOK

for tweet in tweepy.Cursor(api.search_tweets, q='"#雇用統計"').items(10):

    print(tweet.text)

とすれば

#雇用統計

を含むツイートが10件取得できる

Tweet.text

でツイート情報を取得できる

Tweet.user

ツイートしたユーザ情報にアクセス

Tweet.user.name

ユーザ名の取得

次に特定ユーザのツイート

#if文にてRTとリプライを除外

[tweet.text for tweet in tweepy.Cursor(api.user_timeline, id="Qiita").items(10) if (list(tweet.text)[:2]!=['R', 'T']) & (list(tweet.text)[0]!='@')]

としたら

Unexpected parameter id

となるので id ではないかもしれない

https://toxublog.com/blog/get_tweet_tweepy/
を参考にDFにしてみた

必要なのは

ユーザ名
時刻
ツイート内容

これで一回経済指標で実験してみる

#検索条件の設定

searchkey = '#雇用統計'

item_num = 10

#検索条件を元にツイートを抽出

#tweets = tweepy.Cursor(api.search,q=searchkey,lang='ja').items(item_num)

tweets = tweepy.Cursor(api.search_tweets,q=searchkey,lang='ja').items(item_num)

tweet_data = []

for tweet in tweets:

        #tweet_dataの配列に取得したい情報を入れていく

    tweet_data.append([

        tweet.text,

        tweet.user.screen_name,

        tweet.user.name

                       ])

    #取り出したデータをpandasのDataFrameに変換

#CSVファイルに出力するときの列の名前を定義

labels=[

    'ツイート内容',

    'ユーザID',

    'アカウント名',

    ]

#tweet_dataのリストをpandasのDataFrameに変換

tweet_df = pd.DataFrame(tweet_data,columns=labels)

で大体近い感じ

あとは省略されている部分を調べる

Cvs では省略されていないので

そのままでも使えるはず

もしくはそのままでも使えるか調べる

経済指標アラートアカウント見たけど

アラートのみで実際の値はなし

Reutersとかのアカウントを使った方が正解かもしれない

とりあえず

アカウント名

ツイート内容が取得できればok

あとはここから絞り込み

replace と正規表現

replace と正規表現

import investpy

economic_data = investpy.news.economic_calendar(time_zone=None, time_filter='time_only', countries=['japan', 'united states'],importances=None,categories=None,from_date='01/01/2021', to_date='11/06/2021')

ISM =economic_data[economic_data['event'].str.contains('ISM Non-Manufacturing PMI')]
ISM

とすると
ISM Non-Manufacturing PMI (Dec)

というように結果に
(月)
という表示が入ってしまう

これを削除するには
replace の正規表現を使う

DataFrameで部分一致で文字列を置換

にあるように

replace で第3引数で
regex=True
を指定することで正規表現で replace が可能になる

正規表現については
分かりやすいpythonの正規表現の例

を参考に

今回は任意の英数字なので
[a-zA-Z0-9_]

そして1回以上の繰り返しなので
+
をつかう

replace で ( を置き換え対象にするには
\(
というようにしないとダメ

ISM['event'] = ISM['event'].replace("\([a-zA-Z0-9_]+\)","",regex=True)
ISM

とすれば
(Dec)
の部分が削除される

+を指定すれば繰り返しの指定ができるので

PHS =economic_data[economic_data['event'].str.contains('Pending Home Sales')]
PHS

の結果で
Pending Home Sales (MoM) (Dec)
となっていても

PHS['event']=PHS['event'].replace("\([a-zA-Z0-9_]+\)+","",regex=True)
PHS

とすることで
Pending Home Sales
と変換することができる

geogebra-classic インストール

関数とは入力に対して1つの出力があるということ

yはxの関数である
を表記すると
y=f(x)

英語で書くと
y equals function of x

例としてタクシーの料金

走行距離 => 料金

というもの

次は一次関数と二次関数

一次関数の例

チーズが1gあたり5円
箱代100円

これを y と x の関係にして数式で表現

チーズが x
金額が y
とする

y = 5 * x +100
= 5x +100
となる

この式により
100個売ると
5x + 100
の式から
600円
となる

これをグラフにすると
x=0だと y = 100
になり
xが増えた文だけ直線になっていく

この傾きは
xが1増えるとき
直線がいくつ増えるか
というのを勾配
という

ニューラルネットでいう勾配降下法
gradient descent
というので使う

x=0のときのyの値
これを切片という

今回の式を一般化すると
y = ax + b
となる

a が傾き
b を切片

ax の部分を項
という

項は1つずつの塊
つまり式の+とかで区切るときの塊をいう

このxの数が次数という

今回はxが1つだけなので
一次
となる

これが
y=ax2 + bx + c
なら
項が3つ
xが2つなので二次
となる

一番多い次数を数えて
一次、二次といっている
今回なら
二次関数で
二次の多項式
となっている

これらのグラフを描画するにあたり
GeoGebra を使うと便利

インストールできない場合
ブラウザ版もある

Reference:GeoGebra Installation

によれば
Ad Linux: the .deb and .rpm installers will automatically add the official GeoGebra repository to the package management system on the workstation. This will enable automatic update of GeoGebra every time a new version is released. If you want to include GeoGebra in your custom Linux distribution with GeoGebra included, the best way is to add the official GeoGebra repository (http://www.geogebra.net/linux/) to your package management system. The GPG key of the repository is at https://static.geogebra.org/linux/office@geogebra.org.gpg.key – the name of the package is geogebra-classic.
Installing GeoGebra directly from the command line: for Ubuntu, these two commands eliminate the need for downloading .deb files:
とあり
リポジトリを登録することで簡単インストールが可能

とあったが
リポジトリ登録のため

sudo apt-add-repository -u 'deb http://www.geogebra.net/linux/ stable main' 

を実行したら

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apt/cache.py", line 520, in update
    pulse_interval)
SystemError: W:ターゲット Packages (contrib/binary-amd64/Packages) は /etc/apt/sources.list:60 と /etc/apt/sources.list:62 で複数回設定されています, W:ターゲット Packages (contrib/binary-all/Packages) は /etc/apt/sources.list:60 と /etc/apt/sources.list:62 で複数回設定されています, W:ターゲット Translations (contrib/i18n/Translation-ja_JP) は /etc/apt/sources.list:60 と /etc/apt/sources.list:62 で複数回設定されています, W:ターゲット Translations (contrib/i18n/Translation-ja) は /etc/apt/sources.list:60 と /etc/apt/sources.list:62 で複数回設定されています, W:ターゲット Translations (contrib/i18n/Translation-en) は /etc/apt/sources.list:60 と /etc/apt/sources.list:62 で複数回設定されています, W:ターゲット DEP-11 (contrib/dep11/Components-amd64.yml) は /etc/apt/sources.list:60 と /etc/apt/sources.list:62 で複数回設定されています, W:ターゲット DEP-11-icons (contrib/dep11/icons-64x64.tar) は /etc/apt/sources.list:60 と /etc/apt/sources.list:62 で複数回設定されています, W:http://download.ebz.epson.net/dsc/op/stable/debian/dists/lsb3.2/Release.gpg: 鍵 E5220FB7014D0FBDA50DFC2BE5E86C008AA65D56 による署名は弱い digest アルゴリズム (SHA1) を使用しています, W:署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: https://dl.winehq.org/wine-builds/ubuntu xenial InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 76F1A20FF987672F, W:GPG エラー: http://www.geogebra.net/linux stable InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY C072A32983A736CF, W:リポジトリ http://www.geogebra.net/linux stable InRelease は署名されていません。, W:このようなリポジトリから取得したデータは認証できないので、データの使用は潜在的に危険です。, W:リポジトリの作成とユーザ設定の詳細は、apt-secure(8) man ページを参照してください。, E:/var/lib/apt/lists/partial/download.virtualbox.org_virtualbox_debian_dists_xenial_InRelease の状態を取得するのに失敗しました - pkgAcqTransactionItem::TransactionState-stat (2: そのようなファイルやディレクトリはありません), E:/var/lib/apt/lists/partial/download.virtualbox.org_virtualbox_debian_dists_xenial_contrib_binary-amd64_Packages の状態を取得するのに失敗しました - pkgAcqTransactionItem::TransactionState-stat (2: そのようなファイルやディレクトリはありません)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/bin/apt-add-repository", line 173, in <module>
    if not sp.add_source_from_shortcut(shortcut, options.enable_source):
  File "/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py", line 782, in add_source_from_shortcut
    cache.update(sources_list=new_debsrc_entry.file)
  File "/usr/lib/python3/dist-packages/apt/cache.py", line 522, in update
    raise FetchFailedException(e)
apt.cache.FetchFailedException: W:ターゲット Packages (contrib/binary-amd64/Packages) は /etc/apt/sources.list:60 と /etc/apt/sources.list:62 で複数回設定されています, W:ターゲット Packages (contrib/binary-all/Packages) は /etc/apt/sources.list:60 と /etc/apt/sources.list:62 で複数回設定されています, W:ターゲット Translations (contrib/i18n/Translation-ja_JP) は /etc/apt/sources.list:60 と /etc/apt/sources.list:62 で複数回設定されています, W:ターゲット Translations (contrib/i18n/Translation-ja) は /etc/apt/sources.list:60 と /etc/apt/sources.list:62 で複数回設定されています, W:ターゲット Translations (contrib/i18n/Translation-en) は /etc/apt/sources.list:60 と /etc/apt/sources.list:62 で複数回設定されています, W:ターゲット DEP-11 (contrib/dep11/Components-amd64.yml) は /etc/apt/sources.list:60 と /etc/apt/sources.list:62 で複数回設定されています, W:ターゲット DEP-11-icons (contrib/dep11/icons-64x64.tar) は /etc/apt/sources.list:60 と /etc/apt/sources.list:62 で複数回設定されています, W:http://download.ebz.epson.net/dsc/op/stable/debian/dists/lsb3.2/Release.gpg: 鍵 E5220FB7014D0FBDA50DFC2BE5E86C008AA65D56 による署名は弱い digest アルゴリズム (SHA1) を使用しています, W:署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: https://dl.winehq.org/wine-builds/ubuntu xenial InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 76F1A20FF987672F, W:GPG エラー: http://www.geogebra.net/linux stable InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY C072A32983A736CF, W:リポジトリ http://www.geogebra.net/linux stable InRelease は署名されていません。, W:このようなリポジトリから取得したデータは認証できないので、データの使用は潜在的に危険です。, W:リポジトリの作成とユーザ設定の詳細は、apt-secure(8) man ページを参照してください。, E:/var/lib/apt/lists/partial/download.virtualbox.org_virtualbox_debian_dists_xenial_InRelease の状態を取得するのに失敗しました - pkgAcqTransactionItem::TransactionState-stat (2: そのようなファイルやディレクトリはありません), E:/var/lib/apt/lists/partial/download.virtualbox.org_virtualbox_debian_dists_xenial_contrib_binary-amd64_Packages の状態を取得するのに失敗しました - pkgAcqTransactionItem::TransactionState-stat (2: そのようなファイルやディレクトリはありません)

となるため
Ubuntu Desktop 20.04にGeoGebraをインストールする

を参考にインストール

sudo apt-get -y install  libcanberra-gtk-module libgconf-2-4 gconf-service gconf2-common libcanberra-gtk0 gconf-service-backend

で必要なライブラリをインストール

今回は ubuntu 16.04 へインストールするので
Linux (deb): 64 bit installers for .deb based systems (Mint ≥ 18, Debian ≥ 8, Ubuntu ≥ 14.10)
をダウンロード

sudo dpkg -i geogebra-classic_6.0.666.0-202109211234_amd64.deb 

でインストール

geogebra を起動し
数式を入力

今回は
y = 5x + 100

として横の○アイコンをクリックすると
グラフの表示ON・OFFができる

VS Code で python のパスを追記

VS Code で python のパスを追記

vscode で自動補完されないため
最新版に更新したら
python そのものを読み込んでいない状態に
VSCodeでPython自作モジュールimport時のエラー(Unable to import )が消えない場合の対処方法
を参考に

python.autoComplete.extraPaths
を設定することにした

パスに関しては
VScodeの自動整形や自動補完の設定(Python)

を参考に

pip show tensorflow

の結果

Name: tensorflow
Version: 2.8.0
Summary: TensorFlow is an open source machine learning framework for everyone.
Home-page: https://www.tensorflow.org/
Author: Google Inc.
Author-email: packages@tensorflow.org
License: Apache 2.0
Location: /home/snowpool/anaconda3/lib/python3.8/site-packages
Requires: absl-py, astunparse, flatbuffers, gast, google-pasta, grpcio, h5py, keras, keras-preprocessing, libclang, numpy, opt-einsum, protobuf, setuptools, six, tensorboard, tensorflow-io-gcs-filesystem, termcolor, tf-estimator-nightly, typing-extensions, wrapt
Required-by: 

から
/home/snowpool/anaconda3/lib/python3.8/site-packages
がパスであることを確認

VS Codeのsettings.jsonの開き方

を参考に

ctrl + ,
で設定画面を開き
右上のアイコンから

Open Setting (JSON)アイコンをクリック

settings.json
の
{
    "workbench.editorAssociations": {
        "*.ipynb": "jupyter-notebook"
    },
    "notebook.cellToolbarLocation": {
        "default": "right",
        "jupyter-notebook": "left"
    }
}

{
    "workbench.editorAssociations": {
        "*.ipynb": "jupyter-notebook"
    },
    "notebook.cellToolbarLocation": {
        "default": "right",
        "jupyter-notebook": "left"
    },
    "python.autoComplete.extraPaths": [
        "/home/snowpool/anaconda3/lib/python3.8/site-packages"
    ],
    "python.analysis.extraPaths": [
        "/home/snowpool/anaconda3/lib/python3.8/site-packages"
    ]
}

として保存

これで再度 vscode を立ち上げると
コード補完がされるようになる