liyuyi@c-top.com.cn 4 лет назад
Родитель
Сommit
dfd39ffcf6
6 измененных файлов с 28 добавлено и 26 удалено
  1. 16 14
      BayesCombine.py
  2. 4 4
      ai_target_combine_handler.py
  3. 3 4
      config/config.yaml
  4. 1 1
      config/url.py
  5. 0 1
      readme.txt
  6. 4 2
      time_task/time_task_create_ad_by_target.py

+ 16 - 14
BayesCombine.py

@@ -62,10 +62,10 @@ class BayesFeatures(object):
                   sum(activation) activation
            from %s
            where signature = '%s' 
-           -- and datediff(now(),stat_date)<=30
+           and datediff(now(),stat_date)<=30
            group by signature,  %s
            ''' % (self.file_name, self.table, self.signature, self.file_name)
-        df = pd.read_sql(sql, engine)
+        df = pd.read_sql(sql, product_engine)
 
         if self.target_type == 'action_ratio':
             # 计算行为率(bclick/aclick)的组合特征值
@@ -83,7 +83,7 @@ class BayesFeatures(object):
                             get_city_sql = """
                             select city_name from ctop_kuaishou_city_level where city_level = '%s'
                             """ % city_level
-                            city_df = pd.read_sql(get_city_sql, engine)
+                            city_df = pd.read_sql(get_city_sql, product_engine)
                             city_lst.extend(city_df['city_name'].values)
                         pos_pct = df[df[self.file_name].isin(city_lst)].bclick.sum() / df.bclick.sum()
                         neg_pct = df[df[self.file_name].isin(city_lst)].unbclick.sum() / df.unbclick.sum()
@@ -107,7 +107,7 @@ class BayesFeatures(object):
                             get_city_sql = """
                             select city_name from ctop_kuaishou_city_level where city_level = '%s'
                             """ % city_level
-                            city_df = pd.read_sql(get_city_sql, engine)
+                            city_df = pd.read_sql(get_city_sql, product_engine)
                             city_lst.extend(city_df['city_name'].values)
                         pos_pct = df[df[self.file_name].isin(city_lst)].activation.sum() / df.activation.sum()
                         neg_pct = df[df[self.file_name].isin(city_lst)].unactivation.sum() / df.unactivation.sum()
@@ -140,9 +140,9 @@ class BayesCombine(object):
         get_sample_and_pct_sql = """
         select sum(aclick) aclick, sum(bclick) bclick, sum(activation) activation  from %s  where
          signature = '%s' 
-        -- and datediff(now(),stat_date)<=30
-        """ % (config['bayesDim']['age']['table'],self.signature)
-        sample_pct_df = pd.read_sql(get_sample_and_pct_sql, engine)
+        and datediff(now(),stat_date)<=30
+        """ % (config['bayesDim']['age']['table'], self.signature)
+        sample_pct_df = pd.read_sql(get_sample_and_pct_sql, product_engine)
         if self.target_type == 'action_ratio':
             self.sig_pos_pct = sample_pct_df['bclick'].sum() / sample_pct_df['aclick'].sum()
             self.sig_neg_pct = 1 - self.sig_pos_pct
@@ -176,7 +176,7 @@ class BayesCombine(object):
             # 获取该项目下在投的账号
             get_acc_sql = """select account_id from ctop_user_allocation where project_id = %s and account_status=0 limit 1""" % \
                           self.project_id
-            account_df = pd.read_sql(get_acc_sql, engine)
+            account_df = pd.read_sql(get_acc_sql, product_engine)
             account_id = account_df['account_id'].values[0]
             request_data = {'region': city_code_transform(out_dict.get('city')),
                             'ages_range': age_code_transform(out_dict.get('age')),
@@ -213,13 +213,14 @@ if __name__ == '__main__':
         else:
             engine = get_db_engine(config['productDB'])
 
+        product_engine = get_db_engine(config['productDB'])
+
         # 2、 参与定向组合的维度
         target_dim = [key for key in config['bayesDim'].keys() if config['bayesDim'][key]['isOn']]
 
         # 4、计算贝叶斯组合入库
         for project_id in config['projectId']:
             # 4.1 获取指定项目下当前活跃的素材信息, 如近3天内累计激活个数达到50个(开发环境或者生产环境,这部分都读取生产数据库)
-            product_engine = get_db_engine(config['productDB'])
             sql = '''
                select signature from ctop_kuaishou_report_daily_material 
                where account_id in (select account_id from ctop_user_allocation where project_id = %s)
@@ -233,19 +234,20 @@ if __name__ == '__main__':
             active_signatures = df[~df.signature.isnull()].signature.values
 
             # 4.2 在素材人群报表筛选里面近一个月累计100个激活
-            # TODO 等生产的素材人群表存在之后,修改表名,添加 days
             sql = """
-            select signature from ctop_kuaishou_audience_daily_report_by_signature_age  
+            select signature from ctop_kuaishou_audience_report_daily_age_material  
             where signature in %s
+             and datediff(now(),stat_date) <= %s
                group by signature
                having sum(activation) >= %s
             """ % (tuple(active_signatures),
+                   config['getBaysCombineMaterialFilterRule']['days'],
                    config['getBaysCombineMaterialFilterRule']['activation'])
-            df = pd.read_sql(sql, engine)
+            df = pd.read_sql(sql, product_engine)
             signature_lst = df['signature'].values
 
