Pandas df - сохранить прогресс после HTTPError и повторить попытку - PullRequest
0 голосов
/ 08 октября 2018

У меня есть фрейм данных pandas, содержащий данные организации, строку org_string (название компании) которой я передаю в API (дом британских компаний) и извлекаю словарь, содержащий зарегистрированный идентификатор компании.API находится в бета-версии и часто возвращает 502 HTTPError.В тот момент, когда возникает ошибка, я сохраняю фрейм данных, чтобы не терять прогресс.

Функция для выполнения запроса API:

def get_org_id(df):
    s = chwrapper.Search(access_token=config.api_key)
    org_strings = df['org_string']
    org_id = {}

    while True:
        try:
            for chunk in np.array_split(org_strings, math.ceil(len(org_strings)/600), axis=0):

            print("\nProcessing companies house batch of size: " + str(len(chunk)))

            # For each org_string in the sub-array of org_strings, pull org data from companies house

                for word in chunk:
                   r = s.search_companies(word)
                   comp_house_dict = r.json()
                   # r returns a nested dict with complete info on the org. Below pulls just the ID number.
                   org_id[word] = comp_house_dict['items'][0]['company_number']
                   org_id.update(org_id)

       except HTTPError:
            return org_ig
            # Save progress
            save_adjusted_data(df, df_name)
            continue
       break

   return org_id

Моя цель - перезапустить программу и продолжить захват идентификаторов.Какой лучший способ продолжить отсюда?До сих пор я исследовал следующее, чтобы создать две новые временные df: одну с завершенными идентификаторами, а другую только с пустыми строками 'connected_id' и применить ту же функцию, что и раньше.Затем я бы слил их вместе, что-то вроде:

if 'obtained_id' in df:
                # Split df into blank and non blank ids:
                isnull = df.obtained_id.isnull()
                notnull = df.obtained_id.notnull()
                empty_id_df = df[isnull]
                filled_id_df = df[notnull]
                org_strings = empty_id_df['org_string']

Затем вернул org_strings и передал это функции выше.Это кажется запутанным - есть ли лучший способ сделать это?Я думал об использовании yield / Generators, но пока это не для меня, и я не уверен, стоит ли тратить время на изучение этого процесса.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...