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
となっていた