-            # TODO 这行代码用于测试
-            signature_lst = ['0070efb7557b2a04cf3d4a6f243c3cd8', '03b93728f0d82ea7865c3c7cf632bc1b']
+            # 这行代码用于测试
+            # signature_lst = ['0070efb7557b2a04cf3d4a6f243c3cd8', '03b93728f0d82ea7865c3c7cf632bc1b']
 
             # 4.2 计算指定素材的贝叶斯特征
             for sig in signature_lst:

+ 4 - 4
ai_target_combine_handler.py

@@ -218,11 +218,10 @@ class GetTargetAndAssemblyParameters(object):
         """
         从 ctop_ai_kuaishou_signature_recommended_target_combine 表中读取素材和对应的定向
         读取配置文件的条件,筛选出符合条件的定向组合
-        TODO 放开sql语句中注释的代码
         """
         sql = """
         select * from ctop_ai_kuaishou_signature_recommended_target_combine where project_id = %s 
-        -- and stat_date = (select max(stat_date) from ctop_ai_kuaishou_signature_recommended_target_combine)
+        and stat_date = (select max(stat_date) from ctop_ai_kuaishou_signature_recommended_target_combine)
         """ % self.project_id
         df = pd.read_sql(sql, self.engine)
 
@@ -330,7 +329,8 @@ class GetTargetAndAssemblyParameters(object):
         creative_cnt_df = creative_cnt_df[creative_cnt_df.creative_count < 200]
 
         # 1-2 计算每个素材还能创建的广告组(定向)个数: (200 - 已关联创意个数) / 15
-        creative_cnt_df['target_combine_cnt'] = int(np.floor((200 - creative_cnt_df['creative_count']) / 15))
+        creative_cnt_df['target_combine_cnt'] = np.floor((200 - creative_cnt_df['creative_count']) / 15)
+        creative_cnt_df = creative_cnt_df[creative_cnt_df.target_combine_cnt >= 1]
 
         final_target_combine = pd.DataFrame([])
         for sig in creative_cnt_df.signature.unique():
@@ -338,7 +338,7 @@ class GetTargetAndAssemblyParameters(object):
             now = datetime.datetime.now()
             # Cannot take a larger sample than population when 'replace=False'
             n = n if n <= len(df[df.signature == sig]) else len(df[df.signature == sig])
-            sig_target_df = df[df.signature == sig].sample(n, axis=0, random_state=(now.year + now.month + now.day))
+            sig_target_df = df[df.signature == sig].sample(int(n), axis=0, random_state=(now.year + now.month + now.day))
             final_target_combine = final_target_combine.append(sig_target_df)
 
         self.target_combine_to_create = final_target_combine.to_dict(orient='records')

+ 3 - 4
config/config.yaml

@@ -1,7 +1,6 @@
 # 目前支持优质定向功能的项目列表
 projectId:
   - 458
-  - 458
 
 targetType:
   - 'action_ratio'
@@ -40,7 +39,7 @@ bayesDim:
           - '31-40岁'
           - '41-49岁'
           - '50+岁'
-        table: 'ctop_kuaishou_audience_daily_report_by_signature_age'
+        table: 'ctop_kuaishou_audience_report_daily_age_material'
         fieldName: 'age_segment'
     gender:
         windowSize: 1
@@ -48,7 +47,7 @@ bayesDim:
         Lst:
             - '男'
             - '女'
-        table: 'ctop_kuaishou_audience_daily_report_by_signature_gender'
+        table: 'ctop_kuaishou_audience_report_daily_gender_material'
         fieldName: 'gender'
     city:
         windowSize: 4
@@ -60,7 +59,7 @@ bayesDim:
             - '三线城市'
             - '四线城市'
             - '五线城市'
-        table: 'ctop_kuaishou_audience_daily_report_by_signature_city'
+        table: 'ctop_kuaishou_audience_report_daily_city_material'
         fieldName: 'city'
 
 

+ 1 - 1
config/url.py

@@ -19,7 +19,7 @@ create_campaign_url = (debug_url if os_env == 'dev' else product_url) + 'kuaisho
 #      putStatus    状态 1-投放、2-暂停、3-删除   int
 #      userId       操作人id                    string
 #      campaignIds  计划id集合                   array
-
+# 返回结果
 # {
 #     "success": true,
 #     "message": "操作成功!",

+ 0 - 1
readme.txt

@@ -28,4 +28,3 @@ telnet 139.186.165.84 31012
 
 
 
-

+ 4 - 2
time_task/time_task_create_ad_by_target.py

@@ -24,6 +24,7 @@ with open('../config/config.yaml', mode='r', encoding='utf-8') as f:
     config = yaml.load(f.read(), Loader=yaml.FullLoader)
 product_db_engine = get_db_engine(config['productDB'])
 project_ids = config['projectId']  # 目前支持优质定向功能的项目列表
+project_ids = project_ids if len(project_ids) > 1 else project_ids*2
 
 
 def send_request(args):
@@ -58,9 +59,10 @@ account_df = pd.read_sql(sql, product_db_engine)
 account_df.drop_duplicates('account_id', keep='first', inplace=True)
 acc_list = [(item['account_id'], item['project_id']) for index, item in account_df.iterrows()]
 
-# for test
+# TODO 注释测试代码 for test
 # acc_list = [(10456827, 458), (9774238, 458)]
-acc_list = [(10456827, 458)]
+# acc_list = [(10456827, 458)]
+acc_list = [(9774238, 458)]
 
 # 2、 5个账户一组进行发送请求
 batch_num = 5