from sklearn.decomposition import LatentDirichletAllocation

from features import Feature
from features import ArithmeticFeature, AggregateFeature, GroupCountFeature
from features import DecompositionFeature


############################################################
# count features
############################################################

class CountVersionsEngineAvSig(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'AvSigVersion']

    @property
    def count_column(self):
        return 'AvSigVersion'


class CountVersionsEngineApp(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'AppVersion']

    @property
    def count_column(self):
        return 'AppVersion'


class CountVersionsEngineOS(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'Census_OSVersion']

    @property
    def count_column(self):
        return 'Census_OSVersion'


class CountVersionsAvSigApp(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AvSigVersion', 'AppVersion']

    @property
    def count_column(self):
        return 'AppVersion'


class CountVersionsAvSigOS(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AvSigVersion', 'Census_OSVersion']

    @property
    def count_column(self):
        return 'Census_OSVersion'


class CountVersionsAppOS(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AppVersion', 'Census_OSVersion']

    @property
    def count_column(self):
        return 'Census_OSVersion'


class CountVersionsOSInstallType1(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'AvSigVersion', 'Census_OSInstallTypeName']

    @property
    def count_column(self):
        return 'Census_OSInstallTypeName'


class CountVersionsOSInstallType2(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'AppVersion', 'Census_OSInstallTypeName']

    @property
    def count_column(self):
        return 'Census_OSInstallTypeName'


class CountVersionsOSInstallType3(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'Census_OSVersion', 'Census_OSInstallTypeName']

    @property
    def count_column(self):
        return 'Census_OSInstallTypeName'


class CountVersionsOSInstallType4(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AvSigVersion', 'AppVersion', 'Census_OSInstallTypeName']

    @property
    def count_column(self):
        return 'Census_OSInstallTypeName'


class CountVersionsOSInstallType5(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AvSigVersion', 'Census_OSVersion', 'Census_OSInstallTypeName']

    @property
    def count_column(self):
        return 'Census_OSInstallTypeName'


class CountVersionsOSInstallType6(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AppVersion', 'Census_OSVersion', 'Census_OSInstallTypeName']

    @property
    def count_column(self):
        return 'Census_OSInstallTypeName'


class CountVersionsAVProductStates1(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'AvSigVersion', 'AVProductStatesIdentifier']

    @property
    def count_column(self):
        return 'AVProductStatesIdentifier'


class CountVersionsAVProductStates2(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'AppVersion', 'AVProductStatesIdentifier']

    @property
    def count_column(self):
        return 'AVProductStatesIdentifier'


class CountVersionsAVProductStates3(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'Census_OSVersion', 'AVProductStatesIdentifier']

    @property
    def count_column(self):
        return 'AVProductStatesIdentifier'


class CountVersionsAVProductStates4(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AvSigVersion', 'AppVersion', 'AVProductStatesIdentifier']

    @property
    def count_column(self):
        return 'AVProductStatesIdentifier'


class CountVersionsAVProductStates5(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AvSigVersion', 'Census_OSVersion', 'AVProductStatesIdentifier']

    @property
    def count_column(self):
        return 'AVProductStatesIdentifier'


class CountVersionsAVProductStates6(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AppVersion', 'Census_OSVersion', 'AVProductStatesIdentifier']

    @property
    def count_column(self):
        return 'AVProductStatesIdentifier'


class CountVersionsAVProductsInstalled1(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'AvSigVersion', 'AVProductsInstalled']

    @property
    def count_column(self):
        return 'AVProductsInstalled'


class CountVersionsAVProductsInstalled2(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'AppVersion', 'AVProductsInstalled']

    @property
    def count_column(self):
        return 'AVProductsInstalled'


class CountVersionsAVProductsInstalled3(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'Census_OSVersion', 'AVProductsInstalled']

    @property
    def count_column(self):
        return 'AVProductsInstalled'


class CountVersionsAVProductsInstalled4(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AvSigVersion', 'AppVersion', 'AVProductsInstalled']

    @property
    def count_column(self):
        return 'AVProductsInstalled'


class CountVersionsAVProductsInstalled5(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AvSigVersion', 'Census_OSVersion', 'AVProductsInstalled']

    @property
    def count_column(self):
        return 'AVProductsInstalled'


class CountVersionsAVProductsInstalled6(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AppVersion', 'Census_OSVersion', 'AVProductsInstalled']

    @property
    def count_column(self):
        return 'AVProductsInstalled'


class CountVersionsSmartScreen1(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'AvSigVersion', 'SmartScreen']

    @property
    def count_column(self):
        return 'SmartScreen'


class CountVersionsSmartScreen2(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'AppVersion', 'SmartScreen']

    @property
    def count_column(self):
        return 'SmartScreen'


class CountVersionsSmartScreen3(GroupCountFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'Census_OSVersion', 'SmartScreen']

    @property
    def count_column(self):
        return 'SmartScreen'


class CountVersionsSmartScreen4(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AvSigVersion', 'AppVersion', 'SmartScreen']

    @property
    def count_column(self):
        return 'SmartScreen'


class CountVersionsSmartScreen5(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AvSigVersion', 'Census_OSVersion', 'SmartScreen']

    @property
    def count_column(self):
        return 'SmartScreen'


class CountVersionsSmartScreen6(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AppVersion', 'Census_OSVersion', 'SmartScreen']

    @property
    def count_column(self):
        return 'SmartScreen'


class CountWeekAVProductStates(GroupCountFeature):
    @property
    def group_columns(self):
        return ['DayOfWeek', 'AVProductStatesIdentifier']

    @property
    def count_column(self):
        return 'AVProductStatesIdentifier'


class CountWeekAVProductsInstalled(GroupCountFeature):
    @property
    def group_columns(self):
        return ['DayOfWeek', 'AVProductsInstalled']

    @property
    def count_column(self):
        return 'AVProductsInstalled'


class CountWeekSmartScreen(GroupCountFeature):
    @property
    def group_columns(self):
        return ['DayOfWeek', 'SmartScreen']

    @property
    def count_column(self):
        return 'SmartScreen'


class CountWeekOSInstallTypeName(GroupCountFeature):
    @property
    def group_columns(self):
        return ['DayOfWeek', 'Census_OSInstallTypeName']

    @property
    def count_column(self):
        return 'Census_OSInstallTypeName'


class CountRegionAVProductStates(GroupCountFeature):
    @property
    def group_columns(self):
        return ['Wdft_RegionIdentifier', 'AVProductStatesIdentifier']

    @property
    def count_column(self):
        return 'AVProductStatesIdentifier'


class CountRegionAVProductsInstalled(GroupCountFeature):
    @property
    def group_columns(self):
        return ['Wdft_RegionIdentifier', 'AVProductsInstalled']

    @property
    def count_column(self):
        return 'AVProductsInstalled'


class CountRegionSmartScreen(GroupCountFeature):
    @property
    def group_columns(self):
        return ['Wdft_RegionIdentifier', 'SmartScreen']

    @property
    def count_column(self):
        return 'SmartScreen'


class CountRegionOSInstallTypeName(GroupCountFeature):
    @property
    def group_columns(self):
        return ['Wdft_RegionIdentifier', 'Census_OSInstallTypeName']

    @property
    def count_column(self):
        return 'Census_OSInstallTypeName'


class CountCountryAVProductStates(GroupCountFeature):
    @property
    def group_columns(self):
        return ['CountryIdentifier', 'AVProductStatesIdentifier']

    @property
    def count_column(self):
        return 'AVProductStatesIdentifier'


class CountCountryAVProductsInstalled(GroupCountFeature):
    @property
    def group_columns(self):
        return ['CountryIdentifier', 'AVProductsInstalled']

    @property
    def count_column(self):
        return 'AVProductsInstalled'


class CountCountrySmartScreen(GroupCountFeature):
    @property
    def group_columns(self):
        return ['CountryIdentifier', 'SmartScreen']

    @property
    def count_column(self):
        return 'SmartScreen'


class CountCountryOSInstallTypeName(GroupCountFeature):
    @property
    def group_columns(self):
        return ['CountryIdentifier', 'Census_OSInstallTypeName']

    @property
    def count_column(self):
        return 'Census_OSInstallTypeName'


class CountCityAVProductStates(GroupCountFeature):
    @property
    def group_columns(self):
        return ['CityIdentifier', 'AVProductStatesIdentifier']

    @property
    def count_column(self):
        return 'AVProductStatesIdentifier'


class CountCityAVProductsInstalled(GroupCountFeature):
    @property
    def group_columns(self):
        return ['CityIdentifier', 'AVProductsInstalled']

    @property
    def count_column(self):
        return 'AVProductsInstalled'


class CountCitySmartScreen(GroupCountFeature):
    @property
    def group_columns(self):
        return ['CityIdentifier', 'SmartScreen']

    @property
    def count_column(self):
        return 'SmartScreen'


class CountCityOSInstallTypeName(GroupCountFeature):
    @property
    def group_columns(self):
        return ['CityIdentifier', 'Census_OSInstallTypeName']

    @property
    def count_column(self):
        return 'Census_OSInstallTypeName'


class CountAVProductStatesAVProductsInstalled(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AVProductStatesIdentifier', 'AVProductsInstalled']

    @property
    def count_column(self):
        return 'AVProductsInstalled'


class CountAVProductStatesSmartScreen(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AVProductStatesIdentifier', 'SmartScreen']

    @property
    def count_column(self):
        return 'SmartScreen'


class CountAVProductStatesOSInstallType(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AVProductStatesIdentifier', 'Census_OSInstallTypeName']

    @property
    def count_column(self):
        return 'Census_OSInstallTypeName'


class CountAVProductsInstalledSmartScreen(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AVProductsInstalled', 'SmartScreen']

    @property
    def count_column(self):
        return 'SmartScreen'


class CountAVProductsInstalledOSInstallType(GroupCountFeature):
    @property
    def group_columns(self):
        return ['AVProductsInstalled', 'Census_OSInstallTypeName']

    @property
    def count_column(self):
        return 'Census_OSInstallTypeName'


class CountSmartScreenOSInstallType(GroupCountFeature):
    @property
    def group_columns(self):
        return ['SmartScreen', 'Census_OSInstallTypeName']

    @property
    def count_column(self):
        return 'Census_OSInstallTypeName'


############################################################
# aggregate features
############################################################

class VersionAggs1(AggregateFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'AvSigVersion']

    @property
    def aggs(self):
        return {
            'Census_SystemVolumeTotalCapacity': ['mean', 'std'],
            'Census_PrimaryDiskTotalCapacity': ['mean', 'std'],
            'Census_InternalPrimaryDiagonalDisplaySizeInInches': ['mean', 'std'],
            'Wdft_IsGamer': ['mean', 'std'],
        }


class VersionAggs2(AggregateFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'AppVersion']

    @property
    def aggs(self):
        return {
            'Census_SystemVolumeTotalCapacity': ['mean', 'std'],
            'Census_PrimaryDiskTotalCapacity': ['mean', 'std'],
            'Census_InternalPrimaryDiagonalDisplaySizeInInches': ['mean', 'std'],
            'Wdft_IsGamer': ['mean', 'std'],
        }


class VersionAggs3(AggregateFeature):
    @property
    def group_columns(self):
        return ['EngineVersion', 'Census_OSVersion']

    @property
    def aggs(self):
        return {
            'Census_SystemVolumeTotalCapacity': ['mean', 'std'],
            'Census_PrimaryDiskTotalCapacity': ['mean', 'std'],
            'Census_InternalPrimaryDiagonalDisplaySizeInInches': ['mean', 'std'],
            'Wdft_IsGamer': ['mean', 'std'],
        }


class VersionAggs4(AggregateFeature):
    @property
    def group_columns(self):
        return ['AvSigVersion', 'AppVersion']

    @property
    def aggs(self):
        return {
            'Census_SystemVolumeTotalCapacity': ['mean', 'std'],
            'Census_PrimaryDiskTotalCapacity': ['mean', 'std'],
            'Census_InternalPrimaryDiagonalDisplaySizeInInches': ['mean', 'std'],
            'Wdft_IsGamer': ['mean', 'std'],
        }


class VersionAggs5(AggregateFeature):
    @property
    def group_columns(self):
        return ['AvSigVersion', 'Census_OSVersion']

    @property
    def aggs(self):
        return {
            'Census_SystemVolumeTotalCapacity': ['mean', 'std'],
            'Census_PrimaryDiskTotalCapacity': ['mean', 'std'],
            'Census_InternalPrimaryDiagonalDisplaySizeInInches': ['mean', 'std'],
            'Wdft_IsGamer': ['mean', 'std'],
        }


class VersionAggs6(AggregateFeature):
    @property
    def group_columns(self):
        return ['AppVersion', 'Census_OSVersion']

    @property
    def aggs(self):
        return {
            'Census_SystemVolumeTotalCapacity': ['mean', 'std'],
            'Census_PrimaryDiskTotalCapacity': ['mean', 'std'],
            'Census_InternalPrimaryDiagonalDisplaySizeInInches': ['mean', 'std'],
            'Wdft_IsGamer': ['mean', 'std'],
        }


############################################################
# arithmethic features
############################################################

class MulSystemVolumeTotalCapacityProcessorCoreCount(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_SystemVolumeTotalCapacity', 'Census_ProcessorCoreCount']


class DivSystemVolumeTotalCapacityProcessorCoreCount(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_SystemVolumeTotalCapacity', 'Census_ProcessorCoreCount']


class MulPrimaryDiskTotalCapacityProcessorCoreCount(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_PrimaryDiskTotalCapacity', 'Census_ProcessorCoreCount']


class DivPrimaryDiskTotalCapacityProcessorCoreCount(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_PrimaryDiskTotalCapacity', 'Census_ProcessorCoreCount']


class MulTotalPhysicalRAMProcessorCoreCount(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_TotalPhysicalRAM', 'Census_ProcessorCoreCount']


class DivTotalPhysicalRAMProcessorCoreCount(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_TotalPhysicalRAM', 'Census_ProcessorCoreCount']


class MulDisplaySizeInchesProcessorCoreCount(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_InternalPrimaryDiagonalDisplaySizeInInches',
                'Census_ProcessorCoreCount']


class DivDisplaySizeInchesProcessorCoreCount(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_InternalPrimaryDiagonalDisplaySizeInInches',
                'Census_ProcessorCoreCount']


class MulDisplayResolutionHorizontalProcessorCoreCount(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_InternalPrimaryDisplayResolutionHorizontal',
                'Census_ProcessorCoreCount']


class DivDisplayResolutionHorizontalProcessorCoreCount(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_InternalPrimaryDisplayResolutionHorizontal',
                'Census_ProcessorCoreCount']


class MulDisplayResolutionVerticalProcessorCoreCount(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_InternalPrimaryDisplayResolutionVertical',
                'Census_ProcessorCoreCount']


class DivDisplayResolutionVerticalProcessorCoreCount(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_InternalPrimaryDisplayResolutionVertical',
                'Census_ProcessorCoreCount']


class DivSystemVolumeTotalCapacityTotalPhysicalRAM(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_SystemVolumeTotalCapacity', 'Census_TotalPhysicalRAM']


class DivPrimaryDiskTotalCapacityTotalPhysicalRAM(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_PrimaryDiskTotalCapacity', 'Census_TotalPhysicalRAM']


class DivDisplaySizeInchesTotalPhysicalRAM(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_InternalPrimaryDiagonalDisplaySizeInInches',
                'Census_TotalPhysicalRAM']


class DivDisplayResolutionHorizontalTotalPhysicalRAM(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_InternalPrimaryDisplayResolutionHorizontal',
                'Census_TotalPhysicalRAM']


class DivDisplayResolutionVerticalTotalPhysicalRAM(ArithmeticFeature):
    @property
    def column_pair(self):
        return ['Census_InternalPrimaryDisplayResolutionVertical',
                'Census_TotalPhysicalRAM']


############################################################
# LDA features
############################################################

class LDAEngineVerAVProductsInstalled3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['EngineVersion', 'AVProductsInstalled']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAAppVerAVProductsInstalled3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['AppVersion', 'AVProductsInstalled']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAAvSigVerAVProductsInstalled3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['AvSigVersion', 'AVProductsInstalled']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAAvProductStatesAVProductsInstalled3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['AVProductStatesIdentifier', 'AVProductsInstalled']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDACountryAVProductsInstalled3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['CountryIdentifier', 'AVProductsInstalled']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDACityAVProductsInstalled3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['CityIdentifier', 'AVProductsInstalled']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAGeoNameAVProductsInstalled3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['GeoNameIdentifier', 'AVProductsInstalled']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDALocaleEnglishNameAVProductsInstalled3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['LocaleEnglishNameIdentifier', 'AVProductsInstalled']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAOsBuildLabAVProductsInstalled3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['OsBuildLab', 'AVProductsInstalled']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAOemModelAVProductsInstalled3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Census_OEMModelIdentifier', 'AVProductsInstalled']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAProcessorModelAVProductsInstalled3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Census_ProcessorModelIdentifier', 'AVProductsInstalled']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDACensusOSVerAVProductsInstalled3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Census_OSVersion', 'AVProductsInstalled']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAFirmwareVerAVProductsInstalled3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Census_FirmwareVersionIdentifier', 'AVProductsInstalled']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDARegionAVProductsInstalled3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Wdft_RegionIdentifier', 'AVProductsInstalled']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAEngineVerSmartScreen3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['EngineVersion', 'SmartScreen']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAAppVerSmartScreen3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['AppVersion', 'SmartScreen']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAAvSigVerSmartScreen3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['AvSigVersion', 'SmartScreen']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAAvProductStatesSmartScreen3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['AVProductStatesIdentifier', 'SmartScreen']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDACountrySmartScreen3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['CountryIdentifier', 'SmartScreen']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDACitySmartScreen3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['CityIdentifier', 'SmartScreen']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAGeoNameSmartScreen3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['GeoNameIdentifier', 'SmartScreen']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDALocaleEnglishNameSmartScreen3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['LocaleEnglishNameIdentifier', 'SmartScreen']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAOsBuildLabSmartScreen3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['OsBuildLab', 'SmartScreen']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAOemModelSmartScreen3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Census_OEMModelIdentifier', 'SmartScreen']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAProcessorModelSmartScreen3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Census_ProcessorModelIdentifier', 'SmartScreen']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDACensusOSVerSmartScreen3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Census_OSVersion', 'SmartScreen']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAFirmwareVerSmartScreen3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Census_FirmwareVersionIdentifier', 'SmartScreen']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDARegionSmartScreen3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Wdft_RegionIdentifier', 'SmartScreen']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAEngineVerActivationChannel3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['EngineVersion', 'Census_ActivationChannel']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAAppVerActivationChannel3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['AppVersion', 'Census_ActivationChannel']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAAvSigVerActivationChannel3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['AvSigVersion', 'Census_ActivationChannel']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAAvProductStatesActivationChannel3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['AVProductStatesIdentifier', 'Census_ActivationChannel']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDACountryActivationChannel3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['CountryIdentifier', 'Census_ActivationChannel']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDACityActivationChannel3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['CityIdentifier', 'Census_ActivationChannel']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAGeoNameActivationChannel3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['GeoNameIdentifier', 'Census_ActivationChannel']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDALocaleEnglishNameActivationChannel3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['LocaleEnglishNameIdentifier', 'Census_ActivationChannel']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAOsBuildLabActivationChannel3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['OsBuildLab', 'Census_ActivationChannel']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAOemModelActivationChannel3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Census_OEMModelIdentifier', 'Census_ActivationChannel']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAProcessorModelActivationChannel3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Census_ProcessorModelIdentifier', 'Census_ActivationChannel']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDACensusOSVerActivationChannel3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Census_OSVersion', 'Census_ActivationChannel']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDAFirmwareVerActivationChannel3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Census_FirmwareVersionIdentifier', 'Census_ActivationChannel']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)


class LDARegionActivationChannel3(DecompositionFeature):
    @property
    def n_components(self):
        return 3

    @property
    def columns(self):
        return ['Wdft_RegionIdentifier', 'Census_ActivationChannel']

    def preprocess(self, train_df, test_df):
        pass

    def transformer_factory(self):
        return LatentDirichletAllocation(n_components=self.n_components,
                                         n_jobs=-1,
                                         random_state=2019)

