huangyifan 1 жил өмнө
parent
commit
ee7ad390e0

+ 88 - 0
sync_amz_data/DataTransform/Data_ETL.py

@@ -0,0 +1,88 @@
+from sync_amz_data.public.amz_ad_client import SPClient,Account
+import pandas as pd
+import numpy as np
+from dateutil.parser import parse
+
+class Acount_ETL(Account):
+    def columnsName_modify(self,df):
+        df.columns = [i.replace(".","_") for i in df.columns]
+        return df
+
+    def portfolio_ETL(self):
+        list_portfolio = self.get_portfolio()
+        df_portfolio = pd.json_normalize(list_portfolio)
+        print(self.columnsName_modify(df_portfolio))
+        return self.columnsName_modify(df_portfolio)
+
+class SP_ELT(SPClient):
+    def columnsName_modify(self,df):
+        df.columns = [i.replace(".","_") for i in df.columns]
+        return df
+
+    def time_stamp_convert(self,df,time_columns:list):
+        for time_column in time_columns:
+            df[time_column] = pd.to_datetime(df[time_column])
+        df[time_columns] = df[time_columns].astype("datetime64")
+        return df
+
+    def TZ_Deal(self,df, time_columns):
+        for time_column in time_columns:
+            df[time_column] = df[time_column].map(lambda x: parse(x))
+        df[time_columns] = df[time_columns].astype("datetime64")
+        return df
+
+    def placement_segmentsplit(self,df,segment):
+        df[segment] = df[segment].astype("string")
+        df[segment+str("_percentage")] = df[segment].str.extract("'percentage':.+([\d\.]{1,}),").astype('float32')
+        df[segment+str("_placement")] = df[segment].str.extract("'placement':.+'(.+)'")
+        df.replace(['nan','Nan','NaN'],np.nan,inplace=True)
+        df.drop(columns=[segment],inplace=True)
+        return df
+
+    def campaigns_ETL(self):
+        list_campaign_SP = list(self.iter_campaigns(**{"includeExtendedDataFields":True}))
+        df_campaign = pd.json_normalize(list_campaign_SP)
+        df_campaign = self.placement_segmentsplit(df_campaign, "dynamicBidding.placementBidding")
+        df_campaign = self.TZ_Deal(df_campaign,["extendedData.creationDateTime","extendedData.lastUpdateDateTime"])
+        # print(df_campaign)
+        return self.columnsName_modify(df_campaign)
+
+    def adGroup_ETL(self):
+        list_adGroup_SP = list(self.iter_adGroups(**{"includeExtendedDataFields":True}))
+        df_adGroup_SP = pd.json_normalize(list_adGroup_SP)
+        df_adGroup_SP = self.TZ_Deal(df_adGroup_SP,["extendedData.creationDateTime","extendedData.lastUpdateDateTime"])
+        return self.columnsName_modify(df_adGroup_SP)
+
+    def ads_ETL(self):
+        list_adId_SP = list(self.iter_ads(**{"includeExtendedDataFields":True}))
+        df_adId_SP = pd.json_normalize(list_adId_SP)
+        df_adId_SP = self.TZ_Deal(df_adId_SP,["extendedData.creationDateTime", "extendedData.lastUpdateDateTime"])
+        return self.columnsName_modify(df_adId_SP)
+
+    def keywords_ETL(self):
+        list_keywords_SP = list(self.iter_keywords(**{"includeExtendedDataFields":True}))
+        df_keywords_SP = pd.json_normalize(list_keywords_SP)
+        df_keywords_SP = self.TZ_Deal(df_keywords_SP, ["extendedData.creationDateTime", "extendedData.lastUpdateDateTime"])
+        return self.columnsName_modify(df_keywords_SP)
+
+    def targets_ETL(self):
+        list_targets = list(self.iter_targets())
+        df_targets = pd.json_normalize(list_targets)
+        df_targets = self.TZ_Deal(df_targets, ["extendedData.creationDateTime", "extendedData.lastUpdateDateTime"])
+        return self.columnsName_modify(df_targets)
+
+    def budget_ETL(self):
+        list_budget = self.get_budget(campaign_ids = ["254478421786009"])
+        df_budget = pd.json_normalize(list_budget)
+        # df_budget = self.TZ_Deal(df_budget,)
+        print(df_budget)
+
+if __name__ == '__main__':
+    AWS_CREDENTIALS = {
+        'lwa_client_id': 'amzn1.application-oa2-client.ebd701cd07854fb38c37ee49ec4ba109',
+        'refresh_token': "Atzr|IwEBIL4ur8kbcwRyxVu_srprAAoTYzujnBvA6jU-0SMxkRgOhGjYJSUNGKvw24EQwJa1jG5RM76mQD2P22AKSq8qSD94LddoXGdKDO74eQVYl0RhuqOMFqdrEZpp1p4bIR6_N8VeSJDHr7UCuo8FiabkSHrkq7tsNvRP-yI-bnpQv4EayPBh7YwHVX3hYdRbhxaBvgJENgCuiEPb35Q2-Z6w6ujjiKUAK2VSbCFpENlEfcHNsjDeY7RCvFlwlCoHj1IeiNIaFTE9yXFu3aEWlExe3LzHv6PZyunEi88QJSXKSh56Um0e0eEg05rMv-VBM83cAqc5POmZnTP1vUdZO8fQv3NFLZ-xU6e1WQVxVPi5Cyqk4jYhGf1Y9t98N654y0tVvw74qNIsTrB-8bGS0Uhfe24oBEWmzObvBY3zhtT1d42myGUJv4pMTU6yPoS83zhPKm3LbUDEpBA1hvvc_09jHk7vUEAuFB-UAZzlht2C1yklzQ",
+        'lwa_client_secret': 'cbf0514186db4df91e04a8905f0a91b605eae4201254ced879d8bb90df4b474d',
+        'profile_id': "3006125408623189"
+    }
+    ac_etl = SP_ELT(**AWS_CREDENTIALS)
+    print(ac_etl.keywords_ETL())

