Я пытаюсь ускорить мою вложенную l oop, удаляя или отбрасывая ненужные наблюдения - PullRequest
0 голосов
/ 23 января 2020

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

Я думаю, что ответ на мой вопрос лежит в моем списке StoreId. Если я смогу отфильтровать этот список вниз, l oop должен быть быстрее, так как он не будет тратить время на просмотр ненужных StoreId.

Максимальная дата - 21.01.2020. Если в этот день в магазине нет тома, я хочу попробовать исключить его из своего списка.

Пример моих данных:

Date       | StoreId    | Volume
--------------------------------
2020-01-17 |     1      |  5
2020-01-18 |     1      |  3
2020-01-19 |     1      |  8
2020-01-20 |     1      |  5
2020-01-21 |     1      |  11
2020-01-18 |     2      |  15
2020-01-19 |     2      |  6
2020-01-20 |     2      |  9
2020-01-17 |     3      |  10
2020-01-18 |     3      |  15
2020-01-19 |     3      |  13
2020-01-20 |     3      |  8
2020-01-21 |     3      |  15
2020-01-17 |     4      |  3
2020-01-18 |     4      |  2

Это всего лишь образец более 50000 строк с более 10000 идентификаторами StoreId. Тем не менее, в этом примере данных я хотел бы удалить StoreId 2 и 4 из моего списка StoreId, прежде чем я oop через мои данные.

Обоснование: я беру 3-дневное скользящее среднее и определяю, является ли максимальная дата (в данном случае 21.01.2020) более чем на два стандартных отклонения от среднего значения. Если нет данных о самой последней дате, то я хочу игнорировать ее.

Вот мой код:

#create list of storekey's and remove duplicates
storeIds = data['StoreIds'].tolist()
storeIds = list(set(storeIds))


#create an empty list
anamolies = []


#create a max date variable
max_date = max(data['Date'])


#loop to get temp_df's fpr each storeid 
for storeid in tqdm(storeIds):
    temp = data[data['StoreId'] == storeId]
    anom_stats(temp, window=3)
    #loop through to pull out points of interest
    for i, row in temp.iterrows():
        if row['Date'] == max_date and (row['High_Priority'] == 1 or row['Low_Priority'] == 1):
            (anamolies.append(row))

Примечание: мне нужно сгруппировать каждый storeid и отделить его от остальных данных перед запуском моей функции, чтобы я мог получить точный скользящее среднее. Я обратился к этому с первым l oop.

Функции l oop и Function работают по желанию, но это занимает немного больше времени, чем хотелось бы. Я считаю очевидным решение - сократить количество элементов, проходящих по моему коду, и это было бы хорошей отправной точкой, так как есть storeid, которые мне не нужны.

Любые предложения или идеи добро пожаловать, так как я все еще учусь python. Спасибо.

...