示例#1
0
 def __init__(self, data_provider, output):
     self.output = output
     self.data_provider = data_provider
     self.ps_data_provider = PsDataProvider(data_provider)
     self.kpi_result_values = self.ps_data_provider.get_result_values()
     self.common_v2 = Common(self.data_provider)
     self.store_id = self.data_provider[Data.STORE_FK]
     self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
     self.assortment = Assortment(self.data_provider)
     self.own_manufacturer_fk = int(
         self.data_provider.own_manufacturer.param_value.values[0])
     self.kpi_static_data = self.common_v2.kpi_static_data[[
         'pk', StaticKpis.TYPE
     ]]
     # self.custom_entity = self.ps_data_provider.get_custom_entities(Consts.PRODUCT_GROUP)
     self.visit_date = self.data_provider[Data.VISIT_DATE]
     self.project_name = self.data_provider.project_name
     self.rds_conn = PSProjectConnector(self.project_name,
                                        DbUsers.CalculationEng)
     self.external_targets = self._retrieve_completeness_external_targets()
     self.products_trax_cat = self._get_products_with_trax_categories()
     self.ass_groups_present = {
         Consts.DISTR_SNACKS: 0,
         Consts.DISTR_SABRA: 0
     }
    def run_project_calculations(self):
        self.timer.start()
        eye_hand_lvl_template_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))),
                                                  'JNJDE', 'Data', 'eye_level_jnjde.xlsx')
        eye_hand_lvl_template = pd.read_excel(eye_hand_lvl_template_path)
        common = Common(self.data_provider)
        jnj_generator = JNJGenerator(self.data_provider, self.output, common)
        jnj_generator.linear_sos_out_of_store_discovery_report()

        # KPI 2 - Share of Shelf
        jnj_generator.sos_vs_target_calculation()
        # KPI 3 - OOS
        jnj_generator.calculate_auto_assortment()
        # KPI 4 - Share of shelf - Hand & Eye
        # KPI 12 - New H&E KPI
        # KPI 13 - Share of shelf - Hand & Eye (Sub-Category)
        jnj_generator.eye_hand_level_sos_calculation(eye_hand_lvl_template)
        jnj_generator.eye_hand_level_sos_calculation_de(eye_hand_lvl_template)
        # KPI 5 IR - Activation compliance vs plans
        jnj_generator.promo_calc(sales_reps_date='2018-09-30', calc_brand_level=True)
        # KPI 9 - MSL
        jnj_generator.assortment_calculation()
        # KPI 10 - New Display compliance
        jnj_generator.display_compliance_calculation()
        # Competitor KPI's
        jnj_generator.sos_brand_out_of_sub_category()
        jnj_generator.competitor_eye_hand_level_sos(eye_hand_lvl_template)
        common.commit_results_data()
        self.timer.stop('KPIGenerator.run_project_calculations')
示例#3
0
    def __init__(self, output, data_provider):
        super(PNGJP_SAND2Util, self).__init__(data_provider)
        self.output = output
        self.data_provider = data_provider
        self.project_name = data_provider.project_name
        self.session_uid = self.data_provider.session_uid

        self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
        self.all_products = self.data_provider[Data.ALL_PRODUCTS]
        self.match_product_in_scene = self.data_provider[Data.MATCHES]
        self.scene_info = self.data_provider[Data.SCENES_INFO]
        self.all_templates = self.data_provider[Data.ALL_TEMPLATES]
        self.match_product_in_scene['count'] = 1
        self.matches_product = self.match_product_in_scene.merge(
            self.scif,
            on=[ScifConsts.PRODUCT_FK, ScifConsts.SCENE_FK],
            how='left')
        self.rds_conn = PSProjectConnector(self.project_name,
                                           DbUsers.CalculationEng)
        self.match_display_in_scene = self.get_match_display_in_scene()
        self.visit_date = self.data_provider[Data.VISIT_DATE]
        self.common = Common(self.data_provider)
        self.kpi_static_data = self.common.get_kpi_static_data()
        self.external_targets = self.get_all_kpi_external_targets()
        self.all_targets_unpacked = self.unpack_all_external_targets()
        self.bay_shelf_info = self.get_bay_shelf_combination_from_custom_entity(
        )
        self.bay_shelf_entity_type_fk = self.get_bay_shelf_entity_type_fk()
        shelf_range_template_path = Path(
            __file__).parent / '../Data/shelf_range_template.xlsx'
        self.shelf_range_template = pd.read_excel(shelf_range_template_path)
        self.session_info = self.data_provider[Data.SESSION_INFO]
        self.store_fk = self.session_info['store_fk'].values[0]
示例#4
0
 def __init__(self, data_provider, output):
     self.output = output
     self.data_provider = data_provider
     self.common = Common(self.data_provider)
     self.project_name = self.data_provider.project_name
     self.session_uid = self.data_provider.session_uid
     self.products = self.data_provider[Data.PRODUCTS]
     self.all_products = self.data_provider[Data.ALL_PRODUCTS]
     self.match_product_in_scene = self.data_provider[Data.MATCHES]
     self.visit_date = self.data_provider[Data.VISIT_DATE]
     self.session_info = self.data_provider[Data.SESSION_INFO]
     self.scene_info = self.data_provider[Data.SCENES_INFO]
     self.store_id = self.data_provider[Data.STORE_FK]
     self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
     self.rds_conn = PSProjectConnector(self.project_name,
                                        DbUsers.CalculationEng)
     self.kpi_static_data = self.common.get_kpi_static_data()
     self.kpi_results_queries = []
     self.pepsico_fk = self.get_relevant_pk_by_name(Const.MANUFACTURER,
                                                    Const.PEPSICO)
     self.k_engine = BaseCalculationsGroup(data_provider, output)
     self.categories_to_calculate = self.get_relevant_categories_for_session(
     )
     self.toolbox = GENERALToolBox(data_provider)
     self.main_shelves = [
         scene_type
         for scene_type in self.scif[Const.TEMPLATE_NAME].unique().tolist()
         if Const.MAIN_SHELF in scene_type
     ]
