Как мне ускорить l oop при использовании pandas? - PullRequest
0 голосов
/ 17 июня 2020

На скорую руку, однажды написал код для работы. Предполагалось, что его нужно будет запустить только один раз. Но теперь запускать его придется часто. Исходные данные, к сожалению, предоставить не могу, потому что они конференц-связь. Меня интересует вопрос, какие части кода нужно исправить, чтобы добиться производительности? Текущая версия работает около 2 часов, при этом выполняется около 25 000 итераций.

dfs = []
for x in tqdm_notebook(range(len(group_furn))):

    good_id = group_furn.iloc[x, 0]

    name_promo = group_furn.iloc[x, 1]

    unique_stores = set(stores.loc[stores.store_type_id != 4]['store_id'].unique()) - \
    set(promo_list.loc[(promo_list['good_id'] == good_id) & \
                       (promo_list['name_promo_mech'] == name_promo)].store_id.unique())

    bu_stores = list(unique_stores.intersection(set(bu_furn.store_id.unique())))

    main_stores = bu_store.loc[(bu_store.store_id.isin(bu_stores)) & (bu_store.store_type_id != 4)].main_store_id.unique()

    df = promo_list.loc[(promo_list.good_id == good_id) & (promo_list.name_promo_mech == name_promo) & 
                         (promo_list.store_id.isin(main_stores))]
    bu = bu_store.loc[bu_store.main_store_id.isin(main_stores)]

    df = pd.merge(df, bu, how='inner', left_on='store_id', right_on='main_store_id')

    dfs.append(df)

    main_stores = bu_store.loc[(bu_store.store_id.isin(bu_stores)) & (bu_store.store_type_id == 4)].main_store_id.unique()

    owners = bu_store.loc[bu_store.main_store_id.isin(main_stores)].main_owner_id.unique()

    df_2 = promo_list.loc[(promo_list.good_id == good_id) & (promo_list.name_promo_mech == name_promo) & 
                         (promo_list.owner_id.isin(owners))]
    bu = bu_store.loc[bu_store.main_store_id.isin(main_stores)]

    df_2 = pd.merge(df_2, bu, how='inner', left_on='store_id', right_on='main_store_id')

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