+ 1 - 1
sync_amz_data/public/SP_SB_SD_jsonDeal.py

@@ -1,4 +1,4 @@
-from adstoken import Ads_Api_Token
+from sync_amz_data.public.adstoken_OAUTH import Ads_Api_Token
 import requests
 import datetime,time
 import pandas as pd

+ 18 - 8
sync_amz_data/public/amz_ad_client.py

@@ -116,7 +116,7 @@ class SPClient(BaseClient):
         if "maxResults" not in body:
             body["maxResults"] = 100
         while True:
-            info: dict = self.get_campaigns(**body)
+            info: dict = self.get_ad_groups(**body)
             yield from info["adGroups"]
             if not info.get("nextToken"):
                 break
@@ -135,7 +135,7 @@ class SPClient(BaseClient):
         if "maxResults" not in body:
             body["maxResults"] = 100
         while True:
-            info: dict = self.get_campaigns(**body)
+            info: dict = self.get_ads(**body)
             yield from info["productAds"]
             if not info.get("nextToken"):
                 break
@@ -153,7 +153,7 @@ class SPClient(BaseClient):
         if "maxResults" not in body:
             body["maxResults"] = 100
         while True:
-            info: dict = self.get_campaigns(**body)
+            info: dict = self.get_keywords(**body)
             yield from info["keywords"]
             if not info.get("nextToken"):
                 break
@@ -186,7 +186,7 @@ class SPClient(BaseClient):
         }
         return self._request(url_path, method="POST", body=body)
 
-    def get_bidrecommendation(self,campaignId:str,adGroupId:str,targetingExpressions:list,recommendationType:str="BIDS_FOR_EXISTING_AD_GROUP"):
+    def get_adgroup_bidrecommendation(self,campaignId:str,adGroupId:str,targetingExpressions:list,recommendationType:str="BIDS_FOR_EXISTING_AD_GROUP"):
         url_path = "/sp/targets/bid/recommendations"
         headers = {
             "Accept": "application/vnd.spthemebasedbidrecommendation.v3+json",
@@ -198,6 +198,14 @@ class SPClient(BaseClient):
                 "targetingExpressions":targetingExpressions}
         return self._request(url_path, method="POST", body=body, headers=headers)
 
+    def get_keyword_bidrecommendation(self,adGroupId:str,keyword:list,matchType:list):
+        keywords = list(map(lambda x:{"keyword":x[0],"matchType":x[1]},list(zip(keyword,matchType))))
+        print(keywords)
+        url_path = "/v2/sp/keywords/bidRecommendations"
+        body = {"adGroupId":adGroupId,
+                "keywords":keywords}
+        return self._request(url_path, method="POST", body=body)
+
 class SBClient(BaseClient):
     def get_campaigns(self, **body):
         url_path = "/sb/v4/campaigns/list"
@@ -290,6 +298,11 @@ class SDClient(BaseClient):
         url_path = "/sd/campaigns"
         return self._request(url_path, params=params)
 
+class Account(BaseClient):
+    def get_portfolio(self):
+        url_path = "/v2/portfolios/extended"
+        return self._request(url_path)
+
 
 if __name__ == '__main__':
     AWS_CREDENTIALS = {
@@ -299,10 +312,7 @@ if __name__ == '__main__':
         'profile_id': "3006125408623189"
     }
     sp = SPClient(**AWS_CREDENTIALS)
-    # sp.get_budget(campaign_ids=["123264383028090"])
-    # print(sp.get_campaigns())
-    for i in sp.iter_targets():
-        print(i)
+    print(sp.get_keyword_bidrecommendation(adGroupId="119753215871672",keyword=["8mp security camera system","8mp security camera system"],matchType=["broad","exact"]))
 
 
     # sd = SDClient(**AWS_CREDENTIALS)