ein erheblicher Zeitaufwand für die Datenaufbereitung für nachgelagerte Aufgaben. Unabhängig davon, ob es um Datenbereinigung, den Umgang mit fehlenden Werten, Function-Engineering, Datenvorverarbeitung oder Nachbearbeitung geht, erfordert diese Part viel Zeit.
Ich arbeitete additionally an dieser Nachbearbeitungsaufgabe, bei der ich eine neue Spalte in einem Pandas DataFrame erstellen musste, indem ich Werte aus einer vorhandenen Spalte extrahierte, basierend auf den Daten aus zwei anderen Spalten.
Ich hätte direkt einen LLM bitten können, den Code zu schreiben (was ich normalerweise tue), aber dieses Mal wollte ich es selbst tun. Es struggle früh am Morgen und ich hatte einen frischen Kopf und struggle in der Stimmung, einige komplexe Datenoperationen durchzuführen.
Hier ist, was ich tun musste. Ich hatte einen DataFrame mit predicted_categories, pred_category_idUnd text_predicted_probs Spalten.
Die Werte in der predicted_categories Die Spalte enthält Pay attention mit fünf Kategorien im Format „category_id“ – „category_description“.
('80814001 - Freze Uçları',
'13003106 - Freze',
'80805004 - Sanayi Makineleri',
'13003144 - Torna Makinesi',
'13003195 - Kumpas')
Der text_predicted_probs Die Spalte enthält die vorhergesagten Wahrscheinlichkeiten dieser fünf Kategorien der Reihe nach.
(0.943, 0.018, 0.008, 0.006, 0.004)
Daher ist der erste Wert in der text_predicted_probs ist die Wahrscheinlichkeit der ersten Kategorie in der predicted_categoriesund so weiter.
Der pred_category_id Die Spalte zeigt die vorhergesagte Kategorie-ID aus einem anderen Modell. Was ich brauche, ist die vorhergesagte Wahrscheinlichkeit der Kategorie in der pred_category_id Spalte.
Ich muss die Bestellung bekommen pred_category_id im predicted_categories Spalte und nehmen Sie dann ihren Wert aus der test_predicted_probs Spalte.
Die folgende Zeichnung zeigt, was ich erreichen möchte:

In dieser Zeichnung möchte ich die Wahrscheinlichkeit der Kategorie 13003106 ermitteln, die das zweite Aspect in der Liste ist und deren entsprechender Wahrscheinlichkeitswert 0,018 beträgt.
Wenn wir Gemini oder ein anderes fortgeschrittenes Modell fragen, erhalten wir die Antwort wahrscheinlich in Sekundenschnelle. Aber ich wollte es zuerst alleine machen und dann Gemini fragen.
Beginnen wir mit dem Einlesen des Datensatzes in einen Pandas DataFrame.
import pandas as pd
outcomes = pd.read_csv("prediction_results.csv")
Die Werte in der predicted_categories Die Spalte enthält Pay attention von Zeichenfolgen mit Kategorie-IDs und Kategorienamen:
outcomes.loc(0, "predicted_categories")
# output: "('80814001 - Freze Uçları', '13003106 - Freze', '80805004 - Sanayi Makineleri', '13003144 - Torna Makinesi', '13003195 - Kumpas')"
Es handelt sich um eine Liste, die jedoch als Zeichenfolge gespeichert wird. Daher konvertieren wir sie zunächst mithilfe von in ein Listenobjekt literal_eval Funktion im eingebauten ast Modul von Python:
ast.literal_eval(outcomes.loc(0, "predicted_categories"))
# output:
('80814001 - Freze Uçları',
'13003106 - Freze',
'80805004 - Sanayi Makineleri',
'13003144 - Torna Makinesi',
'13003195 - Kumpas')
Um die Kategorie-IDs zu extrahieren, können wir jede Zeichenfolge in dieser Liste am „-“-Zeichen teilen und dann den ersten Teil nach der Teilung auswählen. Da wir eine Liste mit fünf Kategorien haben, sollten wir diese Operation im Listenverständnis wie folgt durchführen:
(class.break up("-")(0).strip()
for class in ast.literal_eval(outcomes.loc(0, "predicted_categories")))
# output:
('80814001', '13003106', '80805004', '13003144', '13003195')
Wir haben es für einen einzelnen Wert (dh eine Zeile) gemacht. Um den gleichen Vorgang für das Ganze durchzuführen predicted_categories Spalte können wir ein Listenverständnis verwenden. Es wird ein Listenverständnis innerhalb eines anderen Listenverständnisses sein (d. h. ein verschachteltes Listenverständnis):
outcomes.loc(:, "predicted_category_ids") = (
(class.break up("-")(0).strip() for class in ast.literal_eval(predicted_categories))
for predicted_categories in outcomes("predicted_categories")
)
Wir haben jetzt Kategorie-IDs aus der Spalte „predicted_categories“ extrahiert:

Der nächste Schritt besteht darin, die Reihenfolge der Kategorien in den Pay attention der vorhergesagten Kategorie-IDs zu überprüfen. Anschließend verwenden wir diese Reihenfolge, um die vorhergesagte Wahrscheinlichkeit der Kategorie zu extrahieren.
Das Python-Listenobjekt verfügt über eine Indexmethode, die den Index (dh die Reihenfolge) des Components in der Liste zurückgibt.
outcomes.loc(0, "predicted_category_ids")
# output:
('80814001', '13003106', '80805004', '13003144', '13003195')
outcomes.loc(0, "predicted_category_ids").index("13003106")
# output:
2
Sobald ich den Index einer vorhergesagten Kategorie-ID gefunden habe, kann ich ihn verwenden, um die Wahrscheinlichkeit dieser Kategorie-ID aus der zu ermitteln text_predicted_probs Spalte:

