Я написал функцию, которая перебирает 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()
поэтому я хотел бы найти другой способ сделать это или ускорить совет. Спасибо.