I've done some searching of the forum and don't see anything which explains the weird issues I'm running into.
In short: when I submit the same list of keywords to the API, I get different numbers of returned results. - I submit 12,031 keywords to the TargetingIdeaService - On one run I get 143,644 results returned (12 months of data per keyword) - On another run I get 143,592 results returned I just don't understand why when I'm submitting 200 of these keywords at a time, I get different numbers of results back. And why are there missing results? If I submit 12,031 keywords, shouldn't I get 144,372 returned results (12031 keywords * 12 months of data)? Below I've included a sample of what I'm sending, along with the code I'm using. I appreciate any and all ideas. I'm also logging the request and response, but they're quite large, and I don't get any obvious errors or exceptions. My current possible solution is to look at the difference between what I sent and what I got back (when it's all finished running everything at least once), and then re-send what didn't get results, but I feel like something else is at play here and I'd like to understand that before I waste time solving the wrong problem. Thank you in advance for any pointers, ideas, critiques, comments, etc!!! [ SAMPLE chunk.search_query ] In: chunk.search_query.head() Out[545]: key 561 151 "scrum lifecycle" 152 "scrum master exam" 153 "definition of done scrum" 154 "scrum team members" 155 "what is agile and scrum" Name: search_query, dtype: object [ ADWORDS API SETUP ] # AdWords setup adwords_client = adwords.AdWordsClient.LoadFromStorage() # Initialize appropriate service. targeting_idea_service = adwords_client.GetService( 'TargetingIdeaService', version='v201609') [ CODE FOR REQUEST AND INTERPRETING RESPONSE ] stats_pd = pd.DataFrame() num_chunks = math.ceil(s.shape[0] / 200) for chunk in np.array_split(s, num_chunks): print(chunk.display_term.unique()) print(chunk.shape) PAGE_SIZE = len(chunk.search_query) # Construct selector object and retrieve related keywords. offset = 0 stats_selector = { 'searchParameters': [ { 'xsi_type': 'RelatedToQuerySearchParameter', 'queries': chunk.search_query.tolist() }, { # Language setting (optional). # The ID can be found in the documentation: # https://developers.google.com/adwords/api/docs/appendix/languagecodes 'xsi_type': 'LanguageSearchParameter', 'languages': [{'id': '1000'}], }, { # Network search parameter (optional) 'xsi_type': 'NetworkSearchParameter', 'networkSetting': { 'targetGoogleSearch': True, 'targetSearchNetwork': False, 'targetContentNetwork': False, 'targetPartnerSearchNetwork': False } } ], 'ideaType': 'KEYWORD', 'requestType': 'STATS', 'requestedAttributeTypes': ['KEYWORD_TEXT', 'TARGETED_MONTHLY_SEARCHES'], 'paging': { 'startIndex': str(offset), 'numberResults': str(PAGE_SIZE) } } retry_run = True number_of_attempts = 0 while retry_run: try: stats_page = targeting_idea_service.get(stats_selector) logger.debug(" >>> STATS_PAGE: " + str(stats_page)) except Exception as e: error_msg += "::Problems with Google AdWords connection::" inner_error = e if 'RateExceededError.RATE_EXCEEDED' == inner_error.fault.detail.ApiExceptionFault.errors.errorString: number_of_attempts += 1 time_to_wait = int(inner_error.fault.detail.ApiExceptionFault.errors.retryAfterSeconds) * ( 2 * number_of_attempts) print('>> ***** RATE EXCEEDED ###### <<') print('>> Sleeping for ' + str(time_to_wait) + ' seconds <<') time.sleep(time_to_wait) break else: print(">> OTHER ERROR CAUGHT, NOT HANDLED <<") raise retry_run = False # raise (useful for troubleshooting) ########################################################################## # Parse results to pandas dataframe try: if 'entries' in stats_page: for stats_result in stats_page['entries']: stats_attributes = {} for stats_attribute in stats_result['data']: #print (stats_attribute) if stats_attribute['key'] == 'KEYWORD_TEXT': kt = stats_attribute['value']['value'] else: for i, val in enumerate(stats_attribute['value'][1]): data = {'keyword': kt, 'year': val['year'], 'month': val['month'], 'count': val['count']} data = pd.DataFrame(data, index = [i]) stats_pd = stats_pd.append(data, ignore_index=True) else: print(" ######### >>> NO ENTRIES IN STATS_PAGE <<< ########## ") except: error_msg += "::Invalid results returned from Google AdWords::" time.sleep(15) #play with different sleep times to rate limit how hard I hit AdWords -- -- =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ Also find us on our blog and Google+: https://googleadsdeveloper.blogspot.com/ https://plus.google.com/+GoogleAdsDevelopers/posts =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ You received this message because you are subscribed to the Google Groups "AdWords API Forum" group. To post to this group, send email to adwords-api@googlegroups.com To unsubscribe from this group, send email to adwords-api+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/adwords-api?hl=en --- You received this message because you are subscribed to the Google Groups "AdWords API Forum" group. To unsubscribe from this group and stop receiving emails from it, send an email to adwords-api+unsubscr...@googlegroups.com. Visit this group at https://groups.google.com/group/adwords-api. To view this discussion on the web visit https://groups.google.com/d/msgid/adwords-api/85075866-7ab4-4b82-bd8c-647246a15bfb%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.