else: race_class = '特別' # print(race_class) # レース番号はURLから作る race_num = re.findall('racekey=[0-9]{6}([0-9][0-9])', member) race_num = race_num[0] + 'R' #print("{} {} {} {}".format(kaijou, race_num, cource, distance)) tables = gtbl.get_tables(content) # Tab:基本->展開->外厩の順に取得 df_race = pd.DataFrame() for table in tables: rows = ptbl.parse_table(table) if len(df_race) > 0: # 展開->外厩->競走馬詳細->調教->直前情報->レース結果 取得 t_df = pd.DataFrame(rows[1:], columns=rows[0]) # レース結果テーブルには'バイアス'列が2つ存在する為リネーム if (True == ('バイアス' in t_df.columns.values)): col = t_df.columns.values # 全体の列名を取得 col[18] = '直線バイアス' # 一部を加工 ※[18]はマジックNo col[20] = '脚質バイアス' # 一部を加工 ※[20]はマジックNo t_df.columns = col # 加工した列名を戻す # データ結合 cols_to_use = t_df.columns.difference( df_race.columns) # 同名列の衝突回避(df_raceデータを優先する) cols_to_use = list(cols_to_use.values) # objectタイプ→リスト化
def Yosou_csv_Gen(url1, url2, race_id): csv_name = '00_test01.csv' # MachineLearning_RandomForest.pyの指定する文字列 # 直展取得 res2 = requests.get(url2) htstcd = res2.status_code # HTTPステータスコード 404 if htstcd == 404: print("Yosou_csv_Gen >> まだ直前展開がありません...") return -1 else: pass res2.encoding = res2.apparent_encoding content2 = res2.text # データシート取得 res = requests.get(url1) # HTTPステータスコード 404 if htstcd == 404: print("Yosou_csv_Gen >>障害レースかもね...") return -1 else: pass tmpdate = re.findall('\/[0-9]{8}\/', url1) race_date = tmpdate[0].replace('/', '') res.encoding = res.apparent_encoding content = res.text tables = gtbl.get_tables(content) tcount = 0 for dmy in tables: rows = ptbl.parse_table(dmy) if not rows[0]: # パラメータの無いテーブルは先頭からっぽ continue else: tcount += 1 pass #print("{}:{}".format(tcount, race_id)) if tcount == race_id: print("race_id : {}R".format(race_id)) # データフレームにパラメータテーブルの情報を格納 df2 = pd.DataFrame(rows[1:], columns=rows[0]) ## レース情報 soup = BeautifulSoup(content, "lxml") race_str = soup.find_all("div", attrs={"class", "headding03"}) race_tmp = re.split(' ', race_str[((race_id - 1) * 3)].text) tmpstr = race_tmp[0] # kaijou = tmpstr[:2] race_num = tmpstr[2:] tmpstr = race_tmp[2] course = tmpstr[:1] distance = tmpstr[1:-1] df2['日付'] = race_date df2['会場'] = kaijou df2['レース'] = race_num df2['コース'] = course df2['距離'] = distance cols = list(df2.columns.values) cols = ['距離'] + [col for col in df2 if col != '距離'] df2 = df2[cols] cols = list(df2.columns.values) cols = ['コース'] + [col for col in df2 if col != 'コース'] df2 = df2[cols] cols = list(df2.columns.values) cols = ['レース'] + [col for col in df2 if col != 'レース'] df2 = df2[cols] cols = list(df2.columns.values) cols = ['会場'] + [col for col in df2 if col != '会場'] df2 = df2[cols] cols = list(df2.columns.values) cols = ['日付'] + [col for col in df2 if col != '日付'] df2 = df2[cols] df2['先行力順位'] = df2["先行力"].rank(ascending=False, method='min') df2['追走力順位'] = df2["追走力"].rank(ascending=False, method='min') df2['持久力順位'] = df2["持久力"].rank(ascending=False, method='min') df2['持続力順位'] = df2["持続力"].rank(ascending=False, method='min') df2['瞬発力順位'] = df2["瞬発力"].rank(ascending=False, method='min') df2['ST指数順位'] = df2["ST指数"].rank(ascending=False, method='min') df2['仕上指数順位'] = df2["仕上指数"].rank(ascending=False, method='min') # 直前ファクター取得 t_df = getyoku.get_tyokuten(url2) # データシートと重複する列を除外する t_df = t_df.drop(["馬番", "馬名", "騎手名", "ST指数", "仕上指数"], axis=1) # データシートのDFと直前展開のDFを結合 df2 = pd.merge(df2, t_df, right_index=True, left_index=True) df2.to_csv(csv_name, encoding="shift_jis", index=False, mode="w") print("Success!! : {}".format(csv_name)) else: # 目的のレースではない pass return 1
race_str = soup.find_all("div", attrs={"class", "headding03"}) # table 要素を取得する # HTML 中のすべての table 要素が表として使われているとも # 限らないし、またそれが望んでいるものであるとも限らないので # このあたりのプロセスは関数としてまとめていない # ( = テーブルの選択自体はユーザーが行う) tables = gtbl.get_tables(content) #table = tables[8] #print(table) #for num in tables: # print(num) hoge = 0 ridx = 0 # 競馬ラボのレースindex for dmy in tables: rows = ptbl.parse_table(dmy) if not rows[0]: continue df2 = pd.DataFrame(rows[1:], columns=rows[0]) ##ここから コース情報分割処理 # レース情報に含まれる全角スペースを基準にして分割する # 0 1 2 3 #['中山1R', '3歳未勝利3歳(馬齢)', 'ダ1200m', '10:10発走'] # ひとまず右記の形式で出力する。 例:中山, 1R, ダ, 1200 # 0は会場名とレース番号を分ける # 2はコースと距離を分ける race_tmp = re.split(' ', race_str[hoge].text) print(race_tmp) # 東京と1R分割 tmpstr = race_tmp[0]
print(tl[0].text) # table 要素を取得する # HTML 中のすべての table 要素が表として使われているとも # 限らないし、またそれが望んでいるものであるとも限らないので # このあたりのプロセスは関数としてまとめていない # ( = テーブルの選択自体はユーザーが行う) tables = gtbl.get_tables(content) #table = tables[8] #print(table) #for num in tables: # print(num) fcnt = 1 hoge = 0 for dmy in tables: rows = ptbl.parse_table(dmy) if not rows[0]: continue df2 = pd.DataFrame(rows[1:], columns=rows[0]) #print(course[hoge].text) # レース情報をDataFrameに追加 df2['レース情報'] = course[hoge].text # DataFrame末尾に追加したレース情報を先頭に移動する cols = list(df2.columns.values) cols = ['レース情報'] + [col for col in df2 if col != 'レース情報'] df2 = df2[cols] # for Debug # print(df2)