def bk_factory_analyze_raceuma_result_df(self, input_raceuma_df, dict_folder): """ RaceUmaの因子分析を行うためのデータを取得 """ fa_list = [ '芝ダ障害コード', '右左', '内外', '種別', '条件', '記号', '重量', "頭数", "着順", '馬場状態', "タイム", "確定単勝オッズ", "コース取り", "上昇度コード", "馬体コード", "気配コード", "レースペース", "馬ペース", "1(2)着タイム差", "前3Fタイム", "後3Fタイム", "確定複勝オッズ下", "10時単勝オッズ", "10時複勝オッズ", "コーナー順位1", "コーナー順位2", "コーナー順位3", "コーナー順位4", "前3F先頭差", "後3F先頭差", "天候コード", "コース", "レース脚質", "4角コース取り", "確定単勝人気順位", "素点", "素点", "馬場差", "ペース", "出遅", "位置取", "前不利", "中不利", "後不利", "レース", "クラスコード", "レースペース流れ", "馬ペース流れ", "グレード" ] X = input_raceuma_df[fa_list].fillna(0) str_list = X.select_dtypes(include=object).columns.tolist() X[str_list] = X[str_list].astype(int) X.iloc[0] = X.iloc[0] + 0.000001 dict_name = "fa_raceuma_result_df" filename = dict_folder + dict_name + '.pkl' if os.path.exists(filename): fa = mu.load_dict(dict_name, dict_folder) else: fa = PCA(n_components=5) #fa = FactorAnalyzer(n_factors=5, rotation='promax', impute='drop') fa.fit(X) mu.save_dict(fa, dict_name, dict_folder) fa_np = fa.transform(X) fa_df = pd.DataFrame(fa_np, columns=["fa_1", "fa_2", "fa_3", "fa_4", "fa_5"]) X_fact = pd.concat([input_raceuma_df.drop(fa_list, axis=1), fa_df], axis=1) return X_fact
def factory_analyze_raceuma_result_df(self, race_df, input_raceuma_df, dict_folder): """ RaceUmaの因子分析を行うためのデータを取得 """ print("factory_analyze_raceuma_result_df") temp_df = pd.merge(input_raceuma_df, race_df, on="競走コード") X = temp_df[[ '競走コード', '馬番', '枠番', 'タイム指数', '単勝オッズ', '先行率', 'ペース偏差値', '距離増減', '斤量比', '追込率', '平均タイム', "距離", "頭数", "非根幹", "上り係数", "逃げ勝ち", "内勝ち", "外勝ち", "短縮勝ち", "延長勝ち", "人気勝ち", "1番人気", "3角先頭", "4角先頭", "上がり最速", "上がりタイム", "連闘", "休み明け", "大差負け", "展開脚質", "展開脚色" ]] mmsc_columns = ["頭数", "展開脚質", "展開脚色", "上がりタイム"] mmsc_dict_name = "sc_fa_race_mmsc" stdsc_columns = ["距離"] stdsc_dict_name = "sc_fa_race_stdsc" X = mu.scale_df_for_fa(X, mmsc_columns, mmsc_dict_name, stdsc_columns, stdsc_dict_name, dict_folder) X_fact = X.drop(["競走コード", "馬番"], axis=1).astype({ '非根幹': int, '逃げ勝ち': int, '内勝ち': int, '外勝ち': int, '短縮勝ち': int, '延長勝ち': int, '人気勝ち': int, '1番人気': int, '3角先頭': int, '4角先頭': int, '上がり最速': int, '休み明け': int, '連闘': int, '大差負け': int }) X_fact = X_fact.replace(np.inf, np.nan).fillna(X_fact.median()).fillna(0) X_fact.iloc[0] = X_fact.iloc[0] + 0.000001 dict_name = "fa_raceuma_result_df" filename = dict_folder + dict_name + '.pkl' if os.path.exists(filename): fa = mu.load_dict(dict_name, dict_folder) else: fa = FactorAnalyzer(n_factors=5, rotation='promax', impute='drop') fa.fit(X_fact) mu.save_dict(fa, dict_name, dict_folder) fa_np = fa.transform(X_fact) fa_df = pd.DataFrame(fa_np, columns=["fa_1", "fa_2", "fa_3", "fa_4", "fa_5"]) fa_df = pd.concat([X[["競走コード", "馬番"]], fa_df], axis=1) X_fact = pd.merge(input_raceuma_df, fa_df, on=["競走コード", "馬番"]) return X_fact
def choose_upper_n_count(self, df, column_name, n, dict_folder): """ 指定したカラム名の上位N出現以外をその他にまとめる :param df: :param column_name: :param n: :return: df """ dict_name = "choose_upper_" + str(n) + "_" + column_name file_name = dict_folder + dict_name + ".pkl" if os.path.exists(file_name): temp_df = mu.load_dict(dict_name, dict_folder) else: temp_df = df[column_name].value_counts().iloc[:n].index mu.save_dict(temp_df, dict_name, dict_folder) df.loc[:, column_name] = df[column_name].apply( lambda x: x if x in temp_df else 'その他') return df
def _target_encoding(self, sr, label, dict_name, fit, y): """ srに対してtarget encodingした結果を返す。fitがTrueの場合はエンコーディングする。ただし、すでに辞書がある場合はそれを使う。 :param series sr: エンコード対象のSeries :param str label: エンコードするラベル名 :param str dict_name: エンコード辞書名 :param bool fit: エンコード実施 or 実施済み辞書から変換 :param series y: 目的変数のSeries :return: """ # print("---- target encoding: " + label) tr = ce.TargetEncoder(cols=label) dict_file = self.dict_folder + '/' + dict_name + '.pkl' if fit and not os.path.exists(dict_file): tr = tr.fit(sr, y) mu.save_dict(tr, dict_name, self.dict_folder) else: tr = mu.load_dict(dict_name, self.dict_folder) sr_tr = tr.transform(sr) return sr_tr
def factory_analyze_raceuma_result_df(self, race_df, input_raceuma_df, dict_folder): """ RaceUmaの因子分析を行うためのデータを取得 """ print("-- check! this is BaseTransform class: " + sys._getframe().f_code.co_name) temp_df = pd.merge(input_raceuma_df, race_df, on="競走コード") X = temp_df[[ '競走コード', '馬番', 'タイム指数', '単勝オッズ', '先行率', 'ペース偏差値', '距離増減', '斤量比', '追込率', '平均タイム', "距離", "頭数", "非根幹", "上り係数", "逃げ勝ち", "内勝ち", "外勝ち", "短縮勝ち", "延長勝ち", "人気勝ち" ]] mmsc_columns = ["頭数"] mmsc_dict_name = "sc_fa_race_mmsc" stdsc_columns = ["距離"] stdsc_dict_name = "sc_fa_race_stdsc" X = mu.scale_df_for_fa(X, mmsc_columns, mmsc_dict_name, stdsc_columns, stdsc_dict_name, dict_folder) X_fact = X.drop(["競走コード", "馬番"], axis=1) X_fact = X_fact.replace(np.inf, np.nan).fillna(X_fact.median()).fillna(0) X_fact.iloc[0] = X_fact.iloc[0] + 0.000001 dict_name = "fa_raceuma_result_df" filename = dict_folder + dict_name + '.pkl' if os.path.exists(filename): fa = mu.load_dict(dict_name, dict_folder) else: fa = FactorAnalyzer(n_factors=3, rotation='promax', impute='drop') fa.fit(X_fact) mu.save_dict(fa, dict_name, dict_folder) fa_np = fa.transform(X_fact) fa_df = pd.DataFrame(fa_np, columns=["fa_1", "fa_2", "fa_3"]) fa_df = pd.concat([X[["競走コード", "馬番"]], fa_df], axis=1) X_fact = pd.merge(input_raceuma_df, fa_df, on=["競走コード", "馬番"]) return X_fact
def calc_analyzed_df(self, base_df): df = pd.DataFrame() for target in self.analyze_target: target_list = base_df[target] # https://note.nkmk.me/python-collections-counter/ c = collections.Counter(target_list) target_tuple = c.most_common(100) for tuple in target_tuple: target_val = tuple[0] target_df = base_df[base_df[target] == target_val] target_base_return = target_df["複勝配当"] target_base_mean = mean(target_base_return) for cls_val_type in self.class_list: cls_list = base_df[cls_val_type].drop_duplicates() for cls_val in cls_list: target_class_return = target_df[target_df[cls_val_type] == cls_val]["複勝配当"] res = stats.ttest_ind(target_base_return, target_class_return) if res[1] < 0.05: print("target:" + target + " - " + target_val + " class:" + cls_val_type + " - " + cls_val) avg_diff = mean(target_class_return) - target_base_mean sr = pd.Series([target_val, cls_val, avg_diff], index=[target, cls_val_type, "平均差"]) df = df.append(sr) mu.save_dict(df, "analyzed_df", self.dict_folder)