Browse Source

add report api

huangyifan 1 năm trước cách đây
mục cha
commit
d389400072
2 tập tin đã thay đổi với 156 bổ sung39 xóa
  1. 152 36
      sync_amz_data/DataTransform/Data_ETL.py
  2. 4 3
      sync_amz_data/public/amz_ad_client.py

+ 152 - 36
sync_amz_data/DataTransform/Data_ETL.py

@@ -104,34 +104,6 @@ class SP_ETL(SPClient,Common_ETLMethod):
         return self.columnsName_modify(df_budget)
 
 class SB_ETL(SBClient,Common_ETLMethod):
-    reportMetrics = [
-        'applicableBudgetRuleId',
-        'applicableBudgetRuleName',
-        'attributedConversions14d',
-        'attributedConversions14dSameSKU',
-        'attributedDetailPageViewsClicks14d',
-        'attributedOrderRateNewToBrand14d',
-        'attributedOrdersNewToBrand14d',
-        'attributedOrdersNewToBrandPercentage14d',
-        'attributedSales14d',
-        'attributedSales14dSameSKU',
-        'attributedSalesNewToBrand14d',
-        'attributedSalesNewToBrandPercentage14d',
-        'attributedUnitsOrderedNewToBrand14d',
-        'attributedUnitsOrderedNewToBrandPercentage14d',
-        'campaignBudget',
-        'campaignBudgetType',
-        'campaignId',
-        'campaignName',
-        'campaignRuleBasedBudget',
-        'campaignStatus',
-        'clicks',
-        'cost',
-        'dpv14d',
-        'impressions',
-        'unitsSold14d',
-        'attributedBrandedSearches14d',
-        'topOfSearchImpressionShare']
     def campaigns_ETL(self):
         list_campaign_SB = list(self.iter_campaigns(**{"includeExtendedDataFields":True}))
         df_campaign = pd.json_normalize(list_campaign_SB)
@@ -172,18 +144,162 @@ class SB_ETL(SBClient,Common_ETLMethod):
         df_budget = self.TZ_Deal(df_budget,["usageUpdatedTimestamp"])
         return self.columnsName_modify(df_budget)
 
-    def report_campaignsRecord_ETL(self):
+    def reportV3_purchasedAsinRecord_ETL(self,**params):
         today = datetime.today()
