Функция ускорения в Python - PullRequest
0 голосов
/ 01 мая 2019

Я написал функцию, которая перебирает 3 параметра, чтобы определить точку отсутствия на складе, чтобы проиллюстрировать это, я нарисую пример:

предположим, что продукт 10 в магазине 2 для предложения с названием "super5" следует этой тенденции

day | qty

1     50
2     70
3     55
4     67
5     13
6     0

Предложение закончилось на 6-й день, на 5-й день потенциальный товар отсутствовал на складе. Чтобы определить это и проверить его, я нашел индекс 0 кол-во и оглянулся на 2 назад. Я взял среднее значение этих двух дней (67 + 13) / 2 = 40, если среднее значение> сначала дециль, а затем пометить "нет в наличии", иначе "ko"

Я пытался:

def flag_out_of_stock(dataframe, sku, store, offer) : 
ffl = []
sku_store_offer = dataframe[["id_sku", "id_store", "id_offer"]].drop_duplicates(["id_sku", "id_store", "id_offer"])
for sku, store, offer in tqdm(zip(sku_store_offer["id_sku"], sku_store_offer["id_store"], sku_store_offer["id_offer"])):
    cond1 = dataframe["id_sku"] == sku
    cond2 = dataframe["id_store"] == store
    cond3 = dataframe["id_offer"] == offer
    timeseries = dataframe[np.logical_and.reduce((cond1, cond2, cond3))][["f_qty_recalc", "id_day"]]\
    .set_index("id_day")\
    .sort_index()
    mu = timeseries.mean()[0]
    if mu >= 6 : 
        sigma = timeseries.std()[0]
        q1 = timeseries.quantile(0.1)[0]
        # index where qty == 0
        likely_out_of_stock_index = np.where(timeseries ==0)[0]
        # if there more that one value where qty == 0
        if len(likely_out_of_stock_index) > 1 : 
            # for each index where qty == 0
            for i in likely_out_of_stock_index :  
                # if the day before or day after are superior to the first decile 
                #then flag out of stock
                day_before_2 = timeseries.iloc[i-2:i].mean()[0]
                if day_before_2 >= q1 : 
                    ffl.append("out_of_stock")
                elif day_before_2 >= mu - sigma  :
                    ffl.append("likely_out_of_stock")
                else : 
                    ffl.append("KO")
        else :
            try : 
                day_before_2 = timeseries.iloc[likely_out_of_stock_index-2:likely_out_of_stock_index].mean()[0]
                if day_before_2 >= q1 : 
                    ffl.append("out_of_stock")
                elif day_before_2 >= mu - sigma  :
                    ffl.append("out_of_stock")
                else : 
                    ffl.append("KO")
            except TypeError :
                ffl.append("KO")
    else : 
        ffl.append("KO")
return pd.Series(ffl)

Проблема в том, что этот код работает на ~ 600 тыс. Строк параметров и занимает ~ 1,3 с за каждую итерацию в соответствии с журналом 0,9 с, что операции

timeseries = dataframe[np.logical_and.reduce((cond1, cond2, cond3))][["f_qty_recalc", "id_day"]]\
.set_index("id_day")\
.sort_index()

поэтому я хотел бы найти другой способ сделать это или ускорить совет. Спасибо.

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