示例#5
0
    def run_project_calculations(self):
        self.timer.start()
        data_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                                 'Data')
        survey_template_path = os.path.join(data_path, 'SurveyTemplate.xlsx')
        eye_hand_lvl_template_path = os.path.join(data_path,
                                                  'eye_level_jnjuk.xlsx')
        exclusive_template_path = os.path.join(data_path,
                                               'KPI Exclusions Template.xlsx')

        survey_template = pd.read_excel(survey_template_path,
                                        sheetname='Sheet1')
        eye_hand_lvl_template = pd.read_excel(eye_hand_lvl_template_path)
        exclusive_template = pd.read_excel(exclusive_template_path)
        common = Common(self.data_provider)
        jnj_generator = JNJGenerator(self.data_provider, self.output, common,
                                     exclusive_template)
        jnj_generator.linear_sos_out_of_store_discovery_report()
        jnj_generator.secondary_placement_location_quality(survey_template)
        jnj_generator.secondary_placement_location_visibility_quality(
            survey_template)
        jnj_generator.share_of_shelf_manufacturer_out_of_sub_category()
        jnj_generator.calculate_auto_assortment(in_balde=False)
        jnj_generator.promo_calc_recovery()
        jnj_generator.eye_hand_level_sos_calculation(eye_hand_lvl_template)
        jnj_generator.general_assortment_calculation()
        jnj_generator.osa_calculation()
        common.commit_results_data()
        jnj_generator.tool_box.commit_osa_queries()
        self.timer.stop('KPIGenerator.run_project_calculations')
示例#6
0
 def __init__(self, data_provider, output):
     self.output = output
     self.data_provider = data_provider
     self.project_name = self.data_provider.project_name
     self.session_uid = self.data_provider.session_uid
     self.products = self.data_provider[Data.PRODUCTS]
     self.all_products = self.data_provider[Data.ALL_PRODUCTS]
     self.match_product_in_scene = self.data_provider[Data.MATCHES]
     self.visit_date = self.data_provider[Data.VISIT_DATE]
     self.session_info = self.data_provider[Data.SESSION_INFO]
     self.scene_info = self.data_provider[Data.SCENES_INFO]
     self.store_id = self.data_provider[Data.STORE_FK]
     self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
     self.rds_conn = PSProjectConnector(self.project_name, DbUsers.CalculationEng)
     self.tools = RBUSGENERALToolBox(self.data_provider, self.output, rds_conn=self.rds_conn)
     self.old_common = common_old(data_provider)
     self.kpi_static_data = self.old_common.get_kpi_static_data()
     # self.kpi_results_queries = []
     self.templates_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'Data')
     self.template_dict = self.get_df_from_excel_path()
     self.template_dict = self.template_dict[self.template_dict['Template for KPI'] != 'none']\
                                             .set_index('Template for KPI')['KPI Level 3 Name'].to_dict()
     self.excluded_sub_categories = self.get_excluded_sub_categories(self.get_df_from_excel_path())
     self.common_new = Common(data_provider)
     self.manufacturer_fk = self.data_provider[Data.OWN_MANUFACTURER]['param_value'].iloc[0]
     self.ps_data = PsDataProvider(self.data_provider, self.output)
     self.templates = self.data_provider[Data.TEMPLATES]
     self.sub_brands = self.ps_data.get_custom_entities(1001)
示例#7
0
 def __init__(self, data_provider, output, common=None):
     self.output = output
     self.data_provider = data_provider
     # self.common = common
     self.common = Common(self.data_provider)
     self.project_name = self.data_provider.project_name
     self.session_uid = self.data_provider.session_uid
     self.products = self.data_provider[Data.PRODUCTS]
     self.templates = self.data_provider[Data.TEMPLATES]
     self.all_products = self.data_provider[Data.ALL_PRODUCTS]
     self.match_product_in_scene = self.data_provider[Data.MATCHES]
     self.visit_date = self.data_provider[Data.VISIT_DATE]
     self.session_info = self.data_provider[Data.SESSION_INFO]
     self.scene_info = self.data_provider[Data.SCENES_INFO]
     self.store_id = self.data_provider[Data.STORE_FK] if self.data_provider[Data.STORE_FK] is not None \
                                                         else self.session_info['store_fk'].values[0]
     self.all_templates = self.data_provider[Data.ALL_TEMPLATES]
     self.store_type = self.data_provider.store_type
     self.rds_conn = PSProjectConnector(self.project_name,
                                        DbUsers.CalculationEng)
     self.kpi_static_data = self.common.get_kpi_static_data()
     self.kpi_results_queries = []
     self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
     self.kpi_results = pd.DataFrame(
         columns=['kpi_fk', 'numerator', 'denominator', 'result', 'score'])
    def __init__(self, data_provider, output):
        self.output = output
        self.data_provider = data_provider
        self.common = Common(self.data_provider)
        self.project_name = self.data_provider.project_name
        self.session_uid = self.data_provider.session_uid
        self.products = self.data_provider[Data.PRODUCTS]
        self.all_products = self.data_provider[Data.ALL_PRODUCTS]
        self.match_product_in_scene = self.data_provider[Data.MATCHES]
        self.visit_date = self.data_provider[Data.VISIT_DATE]
        self.current_date = datetime.now()
        self.session_info = self.data_provider[Data.SESSION_INFO]
        self.scene_info = self.data_provider[Data.SCENES_INFO]
        self.store_info = self.data_provider[Data.STORE_INFO]
        self.store_id = self.data_provider[Data.STORE_FK]
        self.own_manufacturer_id = int(self.data_provider[Data.OWN_MANUFACTURER][self.data_provider[Data.OWN_MANUFACTURER]['param_name'] == 'manufacturer_id']['param_value'].tolist()[0])
        self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
        self.rds_conn = PSProjectConnector(self.project_name, DbUsers.CalculationEng)
        self.toolbox = GENERALToolBox(data_provider)
        self.assortment = Assortment(self.data_provider, self.output, common=self.common)
        self.kpi_static_data = self.common.get_kpi_static_data()
        self.kpi_results_queries = []

        self.template_path = self.get_template_path()
        self.template_data = self.get_template_data()
        self.sos_store_policies = self.get_sos_store_policies(self.visit_date.strftime('%Y-%m-%d'))
        self.result_values = self.get_result_values()

        self.scores = pd.DataFrame()
