Трудности с наследством.
Работая с pandas наткнулся на ненужное наследство.
Было две простые таблицы, на одной футболисты и их статистика, на второй статистика команд разбитая на домашние и выездные матчи. Задача: на основе статистики футболиста сделать прогноз на следующий матч(его найдём в статистике команд).
Есть замечательный показать ожидаемых голов - xG. Берём среднее значение xG игрока за последние 5 матчей и перемножаем его на коэффициент. Коэффициент получаем из отношения xG команды игрока и xGA(ожидаемые пропущенные голы) команды следующего соперника. И тут у меня возникает вопрос, а играем дома или на выезде? Вот если бы я брал общие показатели и домашних и выездных матчей, то трудностей бы не возникло. Но я решил у команд данные не из overall_xG и overall_xGA, а Home_xG и Away_xGA, если матч домашний и Away_xG с Home_xGA для выездных игр.
Формула сделала своё дело создал новый столбец xPts и запихал туда значения... И получил наследство! В моём новом столбце хранятся не ожидаемые float64, а объекты pandas.Series. Причём эти объекты имеют атрибут Name, который в одной половине случае Home_xG, а в другой Away_xG. А ещё 13 из 650+ строк попали под исключения и там хранятся либо float ноли, либо те же pandas.Series с пустым значением. И все они наследовали индексы из таблицы команд. Естественно с таким разнообразием никакой сортировки не сделать и нормально не извлечь данные.
Поэтому пришлось делать костыль следующего вида: for _, row in df.iterrows(): id = row['id'] prediction = get_xpts(id, fixture) if isinstance(prediction, (int, float)): value = prediction else: try: value = prediction.values[0] except IndexError: prediction = 0 df.loc[df['id'] == id, 'xPts'] = value
И лишь после это можно было работать, а всякие .apply, .at и .str которые настойчиво предлагал gpt оказались бесполезны :/
Мораль: костыли мы любим, переписывать старый код, заранее избавляясь от лишнего наследства, мы не любим.
· 27.11.2024
Наблюдал за этими пандами. Похоже, чтобы наверняка избавиться от наследства нужно всегда отфильтрованные циферки преобразовывать во float.
#с уникальными id мы получаем одну строкуrow = df.loc[df['id'] == id]
#что будет в наследстве value?value = row['id'] Плюс пока не могут понять, почему иногда единственное значение присваивается через row['column'] , a иногда через row['column'].values[0] хотя в обоих случаях ссылаемся на одну ячейку с одним единственным значением
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён