Прежде чем обратиться к Близнецам, я вернусь к задаче предварительной обработки данных.
Как Близнецы решили мою проблему с Пандами за считанные секунды, и почему основы науки о данных по-прежнему важны для принципа неоптимальных решений.
Делиться
Как специалисты при анализе данных, мы тратим немало времени на подготовку данных для решения задач. Будь то очистка данных, обработка пропущенных результатов, разработка признаков, предварительная обработка данных или постобработка, этот этап требует много времени. столбцов.
Я мог бы напрямую подключиться к магистральному праву и написать код (что я обычно и делаю), но на этот раз я хотел сделать это сам. Было раннее утро, и у меня были свежие мысли, поэтому я был настроен на выполнение сложных операций с данными.
Вот что мне пришлось сделать. У меня был DataFrame со столбцами predicted_categories , pred_category_id и text_predicted_probs .
Значения в столбце predicted_categories формируются из пяти категорий в формате «category_id» – «category_description».
['80814001 - Заморозить Uçları', '13003106 - Freze', '80805004 - Sanayi Makineleri', '13003144 - Torna Makinesi', '13003195 - Kumpas']
В столбце text_predicted_probs какие прогнозируемые вероятности для этих пяти категорий в порядке возрастания.
[0.943, 0.018, 0.008, 0.006, 0.004]
Таким образом, первое значение в text_predicted_probs — это заявки первой категории в predicted_categories , и так далее.
В столбце pred_category_id отображает прогнозируемый идентификатор категории другой модели. Мне же нужна прогнозируемая категория категорий, указанная в столбце pred_category_id .
Мне нужно получить порядок результатов pred_category_id в столбце predicted_categories , а затем возьмите их значение из столбца test_predicted_probs .
На примере ниже показано, чего я хочу добиться:

В этом показателе мне необходимо получить категорию 13003106, которая является вторым компонентом в списке, и ее значение составляет 0,018.
Если бы мы спросили Gemini или другую модель, мы, вероятно, получили бы ответ за считанные секунды. Но я хотел сначала сделать это сам, а потом спросить Gemini.
Начнём с чтения набора данных в DataFrame Pandas.
import pandas as pd results = pd.read_csv("prediction_results.csv")
Значения в столбце predicted_categoriesсформированы строки, содержащие идентификаторы категорий и названия категорий:
results.loc[0, "predicted_categories"] # вывод: "['80814001 - Freze Uçları', '13003106 - Freze', '80805004 - Sanayi Makineleri', '13003144 - Torna Makinesi', '13003195 - Kumpas']"
Это список, но сохраняется как строка, поэтому сначала мы преобразуем его в объектную строку, с помощью функции literal_eval встроенной модуля ast на Python:
ast.literal_eval(results.loc[0, "predicted_categories"]) # вывод: ['80814001 - Заморозить данные', '13003106 - Заморозить', '80805004 - Санайи Makineleri', '13003144 - Torna Makinesi', '13003195 - Kumpas']
Чтобы определить идентификаторы категорий, мы можем выбрать каждую категорию в этом списке по символу «-», а затем выберите первую часть после разделения. поскольку у нас есть список из пяти категорий, операцию следует выбирать с помощью спискового выражения следующим образом:
[category.split("-")[0].strip() для категории в ast.literal_eval(results.loc[0, "predicted_categories"])] # вывод: ['80814001', '13003106', '80805004', '13003144', '13003195']
Мы сделали это для одного значения (т.е. одной строки). Чтобы выполнить ту же операцию для всего столбца predicted_categories, мы можем использовать генератор списков. Это будет генератор списков внутри другого генератора списков (т.е. вложенный генератор списков):
results.loc[:, "predicted_category_ids"] = [ [category.split("-")[0].strip() для категории в ast.literal_eval(predicted_categories)] для предсказанных_категорий в результатах["predicted_categories"] ]
Теперь у нас есть одинаковые категории, выделенные из столбца предсказанные_категории:
рисунок>
Следующий шаг — проверка порядка категорий в списках прогнозируемых идентификаторов категорий. Затем мы используем этот порядок для извлечения прогнозируемой вероятности категории.
Тип объекта List в Python имеет метод `index`, который возвращает индекс (т.е. порядок) элемента в списке.
results.loc[0, "predicted_category_ids"] # вывод: ['80814001', '13003106', '80805004', '13003144', '13003195'] results.loc[0, "predicted_category_ids"].index("13003106") # вывод: 2
Как только я найду индекс прогнозируемого идентификатора категории, я смогу использовать его для получения возможности этого идентификатора категории из столбца text_predicted_probs :