示例#9
0
 def __init__(self, data_provider, output):
     self.output = output
     self.data_provider = data_provider
     self.common = Common(self.data_provider)
     self.match_display_in_scene = self.data_provider.match_display_in_scene
     self.project_name = self.data_provider.project_name
     self.session_uid = self.data_provider.session_uid
     self.products = self.data_provider[Data.PRODUCTS]
     self.all_products = self.data_provider[Data.ALL_PRODUCTS]
     self.scene_info = self.data_provider[Data.SCENES_INFO]
     self.templates = self.data_provider[Data.TEMPLATES]
     self.match_product_in_scene = self.data_provider[Data.MATCHES]
     self.visit_date = self.data_provider[Data.VISIT_DATE]
     self.session_info = self.data_provider[Data.SESSION_INFO]
     self.scene_info = self.data_provider[Data.SCENES_INFO]
     self.store_id = self.data_provider[Data.STORE_FK]
     self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
     self.rds_conn = PSProjectConnector(self.project_name, DbUsers.CalculationEng)
     self.ps_data_provider = PsDataProvider(self.data_provider, self.output)
     self.kpi_static_data = self.common.get_kpi_static_data()
     self.kpi_results_queries = []
     self.templates_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'Data')
     self.excel_file_path = os.path.join(self.templates_path, 'Template.xlsx')
     self.external_targets = self.ps_data_provider.get_kpi_external_targets(
         kpi_operation_types=["Target Config"],
         key_fields=["product_fks", "template_fks", "product_group_fk"],
         data_fields=["stacking_exclude", "min_product_facing", "best_shelf_position", "group_facings_count"]
         )
示例#10
0
 def __init__(self, data_provider, output):
     self.output = output
     self.common = Common(data_provider)
     self.data_provider = data_provider
     self.project_name = self.data_provider.project_name
     self.session_uid = self.data_provider.session_uid
     self.manufacturer_fk = None if self.data_provider[Data.OWN_MANUFACTURER]['param_value'].iloc[0] is None else \
         int(self.data_provider[Data.OWN_MANUFACTURER]['param_value'].iloc[0])
     self.products = self.data_provider[Data.PRODUCTS]
     self.all_products = self.data_provider[Data.ALL_PRODUCTS]
     self.match_product_in_scene = self.data_provider[Data.MATCHES]
     self.visit_date = self.data_provider[Data.VISIT_DATE]
     self.session_info = self.data_provider[Data.SESSION_INFO]
     self.scene_info = self.data_provider[Data.SCENES_INFO].merge(
         self.data_provider[Data.ALL_TEMPLATES][[
             'template_fk', 'template_name'
         ]],
         on='template_fk',
         how='left')
     self.store_id = self.data_provider[Data.STORE_FK]
     self.store_info = self.data_provider[Data.STORE_INFO]
     self.store_type = self.store_info['store_type'].iloc[0]
     self.segmentation = self.store_info['additional_attribute_2'].iloc[0]
     self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
     self.rds_conn = PSProjectConnector(self.project_name,
                                        DbUsers.CalculationEng)
     self.tools = CCMYGENERALToolBox(self.data_provider,
                                     self.output,
                                     rds_conn=self.rds_conn)
     self.kpi_static_data = self.get_kpi_static_data()
     self.kpi_static_data_new = self.common.get_new_kpi_static_data()
     self.template_data = pd.read_excel(TEMPLATE_PATH, 'KPIs').fillna('')
     self.kpi_results_queries = []
示例#11
0
 def __init__(self, data_provider, output=None):
     self.data_provider = data_provider
     self.output = output
     self.project_name = data_provider.project_name
     self.session_uid = self.data_provider.session_uid
     self.common = Common(data_provider)
     self.scene_tool_box = CCUS_SANDSceneToolBox(self.data_provider, self.output, self.common)
class Generator:
    def __init__(self, data_provider, output):
        self.data_provider = data_provider
        self.output = output

        self.project_name = data_provider.project_name
        self.session_uid = self.data_provider.session_uid
        self.common = Common(data_provider)
        self.tool_box = MONDELEZUSToolBox(self.data_provider, self.output,
                                          self.common)
        self.cstore_tool_box = CSTOREToolBox(self.data_provider, self.output,
                                             self.common)
        self.sos_tool_box = MONDELEZUSSOSToolBox(self.data_provider,
                                                 self.output, self.common)

    @log_runtime('Total Calculations', log_start=True)
    def main_function(self):
        """
        This is the main KPI calculation function.
        It calculates the score for every KPI set and saves it to the DB.
        """
        if self.tool_box.scif.empty:
            Log.warning('Scene item facts is empty for this session')
        self.cstore_tool_box.main_calculation()
        self.sos_tool_box.main_calculation()
        for kpi_set_fk in self.tool_box.kpi_new_static_data['pk'].unique(
        ).tolist():
            self.tool_box.main_calculation(kpi_set_fk=kpi_set_fk)
        self.common.commit_results_data()
