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
と変換することができる

Pandas の文字列型の数値を数値型に変換

Pandas の文字列型の数値を数値型に変換

import pandas as pd
import investpy
import altair as alt
import datetime

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


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

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)

これで取得した経済指標のデータを計算できるように数値変換する

previous_score = ISM['actual'].tail(1)
previous_score

でみると

2598    64.0
Name: actual, dtype: object

となるが数値ではなくオブジェクトになっている

Pandasで欠損のある列の文字列型の数値を数値型に変換する
を参考に数値に変換する

文字列を数値にするには
padas.to_numeric() を使う

errors には
raise がデフォルトで例外が発生
ignore は例外を抑えるが何も変換せずにそのままのオブジェクトを返す
coerce は数値変換できるものだけ変換しあとはNaN にする

これを利用して

previous_score2 =pd.to_numeric(ISM['actual'],errors="coerce")
previous_score2.tail(1)

とすれば

2598    64.0
Name: actual, dtype: float64

となる

これで数値化できたので
計算もできるようになる

print(previous_score2.tail(1) -1)
print( 62 - previous_score2.tail(1))

とすると結果は

2598    63.0
Name: actual, dtype: float64
2598   -2.0
Name: actual, dtype: float64

となった

これで経済指標の結果と前回の予測値との差分を計算して表示できる