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')
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]
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 ]
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')
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)
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()
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"] )
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 = []
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()
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)
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
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)
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()
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)
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
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]
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 }
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)
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()
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)
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 = {}
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)