示例#13
0
 def __init__(self, data_provider, output):
     self.output = output
     self.data_provider = data_provider
     self.common = Common(self.data_provider)
     self.project_name = self.data_provider.project_name
     self.session_uid = self.data_provider.session_uid
     self.products = self.data_provider[Data.PRODUCTS]
     self.all_products = self.data_provider[Data.ALL_PRODUCTS]
     self.match_product_in_scene = self.data_provider[Data.MATCHES]
     self.visit_date = self.data_provider[Data.VISIT_DATE]
     self.session_info = self.data_provider[Data.SESSION_INFO]
     self.scene_info = self.data_provider[Data.SCENES_INFO]
     self.store_id = self.data_provider[Data.STORE_FK]
     self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
     self.rds_conn = PSProjectConnector(self.project_name,
                                        DbUsers.CalculationEng)
     self.kpi_static_data = self.common.get_kpi_static_data()
     self.kpi_results_queries = []
     self.manufacturer_fk = self.products['manufacturer_fk'][
         self.products['manufacturer_name'] ==
         'MONDELEZ INTERNATIONAL INC'].iloc[0]
     self.store_assortment = pd.DataFrame()
     self.assortment = Assortment(self.data_provider, common=self.common)
     self.store_number = self.get_store_number()
     self.ps_data_provider = PsDataProvider(self.data_provider, self.output)
     self.custom_entities = self.ps_data_provider.get_custom_entities(
         Const.PPG_ENTITY_TYPE_FK)
示例#14
0
 def __init__(self, data_provider, output):
     self.data_provider = data_provider
     self.output = output
     self.common = Common(self.data_provider)
     self.project_name = data_provider.project_name
     self.session_uid = self.data_provider.session_uid
     self.tool_box = ToolBox(self.data_provider, self.output, self.common)
class SceneGenerator:

    def __init__(self, data_provider, output=None):
        self.data_provider = data_provider
        self.output = output
        self.project_name = data_provider.project_name
        self.session_uid = self.data_provider.session_uid
        self.common = Common(data_provider)
        self.scene_tool_box = CCUSSceneToolBox(self.data_provider, self.output, self.common)
        self.pillar_scene_tool_box = PillarsSceneToolBox(self.data_provider, self.output, self.common)

    @log_runtime('Total Calculations', log_start=True)
    def scene_score(self):
        """
        This is the main KPI calculation function.
        It calculates the score for every KPI set and saves it to the DB.
        """
        if self.scene_tool_box.match_product_in_scene.empty:
            Log.warning('Match product in scene is empty for this scene')
        else:
            self.scene_tool_box.scene_score()
            self.pillar_scene_tool_box.is_scene_belong_to_program()
            self.common.commit_results_data(result_entity='scene')
        del self.scene_tool_box
        del self.pillar_scene_tool_box
示例#16
0
 def __init__(self, data_provider, output):
     self.output = output
     self.data_provider = data_provider
     self.common = Common(self.data_provider)
     self.project_name = self.data_provider.project_name
     self.session_uid = self.data_provider.session_uid
     self.products = self.data_provider[Data.PRODUCTS]
     self.all_products = self.data_provider[Data.ALL_PRODUCTS]
     self.match_product_in_scene = self.data_provider[Data.MATCHES]
     self.visit_date = self.data_provider[Data.VISIT_DATE]
     self.session_info = self.data_provider[Data.SESSION_INFO]
     self.scene_info = self.data_provider[Data.SCENES_INFO]
     self.store_info = self.data_provider[Data.STORE_INFO]
     self.store_id = self.data_provider[Data.STORE_FK]
     self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
     self.rds_conn = PSProjectConnector(self.project_name,
                                        DbUsers.CalculationEng)
     self.match_probe_in_scene = self.get_product_special_attribute_data(
         self.session_uid)
     self.kpi_static_data = self.common.get_kpi_static_data()
     self.kpi_results_queries = []
     self.kpis_sheet = pd.read_excel(PATH, Const.KPIS).fillna("")
     self.osd_rules_sheet = pd.read_excel(PATH, Const.OSD_RULES).fillna("")
     self.kpi_excluding = pd.DataFrame()
     self.df = pd.DataFrame()
     self.tools = GENERALToolBox(self.data_provider)
     self.templates = self.data_provider[Data.ALL_TEMPLATES]
     self.psdataprovider = PsDataProvider(self.data_provider)