-        date = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y%m%d")
-        print(date)
-        need_removedList = []
-        if need_removedList is not None:
-            [SB_ETL.reportMetrics.remove(i) for i in need_removedList]
-        list_campaigns_report = self.get_v3_report(record_type="campaigns",metrics=SB_ETL.reportMetrics,report_date=date)
+        if params.get("endDate")==None:
+            params["endDate"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y-%m-%d")
+        if params.get("startDate") ==None:
+            params["startDate"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y-%m-%d")
+        params['reportType'] = "sbPurchasedProduct"
+        params['columns'] = [
+            'campaignId', 'adGroupId',  'date', 'campaignBudgetCurrencyCode', 'campaignName', 'adGroupName',
+            'attributionType', 'purchasedAsin', 'productName', 'productCategory', 'sales14d', 'orders14d', 'unitsSold14d',
+            'newToBrandSales14d', 'newToBrandPurchases14d', 'newToBrandUnitsSold14d', 'newToBrandSalesPercentage14d',
+            'newToBrandPurchasesPercentage14d', 'newToBrandUnitsSoldPercentage14d'
+        ] #'startDate', 'endDate',
+        params['groupby'] = ['purchasedAsin']
+        params['timeUnit'] = 'DAILY'
+        list_campaigns_report = self.get_v3_report(timeUnit=params['timeUnit'],groupby=params['groupby'],columns=params['columns'],startDate=params['startDate'],endDate=params['endDate'],reportType=params['reportType'])
         # print(list_campaigns_report)
         df_campaign_report = pd.json_normalize(list_campaigns_report)
         return df_campaign_report
 
+    def reportV2_campaignsRecord_ETL(self,**params):
+        today = datetime.today()
+        if params.get("date")==None:
+            params["date"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y%m%d")
+        params['record_type']='campaigns'
+        if params.get('metrics')==None:
+            params['metrics'] = [
+                'applicableBudgetRuleId', 'applicableBudgetRuleName', 'attributedConversions14d',
+                'attributedConversions14dSameSKU', 'attributedDetailPageViewsClicks14d', 'attributedOrderRateNewToBrand14d',
+                'attributedOrdersNewToBrand14d', 'attributedOrdersNewToBrandPercentage14d', 'attributedSales14d',
+                'attributedSales14dSameSKU', 'attributedSalesNewToBrand14d', 'attributedSalesNewToBrandPercentage14d',
+                'attributedUnitsOrderedNewToBrand14d', 'attributedUnitsOrderedNewToBrandPercentage14d', 'campaignBudget',
+                'campaignBudgetType', 'campaignId', 'campaignName', 'campaignRuleBasedBudget', 'campaignStatus', 'clicks', 'cost',
+                'dpv14d', 'impressions', 'unitsSold14d', 'attributedBrandedSearches14d', 'topOfSearchImpressionShare'
+            ]
+        list_campaigns_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
+        # print(list_campaigns_report)
+        df_campaign_report = pd.json_normalize(list_campaigns_report)
+        return df_campaign_report
+    def reportV2_placementRecord_ETL(self,**params):
+        today = datetime.today()
+        if params.get("date")==None:
+            params["date"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y%m%d")
+        params['record_type']='campaigns'
+        if params.get('metrics')==None:
+            params['metrics'] = [
+                    'applicableBudgetRuleId', 'applicableBudgetRuleName', 'attributedConversions14d',
+                    'attributedConversions14dSameSKU', 'attributedDetailPageViewsClicks14d',
+                    'attributedOrderRateNewToBrand14d', 'attributedOrdersNewToBrand14d', 'attributedOrdersNewToBrandPercentage14d',
+                    'attributedSales14d', 'attributedSales14dSameSKU',
+                    'attributedSalesNewToBrand14d', 'attributedSalesNewToBrandPercentage14d', 'attributedUnitsOrderedNewToBrand14d',
+                    'attributedUnitsOrderedNewToBrandPercentage14d',
+                    'campaignBudget', 'campaignBudgetType', 'campaignId', 'campaignName', 'campaignRuleBasedBudget',
+                    'campaignStatus',
+                    'clicks', 'cost', 'dpv14d', 'impressions', 'unitsSold14d', 'attributedBrandedSearches14d'
+                ] #'placement'
+        # print(date)
+        list_campaigns_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'],segment='placement')
+        # print(list_campaigns_report)
+        df_campaign_report = pd.json_normalize(list_campaigns_report)
+        return df_campaign_report
+
+    def reportV2_adGroupsRecord_ETL(self,**params):
+        today = datetime.today()
+        if params.get("date")==None:
+            params["date"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y%m%d")
+        params['record_type']='adGroups'
+        if params.get('metrics')==None:
+            params['metrics'] = [
+                'adGroupId', 'adGroupName','attributedConversions14d', 'attributedConversions14dSameSKU', 'attributedDetailPageViewsClicks14d',
+                'attributedOrderRateNewToBrand14d', 'attributedOrdersNewToBrand14d', 'attributedOrdersNewToBrandPercentage14d', 'attributedSales14d',
+                'attributedSales14dSameSKU', 'attributedSalesNewToBrand14d', 'attributedSalesNewToBrandPercentage14d', 'attributedUnitsOrderedNewToBrand14d',
+                'attributedUnitsOrderedNewToBrandPercentage14d', 'campaignBudget', 'campaignBudgetType', 'campaignId', 'campaignName', 'campaignStatus',
+                'clicks', 'cost', 'dpv14d', 'impressions', 'unitsSold14d', 'attributedBrandedSearches14d'
+                ] #
+        # print(date)
+        list_campaigns_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
+        # print(list_campaigns_report)
+        df_campaign_report = pd.json_normalize(list_campaigns_report)
+        return df_campaign_report
+
+    def reportV2_targetsRecord_ETL(self,**params):
+        today = datetime.today()
+        if params.get("date")==None:
+            params["date"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y%m%d")
+        params['record_type']='targets'
+        if params.get('metrics')==None:
+            params['metrics'] = [
+                'adGroupId', 'adGroupName', 'attributedConversions14d', 'attributedConversions14dSameSKU', 'attributedDetailPageViewsClicks14d', 'attributedOrderRateNewToBrand14d',
+                'attributedOrdersNewToBrand14d', 'attributedOrdersNewToBrandPercentage14d', 'attributedSales14d', 'attributedSales14dSameSKU', 'attributedSalesNewToBrand14d',
+                'attributedSalesNewToBrandPercentage14d', 'attributedUnitsOrderedNewToBrand14d', 'attributedUnitsOrderedNewToBrandPercentage14d', 'campaignBudget', 'campaignBudgetType',
+                'campaignId', 'campaignName', 'campaignStatus', 'clicks', 'cost', 'dpv14d', 'impressions', 'targetId', 'targetingExpression', 'targetingText', 'targetingType', 'unitsSold14d',
+                'attributedBrandedSearches14d', 'topOfSearchImpressionShare'
+                ] #
+        # print(date)
+        list_campaigns_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
+        # print(list_campaigns_report)
+        df_campaign_report = pd.json_normalize(list_campaigns_report)
+        return df_campaign_report
+
+    def reportV2_keywordsRecord_ETL(self,**params):
+        today = datetime.today()
+        if params.get("date")==None:
+            params["date"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y%m%d")
+        params['record_type']='keywords'
+        if params.get('metrics')==None:
+            params['metrics'] = [
+                'adGroupId', 'adGroupName', 'applicableBudgetRuleId', 'applicableBudgetRuleName', 'attributedConversions14d', 'attributedConversions14dSameSKU',
+                'attributedDetailPageViewsClicks14d', 'attributedOrderRateNewToBrand14d', 'attributedOrdersNewToBrand14d', 'attributedOrdersNewToBrandPercentage14d',
+                'attributedSales14d', 'attributedSales14dSameSKU', 'attributedSalesNewToBrand14d', 'attributedSalesNewToBrandPercentage14d', 'attributedUnitsOrderedNewToBrand14d',
+                'attributedUnitsOrderedNewToBrandPercentage14d', 'campaignBudget', 'campaignBudgetType', 'campaignId', 'campaignName', 'campaignRuleBasedBudget', 'campaignStatus',
+                'clicks', 'cost', 'dpv14d', 'impressions', 'keywordBid', 'keywordId', 'keywordStatus', 'keywordText', 'matchType', 'searchTermImpressionRank', 'searchTermImpressionShare',
+                'unitsSold14d', 'attributedBrandedSearches14d', 'topOfSearchImpressionShare'
+                ] #
+        # print(date)
+        list_campaigns_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
+        # print(list_campaigns_report)
+        df_campaign_report = pd.json_normalize(list_campaigns_report)
+        return df_campaign_report
+
+    def reportV2_searchtermsRecord_ETL(self,**params):
+        today = datetime.today()
+        if params.get("date")==None:
+            params["date"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y%m%d")
+        params['record_type']='keywords'
+        if params.get('metrics')==None:
+            params['metrics'] = [
+                'adGroupId', 'adGroupName', 'attributedConversions14d', 'attributedSales14d', 'campaignBudget',
+                'campaignBudgetType', 'campaignId', 'campaignName', 'campaignStatus', 'clicks', 'cost', 'impressions', 'keywordBid',
+                'keywordId', 'keywordStatus', 'keywordText', 'matchType','searchTermImpressionRank',
+                'searchTermImpressionShare'
+                ] #
+        # print(date)
+        list_campaigns_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'],segment='query')
+        # print(list_campaigns_report)
+        df_campaign_report = pd.json_normalize(list_campaigns_report)
+        return df_campaign_report
+
+    def reportV2_adsRecord_ETL(self,**params):
+        today = datetime.today()
+        if params.get("date")==None:
+            params["date"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y%m%d")
+        params['record_type']='ads'
+        if params.get('metrics')==None:
+            params['metrics'] = [
+                'adGroupId', 'adGroupName', 'applicableBudgetRuleId', 'applicableBudgetRuleName', 'attributedConversions14d', 'attributedConversions14dSameSKU',
+                'attributedDetailPageViewsClicks14d', 'attributedOrderRateNewToBrand14d', 'attributedOrdersNewToBrand14d', 'attributedOrdersNewToBrandPercentage14d',
+                'attributedSales14d', 'attributedSales14dSameSKU', 'attributedSalesNewToBrand14d', 'attributedSalesNewToBrandPercentage14d', 'attributedUnitsOrderedNewToBrand14d',
+                'attributedUnitsOrderedNewToBrandPercentage14d', 'campaignBudget', 'campaignBudgetType', 'campaignId', 'campaignName', 'campaignRuleBasedBudget', 'campaignStatus',
+                'clicks', 'cost', 'dpv14d', 'impressions', 'unitsSold14d', 'vctr', 'attributedBrandedSearches14d'
+                ] #
+        # print(date)
+        list_campaigns_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
+        # print(list_campaigns_report)
+        df_campaign_report = pd.json_normalize(list_campaigns_report)
+        return df_campaign_report
 
 class SD_ETL(SDClient,Common_ETLMethod):
     def campaigns_ETL(self):
@@ -228,4 +344,4 @@ if __name__ == '__main__':
     }
     ac_etl = SB_ETL(**AWS_CREDENTIALS)
     # print(ac_etl.budget_ETL(campaign_ids=["126327624499318"]))
-    print(ac_etl.report_targetsRecord_ETL())
+    print(ac_etl.reportV2_adsRecord_ETL(**{}))

+ 4 - 3
sync_amz_data/public/amz_ad_client.py

@@ -415,8 +415,9 @@ class SBClient(BaseClient):
                       timeUnit="DAILY",
                       download=True):
         """
+        Now about reportType is only sbPurchasedProduct available.
         groupby: 聚合条件
-        columns: 需要获取的字段[campaign,targeting,searchTerm,purchasedAsin]
+        columns: 需要获取的字段[campaign,purchasedAsin,targeting,searchTerm]
         """
         url_path = "/reporting/reports"
         headers = {
@@ -654,7 +655,7 @@ if __name__ == '__main__':
     # keyword=["8mp security camera system","8mp security camera system"],
     # matchType=["broad","exact"]))
 
-    sd = SPClient(**AWS_CREDENTIALS)
+    sd = SBClient(**AWS_CREDENTIALS)
 
     # print(sb.get_keyword_bidrecommendation(**{'campaignId': 27333596383941, 'keywords': [
     #     {"matchType": 'broad', "keywordText": "4k security camera system"}]}))
@@ -690,4 +691,4 @@ if __name__ == '__main__':
         'unitsSold14d',
         'attributedBrandedSearches14d',
         'topOfSearchImpressionShare']
-    print(sd.get_v3_report(groupby=['campaign','campaignPlacement'],columns=['impressions'],startDate="2023-10-01",endDate="2023-10-01",reportType="spCampaigns"))
+    print(sd.get_v3_report(groupby=['searchTerm'],columns=['impressions'],startDate="2023-10-21",endDate="2023-10-21",reportType="sbSearchTerm"))