Dediqué una hora a una tarea de preprocesamiento de datos antes de preguntarle a Gemini

una cantidad significativa de tiempo en la preparación de datos para tareas posteriores. Ya sea que se trate de limpieza de datos, manejo de valores faltantes, ingeniería de funciones, preprocesamiento o posprocesamiento de datos, esta fase requiere mucho tiempo.

Entonces, estaba trabajando en esta tarea de posprocesamiento en la que necesitaba crear una nueva columna en un Pandas DataFrame extrayendo valores de una columna existente, en función de los datos de otras dos columnas.

Podría haberle pedido directamente a un LLM que escribiera el código (lo que suelo hacer), pero esta vez quería hacerlo yo mismo. Era temprano en la mañana y tenía la mente fresca, por lo que estaba de humor para manejar algunas operaciones de datos complejas.

Esto es lo que tenía que hacer. Tenía un DataFrame con columnas predicted_categories, pred_category_id y text_predicted_probs.

Los valores de la columna predicted_categories son listas de cinco categorías en formato “category_id” – “category_description”.

[‘80814001 – Freze Uçları’,
‘13003106 – Freze’,
‘80805004 – Sanayi Makineleri’,
‘13003144 – Torna Makinesi’,
‘13003195 – Kumpas’]

La columna text_predicted_probs tiene las probabilidades previstas de estas cinco categorías en orden.

[0.943, 0.018, 0.008, 0.006, 0.004]

Por lo tanto, el primer valor en text_predicted_probs es la probabilidad de la primera categoría en predicted_categories, y así sucesivamente.

La columna pred_category_id muestra la identificación de categoría prevista de otro modelo. Lo que necesito es la probabilidad prevista de la categoría en la columna pred_category_id.

Necesito obtener el orden de pred_category_id en la columna predicted_categories y luego tomar su valor de la columna test_predicted_probs.

El siguiente dibujo demuestra lo que quiero lograr:

En este dibujo, quiero obtener la probabilidad de la categoría 13003106, que es el segundo elemento de la lista y su valor de probabilidad correspondiente es 0,018.

Si le preguntamos a Gemini u otro modelo avanzado, probablemente obtendremos la respuesta en segundos. Pero primero quería hacerlo solo y luego preguntarle a Géminis.

Comencemos leyendo el conjunto de datos en un Pandas DataFrame.

importar pandas como resultados de pd = pd.read_csv(“prediction_results.csv”)

Los valores de la columna predicted_categories son listas de cadenas con identificadores y nombres de categorías:

resultados.loc[0, “predicted_categories”]
# producción: “[‘80814001 – Freze Uçları’, ‘13003106 – Freze’, ‘80805004 – Sanayi Makineleri’, ‘13003144 – Torna Makinesi’, ‘13003195 – Kumpas’]”

Es una lista pero se guarda como una cadena, por lo que primero la convertimos en un objeto de lista usando la función literal_eval en el módulo ast integrado de Python:

ast.literal_eval(resultados.loc[0, “predicted_categories”]) # producción:
[‘80814001 – Freze Uçları’,
‘13003106 – Freze’,
‘80805004 – Sanayi Makineleri’,
‘13003144 – Torna Makinesi’,
‘13003195 – Kumpas’]

Para extraer los identificadores de categoría, podemos dividir cada cadena en esta lista en el carácter “-” y luego seleccionar la primera parte después de dividir. Como tenemos una lista con cinco categorías, debemos realizar esta operación en una lista por comprensión de la siguiente manera:

[category.split(“-“)[0].strip() para categoría en ast.literal_eval(results.loc[0, “predicted_categories”])]# producción:
[‘80814001’, ‘13003106’, ‘80805004’, ‘13003144’, ‘13003195’]

Lo hemos hecho para un valor único (es decir, una fila). Para realizar la misma operación en toda la columna predicted_categories, podemos usar una lista por comprensión. Será una lista de comprensión dentro de otra lista de comprensión (es decir, lista de comprensión anidada):

resultados.loc[:, “predicted_category_ids”] = [
[category.split(“-“)[0].strip() para categoría en ast.literal_eval(predicted_categories)]para predicted_categories en resultados[“predicted_categories”]
]

Ahora tenemos identificadores de categoría extraídos de la columna predicted_categories:

El siguiente paso es verificar el orden de las categorías en las listas de ID de categorías previstas. Luego usaremos este orden para extraer la probabilidad prevista de la categoría.

El objeto de lista de Python tiene un método de índice, que devuelve el índice (es decir, el orden) del elemento en la lista.

resultados.loc[0, “predicted_category_ids”]
# producción:
[‘80814001’, ‘13003106’, ‘80805004’, ‘13003144’, ‘13003195’]

resultados.loc[0, “predicted_category_ids”].index(“13003106”) # salida: 2

Una vez que encuentre el índice de una identificación de categoría prevista, puedo usarlo para obtener la probabilidad de esta identificación de categoría de la columna text_predicted_probs:

Lo que debemos hacer:

Obtenga el índice de pred_category_id en predicted_category_ids Utilice este índice para extraer el valor relevante de text_predicted_probs

Estos pasos se pueden realizar en una sola operación comprimiendo estas tres columnas. Probémoslo en la primera fila:

