def test_variables_cast_as_category(df_enc_category_dtypes): encoder = CountFrequencyEncoder(encoding_method="count", variables=["var_A"]) X = encoder.fit_transform(df_enc_category_dtypes) # expected result transf_df = df_enc_category_dtypes.copy() transf_df["var_A"] = [ 6, 6, 6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, ] # transform params pd.testing.assert_frame_equal(X, transf_df, check_dtype=False) assert X["var_A"].dtypes == int encoder = CountFrequencyEncoder(encoding_method="frequency", variables=["var_A"]) X = encoder.fit_transform(df_enc_category_dtypes) assert X["var_A"].dtypes == float
def test_column_names_are_numbers(df_numeric_columns): encoder = CountFrequencyEncoder(encoding_method="frequency", variables=[0, 1, 2, 3], ignore_format=True) X = encoder.fit_transform(df_numeric_columns) # expected output transf_df = { 0: [0.25, 0.25, 0.25, 0.25], 1: [0.25, 0.25, 0.25, 0.25], 2: [0.25, 0.25, 0.25, 0.25], 3: [0.25, 0.25, 0.25, 0.25], 4: pd.date_range("2020-02-24", periods=4, freq="T"), } transf_df = pd.DataFrame(transf_df) # init params assert encoder.encoding_method == "frequency" assert encoder.variables == [0, 1, 2, 3] # fit params assert encoder.variables_ == [0, 1, 2, 3] assert encoder.n_features_in_ == 5 # transform params pd.testing.assert_frame_equal(X, transf_df)
def test_ignore_variable_format_with_frequency(df_vartypes): encoder = CountFrequencyEncoder(encoding_method="frequency", variables=None, ignore_format=True) X = encoder.fit_transform(df_vartypes) # expected output transf_df = { "Name": [0.25, 0.25, 0.25, 0.25], "City": [0.25, 0.25, 0.25, 0.25], "Age": [0.25, 0.25, 0.25, 0.25], "Marks": [0.25, 0.25, 0.25, 0.25], "dob": [0.25, 0.25, 0.25, 0.25], } transf_df = pd.DataFrame(transf_df) # init params assert encoder.encoding_method == "frequency" assert encoder.variables is None # fit params assert encoder.variables_ == ["Name", "City", "Age", "Marks", "dob"] assert encoder.n_features_in_ == 5 # transform params pd.testing.assert_frame_equal(X, transf_df)
def clean_data(X): X.dropna(subset=['target'], inplace=True) y = X.pop('target') X.drop(columns='ID', inplace=True) X['v22'] = X['v22'].apply(az_to_int) cat_cols = X.select_dtypes(include=['object']).columns.tolist() con_cols = X.select_dtypes(include=['number']).columns.tolist() num_missing_imputer = SimpleImputer(strategy='median') cat_missing_imputer = CategoricalImputer(fill_value='__MISS__') rare_label_encoder = RareLabelEncoder(tol=0.01, n_categories=10, replace_with='__OTHER__') cat_freq_encoder = CountFrequencyEncoder(encoding_method="frequency") X[con_cols] = num_missing_imputer.fit_transform(X[con_cols]) X[cat_cols] = cat_missing_imputer.fit_transform(X[cat_cols]) X[cat_cols] = rare_label_encoder.fit_transform(X[cat_cols]) X[cat_cols] = cat_freq_encoder.fit_transform(X[cat_cols]) # more cleaning trimmer = Winsorizer(capping_method='quantiles', tail='both', fold=0.005) X = trimmer.fit_transform(X) undersampler = RandomUnderSampler(sampling_strategy=0.7, random_state=1234) X, Y = undersampler.fit_resample(X, y) quasi_constant = DropConstantFeatures(tol=0.998) X = quasi_constant.fit_transform(X) print(f"Quasi Features to drop {quasi_constant.features_to_drop_}") # Remove duplicated features¶ duplicates = DropDuplicateFeatures() X = duplicates.fit_transform(X) print(f"Duplicate feature sets {duplicates.duplicated_feature_sets_}") print(f"Dropping duplicate features {duplicates.features_to_drop_}") drop_corr = DropCorrelatedFeatures(method="pearson", threshold=0.95, missing_values="ignore") X = drop_corr.fit_transform(X) print(f"Drop correlated feature sets {drop_corr.correlated_feature_sets_}") print(f"Dropping correlared features {drop_corr.features_to_drop_}") X['target'] = Y return X
def test_encode_1_variable_with_counts(df_enc): # test case 1: 1 variable, counts encoder = CountFrequencyEncoder(encoding_method="count", variables=["var_A"]) X = encoder.fit_transform(df_enc) # expected result transf_df = df_enc.copy() transf_df["var_A"] = [ 6, 6, 6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, ] # init params assert encoder.encoding_method == "count" assert encoder.variables == ["var_A"] # fit params assert encoder.variables_ == ["var_A"] assert encoder.encoder_dict_ == {"var_A": {"A": 6, "B": 10, "C": 4}} assert encoder.n_features_in_ == 3 # transform params pd.testing.assert_frame_equal(X, transf_df)
def test_automatically_select_variables_encode_with_frequency(df_enc): # test case 2: automatically select variables, frequency encoder = CountFrequencyEncoder(encoding_method="frequency", variables=None) X = encoder.fit_transform(df_enc) # expected output transf_df = df_enc.copy() transf_df["var_A"] = [ 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.2, 0.2, 0.2, 0.2, ] transf_df["var_B"] = [ 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.2, 0.2, 0.2, 0.2, ] # init params assert encoder.encoding_method == "frequency" assert encoder.variables == ["var_A", "var_B"] # fit params assert encoder.encoder_dict_ == { "var_A": { "A": 0.3, "B": 0.5, "C": 0.2 }, "var_B": { "A": 0.5, "B": 0.3, "C": 0.2 }, } assert encoder.input_shape_ == (20, 3) # transform params pd.testing.assert_frame_equal(X, transf_df)