示例#17
0
 def __init__(self, data_provider, output):
     self.output = output
     self.data_provider = data_provider
     self.project_name = self.data_provider.project_name
     self.session_uid = self.data_provider.session_uid
     self.session_id = self.data_provider.session_id
     self.products = self.data_provider[Data.PRODUCTS]
     self.all_products = self.data_provider[Data.ALL_PRODUCTS]
     self.match_product_in_scene = self.data_provider[Data.MATCHES]
     self.visit_date = self.data_provider[Data.VISIT_DATE]
     self.session_info = self.data_provider[Data.SESSION_INFO]
     self.scene_info = self.data_provider[Data.SCENES_INFO]
     self.store_id = self.data_provider[Data.STORE_FK]
     self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
     self.rds_conn = PSProjectConnector(self.project_name,
                                        DbUsers.CalculationEng)
     # self.tools = RISPARKWINEDEGENERALToolBox(
     #     self.data_provider, self.output, rds_conn=self.rds_conn)
     # self.New_kpi_static_data = self.get_new_kpi_static_data()
     self.kpi_results_new_tables_queries = []
     # self.store_assortment = PSAssortmentDataProvider(self.data_provider).execute()
     self.store_info = self.data_provider[Data.STORE_INFO]
     self.current_date = datetime.now()
     self.assortment = Assortment(self.data_provider, self.output)
     self.store_assortment = self.assortment.store_assortment
     self.common = Common(self.data_provider)
    def run_project_calculations(self):
        self.timer.start()

        eye_level_data, exclusion_data = self._parse_templates_for_calculations()
        common = Common(self.data_provider)

        try:

            jnj_generator = JNJGenerator(self.data_provider, self.output, common, exclusion_data)
            self.calculate_local_assortment(jnj_generator, self.data_provider, self.output, common, exclusion_data)

            # Mobile KPIs with hierarchy
            jnj_generator.calculate_auto_assortment(in_balde=False, hierarchy=True,
                                                    just_primary=False, filter_sub_categories=False)
            jnj_generator.eye_hand_level_sos_calculation(eye_level_data, hierarchy=True)
            jnj_generator.promo_calc(hierarchy=True)
            jnj_generator.lsos_with_hierarchy()

            # API global KPIs
            jnj_generator.linear_sos_out_of_store_discovery_report()
            jnj_generator.calculate_auto_assortment(in_balde=False)
            jnj_generator.promo_calc()
            jnj_generator.eye_hand_level_sos_calculation(eye_level_data)

        except Exception as e:
            print ("Error :{}".format(e))

        common.commit_results_data()
        self.timer.stop('KPIGenerator.run_project_calculations')
class INBEVNLINBEVBEGenerator:
    def __init__(self, data_provider, output):
        self.k_engine = BaseCalculationsGroup(data_provider, output)
        self.data_provider = data_provider
        self.project_name = data_provider.project_name
        self.output = output
        self.session_uid = self.data_provider.session_uid
        self.visit_date = self.data_provider[Data.VISIT_DATE]
        self.rds_conn = PSProjectConnector(self.project_name, DbUsers.CalculationEng)
        self.session_info = SessionInfo(data_provider)
        self.store_id = self.data_provider[Data.STORE_FK]
        self.common = Common(self.data_provider)
        self.tool_box = INBEVToolBox(self.data_provider, self.output, common=self.common)

    @log_runtime('Total Calculations', log_start=True)
    def main_function(self):
        """
        This is the main KPI calculation function.
        It calculates the score for every KPI set and saves it to the DB.
        """
        if self.tool_box.scif.empty:
            Log.warning('Scene item facts is empty for this session')
            return
        # self.tool_box.tools.update_templates()
        # set_names = ['Product Blocking', 'Linear Share of Shelf', 'OSA', 'Pallet Presence', 'Share of Assortment',
        #              'Product Stacking', 'Shelf Level', 'Linear Share of Shelf vs. Target', 'Shelf Impact Score',
        #              'Product Group Blocking']
        # for kpi_set_name in set_names:
        #     self.tool_box.main_calculation(set_name=kpi_set_name)
        # self.tool_box.save_custom_scene_item_facts_results()
        # self.tool_box.save_linear_length_results()
        # Log.info('Downloading templates took {}'.format(self.tool_box.download_time))
        self.tool_box.main_calculation_poce()
        self.tool_box.commit_results_data()
        self.common.commit_results_data()
示例#20
0
    def __init__(self, data_provider, output):
        self.output = output
        self.data_provider = data_provider
        self.common = Common(self.data_provider)
        self.project_name = self.data_provider.project_name
        self.session_uid = self.data_provider.session_uid
        self.products = self.data_provider[Data.PRODUCTS]
        self.all_products = self.data_provider[Data.ALL_PRODUCTS]
        self.match_product_in_scene = self.data_provider[Data.MATCHES]
        self.visit_date = self.data_provider[Data.VISIT_DATE]
        self.session_info = self.data_provider[Data.SESSION_INFO]
        self.scene_info = self.data_provider[Data.SCENES_INFO]
        self.store_id = self.data_provider[Data.STORE_FK]
        self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
        self.rds_conn = PSProjectConnector(self.project_name,
                                           DbUsers.CalculationEng)
        self.kpi_static_data = self.common.get_kpi_static_data()
        self.kpi_results_queries = []
        self.set_up_template = pd.read_excel(os.path.join(
            os.path.dirname(os.path.realpath(__file__)), '..', 'Data',
            'gsk_set_up.xlsx'),
                                             sheet_name='Functional KPIs',
                                             keep_default_na=False)

        self.gsk_generator = GSKGenerator(self.data_provider, self.output,
                                          self.common, self.set_up_template)
示例#21
0
 def __init__(self, data_provider, output):
     self.output = output
     self.data_provider = data_provider
     self.common = Common(self.data_provider)
     self.templates_path = os.path.join(
         os.path.dirname(os.path.realpath(__file__)), '..', 'Data')
     self.excel_file_path = os.path.join(self.templates_path,
                                         'Template.xlsx')
     self.project_name = self.data_provider.project_name
     self.session_uid = self.data_provider.session_uid
     self.products = self.data_provider[Data.PRODUCTS]
     self.templates = self.data_provider[Data.TEMPLATES]
     self.all_products = self.data_provider[Data.ALL_PRODUCTS]
     self.match_product_in_scene = self.data_provider[Data.MATCHES]
     self.visit_date = self.data_provider[Data.VISIT_DATE]
     self.session_info = self.data_provider[Data.SESSION_INFO]
     self.scene_info = self.data_provider[Data.SCENES_INFO]
     self.store_id = self.data_provider[Data.STORE_FK]
     self.store_info = self.data_provider[Data.STORE_INFO]
     self.store_name = self.store_info.store_name[0]
     self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
     self.rds_conn = PSProjectConnector(self.project_name,
                                        DbUsers.CalculationEng)
     self.kpi_static_data = self.common.get_kpi_static_data()
     self.kpi_results_queries = []
     self.empty_product_ids = self.all_products.query(
         'product_name.str.contains("empty", case=False) or'
         ' product_name.str.contains("irrelevant", case=False)',
         engine='python')['product_fk'].values