para i, j, k en zip (resultados[“pred_category_id”][:1]resultados[“predicted_category_ids”][:1]resultados[“text_predicted_probs”][:1]): print(j.index(str(i))) # obtener el índice de pred_category_id en predicted_category_ids print(ast.literal_eval(k)[j.index(str(i))]) # obtener el valor en este índice en text_predicted_probs # salida: 0 0.943

Podemos confirmar el resultado en la captura de pantalla anterior. pred_category_id es 80814001, que es el primer elemento (es decir, índice = 0) en predicted_category_ids y el primer valor de probabilidad es 0,943.

Las listas en la columna text_predicted_probs también se guardan como cadena, por lo que aplicamos la función literal_eval para convertirlas en un objeto de lista.

Podemos realizar esta operación en todo el DataFrame usando una lista por comprensión de la siguiente manera:

resultados.loc[:, “pred_category_prob”] = [
float(ast.literal_eval(k)[j.index(str(i))]) si str(i) en j else 0 para i, j, k en zip(resultados[“pred_category_id”]resultados[“predicted_category_ids”]resultados[“text_predicted_probs”]) ]

Básicamente, convertimos el bucle for en el bloque de código anterior en una lista por comprensión. Solo agregué una marca “si str(i) en j else 0” porque hay algunas filas con un pred_category_id que no existe en predicted_category_ids. En tales casos, establecemos el valor de probabilidad en 0.

La tarea ya está completada como podemos ver a continuación:

¿Cómo hizo Géminis esto?

Después de trabajar aproximadamente una hora (incluidos los descansos), completé la tarea. Luego, quise pedirle a Gemini que viera cómo manejaría la misma tarea.

Escribí un mensaje explicando mi objetivo e incluí una pequeña muestra de los datos.

Esto es lo que Gemini produjo en su primer intento:

importe pandas como pd # 1. Cree el dataFrame de muestra data = { ‘predicted_categories’: [
[‘80814001 – Freze Uçları’, ‘13003106 – Freze’, ‘80805004 – Sanayi Makineleri’, ‘13003144 – Torna Makinesi’, ‘13003195 – Kumpas’]
], ‘pred_category_id’: [80814001]’text_predicted_probs’: [
[0.943, 0.018, 0.008, 0.006, 0.004]
]} df = pd.DataFrame(data) # 2. Defina una función para extraer la probabilidad de que coincida con el ID de categoría def get_matching_prob(row): # Convertir ID en cadena para coincidir target_id_str = str(row[‘pred_category_id’]) # Iterar a través de las categorías para encontrar el índice coincidente para el índice, categoría en enumerar (fila[‘predicted_categories’]): if categoría.startswith(target_id_str): # Devuelve la probabilidad correspondiente de la misma fila de retorno del índice[‘text_predicted_probs’][index]

# Devuelve Ninguno (o 0) si no se encuentra ninguna coincidencia para evitar que el código falle. Devuelve Ninguno # 3. Crea la nueva columna df[‘pred_category_prob’] = df.apply(get_matching_prob, axis=1) # Mostrar el resultado print(df[[‘pred_category_id’, ‘pred_category_prob’]])

Primero creó un DataFrame de muestra utilizando los datos que proporcioné en el mensaje. Luego, escribió una función que hace exactamente lo que le expliqué.

Me tomó aproximadamente una hora escribir el código yo mismo. Gemini completó exactamente la misma tarea en segundos basándose en un mensaje que solo me llevó unos minutos escribir.

Sin embargo, hay un problema menor en el código de Gemini. Utiliza la función de aplicación, que no está vectorizada. En caso de trabajar con conjuntos de datos grandes, el uso de la función de aplicación (básicamente un bucle for) puede aumentar el tiempo de ejecución.

Pero la solución es sencilla. Le pedí a Gemini que escribiera una versión vectorizada y esto es lo que obtuve:

importar pandas como pd # Datos del marco de datos de muestra = {‘categorías_predictas’: [
[‘80814001 – Freze Uçları’, ‘13003106 – Freze’, ‘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. Desglose ambas columnas de la lista simultáneamente para mantener la alineación entre categoría y probabilidad df_exploded = df.explode([‘predicted_categories’, ‘text_predicted_probs’]) # 2. Extraiga el ID numérico de la cadena de categoría utilizando la expresión regular vectorizada df_exploded[‘extracted_id’] = df_explotado[‘predicted_categories’].str.extract(r’^(\d+)’).astype(float) # 3. Filtrar las filas donde el ID extraído coincide con el objetivo ‘pred_category_id’ matched = df_exploded[df_exploded[‘extracted_id’] == df_explotado[‘pred_category_id’]]# 4. Desduplicar el índice (red de seguridad en caso de que un ID aparezca dos veces dentro de la misma lista) coincidente = coincidente[~matched.index.duplicated(keep=’first’)]

# 5. Asigne la columna de probabilidad extraída al DataFrame original usando el índice df[‘pred_category_prob’] = emparejado[‘text_predicted_probs’]

df

La segunda solución estaba perfectamente bien y parecía más simple que el código que escribí.

Entonces, dediqué aproximadamente una hora a una tarea que un LLM podría haber completado en menos de cinco minutos. Sin embargo, si no supiera cómo funciona Pandas, habría aceptado la primera solución, que no era la óptima. Es un ejemplo perfecto de cómo los LLM pueden aumentar la productividad, pero sólo si realmente sabes lo que estás haciendo.