У меня есть вложенное 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. Спасибо.