示例#22
0
 def __init__(self, data_provider, output):
     self.output = output
     self.data_provider = data_provider
     self.project_name = self.data_provider.project_name
     self.common = Common(self.data_provider)
     self.old_common = oldCommon(self.data_provider)
     self.rds_conn = PSProjectConnector(self.project_name,
                                        DbUsers.CalculationEng)
     self.session_fk = self.data_provider.session_id
     self.match_product_in_scene = self.data_provider[Data.MATCHES]
     self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
     self.store_info = self.data_provider[Data.STORE_INFO]
     self.store_id = self.data_provider[Data.STORE_FK]
     self.survey = Survey(self.data_provider)
     self.block = Block(self.data_provider)
     self.general_toolbox = GENERALToolBox(self.data_provider)
     self.visit_date = self.data_provider[Data.VISIT_DATE]
     self.template_path = self.get_relevant_template()
     self.gap_data = self.get_gap_data()
     self.kpi_weights = parse_template(self.template_path,
                                       Consts.KPI_WEIGHT,
                                       lower_headers_row_index=0)
     self.template_data = self.parse_template_data()
     self.kpis_gaps = list()
     self.passed_availability = list()
     self.kpi_static_data = self.old_common.get_kpi_static_data()
     self.own_manufacturer_fk = int(
         self.data_provider.own_manufacturer.param_value.values[0])
     self.parser = Parser
     self.all_products = self.data_provider[Data.ALL_PRODUCTS]
示例#23
0
    def __init__(self, data_provider, output):
        self.output = output
        self.data_provider = data_provider
        self.common = Common(self.data_provider)
        self.project_name = self.data_provider.project_name
        self.session_uid = self.data_provider.session_uid
        self.products = self.data_provider[Data.PRODUCTS]
        self.all_products = self.data_provider[Data.ALL_PRODUCTS]
        self.match_product_in_scene = self.data_provider[Data.MATCHES]
        self.visit_date = self.data_provider[Data.VISIT_DATE]
        self.session_info = self.data_provider[Data.SESSION_INFO]
        self.scene_info = self.data_provider[Data.SCENES_INFO]
        self.store_id = self.data_provider[Data.STORE_FK]
        self.store_info = self.data_provider[Data.STORE_INFO]
        self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
        self.ps_data_provider = PsDataProvider(self.data_provider, self.output)
        self.manufacturer_fk = None if self.data_provider[Data.OWN_MANUFACTURER]['param_value'].iloc[0] is None else \
            int(self.data_provider[Data.OWN_MANUFACTURER]['param_value'].iloc[0])
        self.set_up_template = pd.read_excel(os.path.join(
            os.path.dirname(os.path.realpath(__file__)), '..', 'Data',
            'gsk_set_up.xlsx'),
                                             sheet_name='Functional KPIs',
                                             keep_default_na=False)

        self.gsk_generator = GSKGenerator(self.data_provider, self.output,
                                          self.common, self.set_up_template)
        self.targets = self.ps_data_provider.get_kpi_external_targets()
        self.sequence = Sequence(self.data_provider)
        self.set_up_data = {
            ('planogram', Const.KPI_TYPE_COLUMN): Const.NO_INFO,
            ('secondary_display', Const.KPI_TYPE_COLUMN): Const.NO_INFO,
            ('promo', Const.KPI_TYPE_COLUMN): Const.NO_INFO
        }
示例#24
0
class Generator:
    # SUPER_CATS = ['Yogurt', 'RBG', 'Mexican', 'Soup']
    SUPER_CATS = ['Yogurt', 'RBG', 'Soup', 'Mexican']
    # SUPER_CATS = ['Mexican'] # Overwriting for testing purposes
    SUPER_CATS = ['Snacks', 'Yogurt']

    def __init__(self, data_provider, output):
        self.data_provider = data_provider
        self.output = output
        self.common = Common(self.data_provider)
        self.project_name = data_provider.project_name
        self.session_uid = self.data_provider.session_uid
        self.toolboxes = {}
        self.load_toolboxes()

    @log_runtime('Total Calculations', log_start=True)
    def main_function(self):
        for cat in self.SUPER_CATS:
            if self.toolboxes[cat].scif.empty:
                Log.warning('Distribution is empty for this session')
                continue
            template_path = self.find_template(cat)
            # ResultUploader(self.project_name, template_path)
            # EntityUploader(self.project_name, template_path)
            # AtomicFarse(self.project_name, template_path)
            self.toolboxes[cat].main_calculation(template_path)
        self.common.commit_results_data()

    def load_toolboxes(self):
        ToolBox = 'imma lazy and no like red lines'
        for cat in self.SUPER_CATS:
            exec('from Projects.GMIUS.{0}.Utils.KPIToolBox import ToolBox'.
                 format(cat))
            self.toolboxes[cat] = ToolBox(self.data_provider, self.output,
                                          self.common)

    def find_template(self, cat):
        ''' screw maintaining 4 hardcoded template paths... '''
        path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                            'Data')
        files = os.listdir(path)
        candidates = [
            f for f in files
            if f.split(' ')[0] == cat and f.split('.')[-1] == 'xlsx'
        ]
        versioned_candidates = []
        all_vers = []
        for x in candidates:
            all_vers += x.split(' v')[-1].replace('.xlsx', '').split('.')
        max_digits = len(max(all_vers, key=len))
        for x in candidates:
            version_comps = x.split(' v')[-1].replace('.xlsx', '').split('.')
            normed_components = []
            for i, comp in enumerate(version_comps):
                norm_comp = int(comp) * 10**max_digits
                normed_components.append(str(norm_comp))
            versioned_candidates.append((float(''.join(normed_components)), x))
        template = sorted(versioned_candidates, key=lambda x: x[0])[-1][1]
        return os.path.join(path, template)