Что нам нужно сделать:
- Получить индекс
pred_category_idвpredicted_category_ids - Используйте этот индекс для извлечения значимых значений из
text_predicted_probs
Эти шаги можно выполнить для одной операции, в этих трех столбцах. Давайте проверим это в первой строке:
for i, j, k в zip(results["pred_category_id"][:1], results["predicted_category_ids"][:1], results["text_predicted_probs"][:1]): print(j.index(str(i))) # получаем индекс pred_category_id в предсказанных_категории_ids print(ast.literal_eval(k)[j.index(str(i))]) # получаем значение по этому индексу в text_predicted_probs # вывод: 0 0.943
Мы можем получить результат на скриншоте выше. Значение pred_category_id равно 80814001, что является первым элементом (т.е. индекс = 0) в predicted_category_ids , первое значение вероятности равно 0,943.
Списки в столбце text_predicted_probs также используются в качестве строк, поэтому мы применяем функцию literal_evalдля преобразования их в список объектов.
Эту операцию можно выбрать над всем DataFrame, используя списковое выражение следующим образом:
results.loc[:, "pred_category_prob"] = [ float(ast.literal_eval(k)[j.index(str(i))]) if str(i) в j else 0 for i, j, k в zip(results["pred_category_id"], results["predicted_category_ids"], results["text_predicted_probs"]) ]
По сути, мы преобразовали цикл для преобразования кода блока в списковое выражение. Я добавил проверку « if str(i) in j else 0 », потому что есть строки, в которых pred_category_id отсутствует в predicted_category_ids . В таких случаях устанавливается значение условия равным 0.
.
Задача выполнена, как показано на приведенных ниже изображениях:

Как Близнецам это удалось?
Примерно через час работы (включая перерывы) я выполнил задание. Затем я вызвал шоу Gemini, как он справился с той же самой частью.
Я написал задание, в котором объясняла свой результат, и включил небольшой пример данных.
Вот что Gemini выдал с первым попытка:
импортируйте pandas как pd # 1. Создайте образец данных DataFrame = { 'predicted_categories': [ ['80814001 - Заморозить параметры', '13003106 - Заморозить', '80805004 - Санайи Макинелери', '13003144 - Торна Макинеси', '13003195 - Кумпас'] ], 'pred_category_id': [80814001], 'text_predicted_probs': [ [0.943, 0.018, 0.008, 0.006, 0.004] ] } df = pd.DataFrame(data) # 2. Определите функцию для извлечения вероятности соответствия идентификатору категории def get_matching_prob(row): # Преобразование ID в строку для сопоставления target_id_str = str(row['pred_category_id']) # Перебираем категории, чтобы найти соответствующий индекс для индекса, категории в enumerate(row['predicted_categories']): if Category.startswith(target_id_str): # Возвращаем соответствующую вероятность из того же индекса return row['text_predicted_probs'][index] # Возвращаем None (или 0), если соответствие не найдено, чтобы предотвратить сбой кода return None # 3. Создайте новый столбец df['pred_category_prob'] = df.apply(get_matching_prob, axis=1) # Отображение результата print(df[['pred_category_id', 'pred_category_prob']])
Первоначальная программа создала выбранный DataFrame, на основе данных, предоставленных мной в запросе. Затем она написала функцию, которая делает именно то, что я объяснил.
В написании кода у меня ушло около часа. Близнецы выполнили эту самую минимальную задачу за считанные секунды с помощью подсказки, написание которой у меня ушло всего несколько минут.
Однако в коде Близнецов есть небольшая проблема. Он использует функцию apply , которая не векторизована. При работе с указанными наборами данных использование функции apply (по сути, цикл for) может увеличить время выполнения.
Но решение простое. Я попросил Gemini написать векторизованную версию, и вот что у меня получилось:
import pandas as pd # Пример данных DataFrame = { 'predicted_categories': [ ['80814001 - Заморозить список', '13003106 - Заморозить', '80805004 - Sanayi Makineleri'], ['13003144 - Torna Makinesi', '13003195 - Kumpas'] ], 'pred_category_id': [80814001, 13003195], 'text_predicted_probs': [[0.943, 0.018, 0.008], [0.6, 0.4] ] } df = pd.DataFrame(data) # 1. Расчленить оба столбца списка одновременно, чтобы сохранить соответствие между категорией и вероятностью df_exploded = df.explode(['predicted_categories', 'text_predicted_probs']) # 2. Извлеките числовой идентификатор из строки категории с помощью векторизованного регулярного выражения df_exploded['extracted_id'] = df_exploded['predicted_categories'].str.extract(r'^(d+)').astype(float) # 3. Фильтровать строки, в которых извлеченный идентификатор соответствует целевому 'pred_category_id' matched = df_exploded[df_exploded['extracted_id'] == df_exploded['pred_category_id']] # 4. Дедупликация индекса (подстраховка на случай, если идентификатор появится дважды в одном списке) matched = matched[~matched.index.duulated(keep='first')] # 5. Сопоставьте извлеченный столбец вероятности обратно с исходным DataFrame, используя индекс df['pred_category_prob'] = matched['text_predicted_probs'] df
Второе решение было вполне приемлемым и выглядело проще, чем написанный мной код.
Таким образом, я вернулся около задачи, которую магистр права мог бы выбрать менее чем за пять минут. Однако, если бы я не знал, как работает Pandas, я бы принял первое решение, которое не было принято. Это прекрасный пример того, как магистры права могут повысить производительность, но только если вы действительно знаете, что это делает.
Сонер Йылдырым Посмотреть все магазины Сонер Йылдырым
Источник: towardsdatascience.com
Оцените материал:
Похожие записи
Почему стресс — это не слабость характера, а биохимическая реакция
25.05.2026
Куда исчезает молочный шоколад и при чём тут изменение климата?
17.11.2025
Устройство с 6100 кубитами — шаг к созданию самого большого квантового компьютера
25.09.2025Присоединяйтесь и подпишитесь на рассылку самых свежих новостей по Email
Получайте свежие новости и идеи на почту. Без спама — только самое интересное.
Нажимая «Подписаться», вы соглашаетесь с политикой конфиденциальности.
