Как я могу оптимизировать groupby.apply (функцию) в Python? - PullRequest
0 голосов
/ 14 января 2020

У меня есть функция, которая использует deque.collections для отслеживания ежедневных запасов на основе FIFO. Заказ будет выполнен, если это возможно, и будет соответственно вычтен из запаса. Я использую функцию в groupby.apply (my_function).

У меня есть трудности, где разместить второе l oop. Оба цикла работают правильно, когда работают самостоятельно. Но я не заставляю их работать вместе.

Набор данных составляет около 1,5 миллионов строк. Спасибо.

DOS = 7
WIP = 1

df_fin['list_stock'] = 0
df_fin['stock_new'] = 0

def create_stocklist(x):
    x['date_diff'] = x['dates'] - x['dates'].shift()
    x['date_diff'] = x['date_diff'].fillna(0)
    x['date_diff'] = (x['date_diff'] / np.timedelta64(1, 'D')).astype(int)
    x['list_stock'] = x['list_stock'].astype(object)
    x['stock_new'] = x['stock_new'].astype(object)

    var_stock = DOS*[0]
    sl = deque([0],maxlen=DOS)

    for i in x.index:

        order = x['order_bin'][i]

        if x['date_diff'][i] > 0:
            for p in range(0,x['date_diff'][i]):
                if p == WIP:
                    sl.appendleft(x.return_bin[i-1])
                else:
                    sl.appendleft(0)

                sl_list = list(sl)
                sl_list.reverse()

                new_list = []

#from here the loop does not work as I wanted it to work. 
#I want to loop over de created sl_list
#and then start the loop above with the outcome of the loop below.

            for elem in sl_list:
                while order > 0:
                    val = max(0,elem-order)
                    order = (abs(min(0,elem-order)))
                    new_list.append(val)
                    break

                else:
                    new_list.append(elem)

            new_list.reverse()
            x.at[i,'list_stock'] = new_list

            sl = deque(new_list)

    return x

df_fin.groupby(by=['ID']).apply(create_stocklist)

1 Ответ

0 голосов
/ 14 января 2020

У вас нет доступа к sl_list внутри второго l oop, вы просто должны определить его в верхней области: например, сразу после первого глобального для l oop:

for i in x.index:
        # define it just here
        sl_list = []
        order = x['order_bin'][i]
...