示例#25
0
 def __init__(self, data_provider, output):
     self.data_provider = data_provider
     self.output = output
     self.common = Common(self.data_provider)
     self.project_name = data_provider.project_name
     self.session_uid = self.data_provider.session_uid
     self.toolboxes = {}
     self.load_toolboxes()
示例#26
0
    def __init__(self, data_provider, rds_conn=None):
        self.data_provider = data_provider
        self.common = Common(self.data_provider)
        self.project_name = self.data_provider.project_name
        self.session_uid = self.data_provider.session_uid
        self.products = self.data_provider[Data.PRODUCTS]
        self.all_products = self.data_provider[Data.ALL_PRODUCTS]
        self.match_product_in_scene = self.data_provider[
            Data.MATCHES]  # initial matches
        self.visit_date = self.data_provider[Data.VISIT_DATE]
        self.session_info = self.data_provider[Data.SESSION_INFO]
        self.scene_info = self.data_provider[Data.SCENES_INFO]
        self.store_id = self.data_provider[Data.STORE_FK]
        self.all_templates = self.data_provider[Data.ALL_TEMPLATES]
        self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]  # initial scif
        self.rds_conn = PSProjectConnector(
            self.project_name,
            DbUsers.CalculationEng) if rds_conn is None else rds_conn
        self.complete_scif_data()
        self.store_areas = self.get_store_areas()
        self.kpi_static_data = self.common.get_kpi_static_data()
        self.kpi_results_queries = []

        self.full_store_info = self.get_store_data_by_store_id()
        self.store_info_dict = self.full_store_info.to_dict('records')[0]
        self.store_policy_exclusion_template = self.get_store_policy_data_for_exclusion_template(
        )
        self.displays_template = self.get_display_parameters()

        self.toolbox = GENERALToolBox(data_provider)
        self.custom_entities = self.get_custom_entity_data()
        self.on_display_products = self.get_on_display_products()
        self.exclusion_template = self.get_exclusion_template_data()
        self.filtered_scif = self.scif  # filtered scif acording to exclusion template
        self.filtered_matches = self.match_product_in_scene  # filtered scif according to exclusion template
        self.set_filtered_scif_and_matches_for_all_kpis(
            self.scif, self.match_product_in_scene)

        self.scene_bay_shelf_product = self.get_facings_scene_bay_shelf_product(
        )
        self.external_targets = self.get_all_kpi_external_targets()
        self.all_targets_unpacked = self.unpack_all_external_targets()
        self.kpi_result_values = self.get_kpi_result_values_df()
        self.kpi_score_values = self.get_kpi_score_values_df()

        # self.displays_template = self.get_display_parameters()
        self.full_pallet_len = self.displays_template[self.displays_template[self.DISPLAY_NAME_TEMPL] == \
                                                      'HO Agreed Full Pallet'][self.SHELF_LEN_DISPL].values[0]
        self.half_pallet_len = self.displays_template[self.displays_template[self.DISPLAY_NAME_TEMPL] == \
                                                      'HO Agreed Half Pallet'][self.SHELF_LEN_DISPL].values[0]
        self.shelf_len_mixed_shelves = self.calculate_shelf_len_for_mixed_shelves(
        )
        self.scene_display = self.get_match_display_in_scene()
        self.assign_bays_to_bins()
        self.filtered_scif_secondary = self.get_initial_secondary_scif()
        self.filtered_matches_secondary = self.get_initial_secondary_matches()
        self.set_filtered_scif_and_matches_for_all_kpis_secondary(
            self.filtered_scif_secondary, self.filtered_matches_secondary)
示例#27
0
    def __init__(self, data_provider, output, common=None):
        self.output = output
        self.data_provider = data_provider
        # self.common = common
        self.common = Common(self.data_provider)
        self.project_name = self.data_provider.project_name
        self.session_uid = self.data_provider.session_uid
        self.products = self.data_provider[Data.PRODUCTS]
        self.templates = self.data_provider[Data.TEMPLATES]
        self.all_products = self.data_provider[Data.ALL_PRODUCTS]
        self.match_product_in_scene = self.data_provider[Data.MATCHES]
        self.visit_date = self.data_provider[Data.VISIT_DATE]
        self.session_info = self.data_provider[Data.SESSION_INFO]
        self.scene_info = self.data_provider[Data.SCENES_INFO]
        self.store_id = self.data_provider[Data.STORE_FK] if self.data_provider[Data.STORE_FK] is not None \
                                                            else self.session_info['store_fk'].values[0]
        self.all_templates = self.data_provider[Data.ALL_TEMPLATES]
        self.store_type = self.data_provider.store_type
        self.rds_conn = PSProjectConnector(self.project_name,
                                           DbUsers.CalculationEng)
        self.kpi_static_data = self.common.get_kpi_static_data()
        self.kpi_results_queries = []
        self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]

        self.probe_groups = self.get_probe_group()
        self.match_product_in_scene = self.match_product_in_scene.merge(
            self.probe_groups, on='probe_match_fk', how='left')
        self.is_solid_scene = True if len(self.probe_groups['probe_group_id'].
                                          unique().tolist()) <= 1 else False
        self.toolbox = GENERALToolBox(self.data_provider)
        self.commontools = PEPSICOUKCommonToolBox(self.data_provider,
                                                  self.rds_conn)

        self.custom_entities = self.commontools.custom_entities
        self.on_display_products = self.commontools.on_display_products
        self.exclusion_template = self.commontools.exclusion_template
        self.filtered_scif = self.commontools.filtered_scif
        self.filtered_matches = self.commontools.filtered_matches
        self.excluded_matches = self.compare_matches()
        self.filtered_matches = self.filtered_matches.merge(
            self.probe_groups, on='probe_match_fk', how='left')

        self.scene_bay_shelf_product = self.commontools.scene_bay_shelf_product
        self.external_targets = self.commontools.external_targets
        self.own_manuf_fk = self.all_products[
            self.all_products['manufacturer_name'] ==
            self.PEPSICO]['manufacturer_fk'].values[0]
        self.block = Block(self.data_provider,
                           custom_scif=self.filtered_scif,
                           custom_matches=self.filtered_matches)
        self.adjacency = Adjancency(self.data_provider,
                                    custom_scif=self.filtered_scif,
                                    custom_matches=self.filtered_matches)
        self.block_results = pd.DataFrame(columns=['Group Name', 'Score'])
        self.kpi_results = pd.DataFrame(
            columns=['kpi_fk', 'numerator', 'denominator', 'result', 'score'])
        self.passed_blocks = {}
