Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #3
0
    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
Beispiel #4
0
    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
Beispiel #5
0
    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
Beispiel #6
0
 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)