Я пытаюсь создать функцию, которая может просматривать предыдущие строки в DataFrame и суммировать их на основе заданного количества строк для просмотра. Здесь я использовал 3, но в идеале я хотел бы увеличить его, чтобы оглянуться назад на большее количество строк. Мое решение работает, но, похоже, не очень эффективно. Другой критерий - каждый раз, когда он попадает в новую команду, счетчик должен начинаться заново, поэтому первая строка для каждой новой команды всегда равна 0, данные будут упорядочены в командном порядке, но если известно решение, для которого данные нев командном порядке это было бы невероятно. Есть ли в Пандах функция, которая может помочь с этим?
До сих пор я пробовал приведенный ниже код и пытался найти проблему, самый близкий пример, который я смог найти: здесь ! но это группирует индекс, и я не уверен, как применить это, когда значение должно постоянно сбрасываться каждый раз, когда оно попадает в новую команду, поскольку это не будет различать каждый раз, когда появляется новая команда.
np.random.seed(0)
data = {'team':['a','a','a','a','a','a','a','a','b','b',
'b','b','b','b','b','b','c','c','c','c','c','c','c','c'],
'teamPoints': np.random.randint(0,4,24)}
df = pd.DataFrame.from_dict(data)
df.reset_index(inplace=True)
def find_sum_last_3(x):
if x == 0:
return 0
elif x == 1:
return df['teamPoints'][x-1]
elif x == 2:
return df['teamPoints'][x-1] + df['teamPoints'][x-2]
elif df['team'][x] != df['team'][x-1]:
return 0
elif df['team'][x] != df['team'][x-2]:
return df['teamPoints'][x-1]
elif df['team'][x] != df['team'][x-3]:
return df['teamPoints'][x-1] + df['teamPoints'][x-2]
else:
return df['teamPoints'][x-1] + df['teamPoints'][x-2] +
df['teamPoints'][x-3]
df['team_form_3games'] = df['index'].apply(lambda x : find_sum_last_3(x))
Первая часть функции обращается к крайним случаям, когда сумма 3 невозможна, потому что есть менее 3 элементов
Вторая часть функции решает проблему 'командыменяетсяКогда команда меняет сумму, ее нужно начинать заново, поэтому каждая «команда» рассматривается отдельно
В заключительной части просто рассматриваются предыдущие 3 элемента dataFrame и суммируются их вместе.
Этопример работает как ожидалось и дает новый столбец с ожидаемым выводом следующим образом:
0, 0, 3, 4, 4, 4, 6, 9, 0, 1, 4, 5, 6, 3, 5, 5, 0, 0, 0, 2, 3, 5, 6, 8
1-й элемент равен 0, так как это крайний случай, 2-й равен 0, потому что сумма первого элемента равна 0. 3-й равен 3так как сумма 1-го и 2-го элементов равна 3. 4-я сумма 1-го, 2-го, 3-го. 5-я сумма 2-го, 3-го, 4-го. 6-е - это сумма 3-го, 4-го, 5-го
Однако, когда масштабируется до 10, он оказывается очень неэффективным, что затрудняет масштабирование до 10 или 15. Он также неэлегатен, и новая функция должнабыть написано для каждой различной длины суммы.