Was wir tun müssen:
- Holen Sie sich den Index von
pred_category_idimpredicted_category_ids - Verwenden Sie diesen Index, um den relevanten Wert daraus zu extrahieren
text_predicted_probs
Diese Schritte können in einem einzigen Vorgang ausgeführt werden, indem diese drei Spalten komprimiert werden. Testen wir es in der ersten Zeile:
for i, j, okay in zip(outcomes("pred_category_id")(:1), outcomes("predicted_category_ids")(:1), outcomes("text_predicted_probs")(:1)):
print(j.index(str(i))) # get the index of pred_category_id in predicted_category_ids
print(ast.literal_eval(okay)(j.index(str(i)))) # get the worth at this index in text_predicted_probs
# output:
0
0.943
Wir können die Ausgabe im Screenshot oben bestätigen. Der pred_category_id ist 80814001, was das erste Aspect (dh Index = 0) im ist predicted_category_ids und der erste Wahrscheinlichkeitswert ist 0,943.
Die Pay attention in der text_predicted_probs Spalte werden ebenfalls als Zeichenfolge gespeichert, daher wenden wir die an literal_eval Funktion, um sie in ein Listenobjekt umzuwandeln.
Wir können diesen Vorgang für den gesamten DataFrame mithilfe eines Listenverständnisses wie folgt ausführen:
outcomes.loc(:, "pred_category_prob") = (
float(ast.literal_eval(okay)(j.index(str(i)))) if str(i) in j else 0
for i, j, okay in zip(outcomes("pred_category_id"), outcomes("predicted_category_ids"), outcomes("text_predicted_probs"))
)
Wir haben die for-Schleife im vorherigen Codeblock grundsätzlich in ein Listenverständnis umgewandelt. Ich habe nur ein Häkchen hinzugefügt „if str(i) in j else 0” weil es einige Zeilen mit a gibt pred_category_id das gibt es nicht in predicted_category_ids. In solchen Fällen setzen wir den Wahrscheinlichkeitswert auf 0.
Die Aufgabe ist nun abgeschlossen, wie wir unten sehen können:

Wie haben Zwillinge das gemacht?
Nach etwa einer Stunde Arbeit (inklusive Pausen) habe ich die Aufgabe erledigt. Dann wollte ich Gemini fragen, wie es die gleiche Aufgabe bewältigen würde.
Ich habe eine Eingabeaufforderung geschrieben, in der ich mein Ziel erläuterte, und eine kleine Auswahl der Daten beigefügt.
Folgendes hat Gemini bei seinem ersten Versuch hervorgebracht:
import pandas as pd
# 1. Create the pattern DataFrame
knowledge = {
'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(knowledge)
# 2. Outline a operate to extract the chance matching the class ID
def get_matching_prob(row):
# Convert ID to string for matching
target_id_str = str(row('pred_category_id'))
# Iterate via the classes to seek out the matching index
for index, class in enumerate(row('predicted_categories')):
if class.startswith(target_id_str):
# Return the corresponding chance from the identical index
return row('text_predicted_probs')(index)
# Return None (or 0) if no match is discovered to stop the code from crashing
return None
# 3. Create the brand new column
df('pred_category_prob') = df.apply(get_matching_prob, axis=1)
# Show the end result
print(df(('pred_category_id', 'pred_category_prob')))
Zuerst wurde ein Beispiel-DataFrame mit den Daten erstellt, die ich in der Eingabeaufforderung angegeben habe. Dann wurde eine Funktion geschrieben, die genau das tut, was ich erklärt habe.
Ich habe ungefähr eine Stunde gebraucht, um den Code selbst zu schreiben. Gemini erledigte genau die gleiche Aufgabe in Sekundenschnelle, basierend auf einer Aufforderung, für deren Schreiben ich nur wenige Minuten brauchte.
Es gibt jedoch ein kleines Downside im Code von Gemini. Es nutzt die apply Funktion, die nicht vektorisiert ist. Bei der Arbeit mit großen Datensätzen kann die Verwendung der Apply-Funktion (im Grunde eine for-Schleife) die Laufzeit verlängern.
Aber die Lösung ist einfach. Ich habe Gemini gebeten, eine vektorisierte Model davon zu schreiben, und hier ist, was ich bekommen habe:
import pandas as pd
# Pattern DataFrame
knowledge = {
'predicted_categories': (
('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(knowledge)
# 1. Explode each listing columns concurrently to take care of alignment between class and chance
df_exploded = df.explode(('predicted_categories', 'text_predicted_probs'))
# 2. Extract the numeric ID from the class string utilizing vectorized regex
df_exploded('extracted_id') = df_exploded('predicted_categories').str.extract(r'^(d+)').astype(float)
# 3. Filter for rows the place the extracted ID matches the goal 'pred_category_id'
matched = df_exploded(df_exploded('extracted_id') == df_exploded('pred_category_id'))
# 4. Dedup the index (security web in case an ID seems twice inside the identical listing)
matched = matched(~matched.index.duplicated(hold='first'))
# 5. Map the extracted chance column again to the unique DataFrame utilizing the index
df('pred_category_prob') = matched('text_predicted_probs')
df
Die zweite Lösung struggle völlig in Ordnung und sah einfacher aus als der Code, den ich geschrieben habe.
Ich habe additionally etwa eine Stunde mit einer Aufgabe verbracht, die ein LLM in weniger als fünf Minuten hätte erledigen können. Wenn ich jedoch nicht gewusst hätte, wie Pandas funktioniert, hätte ich die erste Lösung akzeptiert, die nicht die optimale struggle. Es ist ein perfektes Beispiel dafür, wie LLMs die Produktivität steigern können, aber nur, wenn man tatsächlich weiß, was man tut.