示例#28
0
    def __init__(self, output, data_provider):
        super(PepsicoUtil, self).__init__(data_provider)
        self.output = output
        self.common = Common(self.data_provider)
        # self.common_v1 = CommonV1(self.data_provider)
        self.project_name = self.data_provider.project_name
        self.session_uid = self.data_provider.session_uid
        self.products = self.data_provider[Data.PRODUCTS]
        self.all_products = self.data_provider[Data.ALL_PRODUCTS]
        self.match_product_in_scene = self.data_provider[Data.MATCHES]
        self.visit_date = self.data_provider[Data.VISIT_DATE]
        self.session_info = self.data_provider[Data.SESSION_INFO]
        self.scene_info = self.data_provider[Data.SCENES_INFO]
        self.store_id = self.data_provider[Data.STORE_FK] if self.data_provider[Data.STORE_FK] is not None \
                                                            else self.session_info['store_fk'].values[0]
        self.scif = self.data_provider[Data.SCENE_ITEM_FACTS]
        self.rds_conn = PSProjectConnector(self.project_name, DbUsers.CalculationEng)
        self.display_scene = self.get_match_display_in_scene()
        self.kpi_static_data = self.common.get_kpi_static_data()
        self.kpi_results_queries = []

        self.probe_groups = self.get_probe_group()
        self.match_product_in_scene = self.match_product_in_scene.merge(self.probe_groups, on='probe_match_fk',
                                                                        how='left')

        self.toolbox = GENERALToolBox(self.data_provider)
        self.commontools = PEPSICOUKCommonToolBox(self.data_provider, self.rds_conn)

        self.all_templates = self.commontools.all_templates
        self.custom_entities = self.commontools.custom_entities
        self.on_display_products = self.commontools.on_display_products
        self.exclusion_template = self.commontools.exclusion_template
        self.filtered_scif = self.commontools.filtered_scif.copy()
        self.filtered_matches = self.commontools.filtered_matches.copy()
        self.filtered_matches = self.filtered_matches.merge(self.probe_groups, on='probe_match_fk', how='left')

        self.filtered_scif_secondary = self.commontools.filtered_scif_secondary.copy()
        self.filtered_matches_secondary = self.commontools.filtered_matches_secondary.copy()

        self.scene_bay_shelf_product = self.commontools.scene_bay_shelf_product
        self.ps_data = PsDataProvider(self.data_provider, self.output)
        self.full_store_info = self.commontools.full_store_info.copy()
        self.external_targets = self.commontools.external_targets
        self.assortment = Assortment(self.commontools.data_provider, self.output)
        self.lvl3_ass_result = self.get_lvl3_relevant_assortment_result()
        self.own_manuf_fk = self.all_products[self.all_products['manufacturer_name'] == self.PEPSICO]['manufacturer_fk'].values[0]

        self.scene_kpi_results = self.get_results_of_scene_level_kpis()
        self.kpi_results_check = pd.DataFrame(columns=['kpi_fk', 'numerator', 'denominator', 'result', 'score',
                                                       'context'])
        self.sos_vs_target_targets = self.construct_sos_vs_target_base_df()

        self.all_targets_unpacked = self.commontools.all_targets_unpacked.copy()
        self.block_results = pd.DataFrame(columns=['Group Name', 'Score'])
        self.hero_type_custom_entity_df = self.get_hero_type_custom_entity_df()
 def __init__(self, data_provider, rds_conn, targets_from_template):
     self.data_provider = data_provider
     self.common = Common(self.data_provider)
     self.rds_conn = rds_conn
     self.visit_date = self.data_provider[Data.VISIT_DATE]
     self.all_products = data_provider['all_products']
     self.targets_from_template = targets_from_template
     self.ext_targets = self.get_all_kpi_external_targets()
     self.ext_targets = self.post_process_ext_targets(self.ext_targets)
     self.session_uid = self.data_provider.session_uid
     self.is_old_visit = self.check_if_the_current_session_has_json()
 def __init__(self, data_provider, output):
     self.k_engine = BaseCalculationsGroup(data_provider, output)
     self.data_provider = data_provider
     self.project_name = data_provider.project_name
     self.output = output
     self.session_uid = self.data_provider.session_uid
     self.visit_date = self.data_provider[Data.VISIT_DATE]
     self.rds_conn = PSProjectConnector(self.project_name, DbUsers.CalculationEng)
     self.session_info = SessionInfo(data_provider)
     self.store_id = self.data_provider[Data.STORE_FK]
     self.common = Common(self.data_provider)
     self.tool_box = INBEVToolBox(self.data_provider, self.output, common=self.common)