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

となっていた

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です