ich stehe vor einer Herausforderung und benötige eure Expertise. Ich arbeite mit einer Excel-Tabelle, die verschiedene Spalten enthält.
Ich möchte gleichartige Zeilen (die alle Transaktionen enthalten) dieser Tabelle basierend auf mehreren Kriterien zusammenfassen, um weniger Datensätze zu haben.
Die originale Excel-Datei hat mittlerweile mehr als 300.000 Einträge ist ca. 40MB groß und dementsprechend sperrig zu handhaben.
ChatGPT hat mich auf Python und pandas gebracht und nach mehreren Stunden bin ich nun an dem Punkt angekommen an dem ich nicht weiterkomme, weil ChatGPT immer wieder Sachen vergisst oder auslässt.
Ich kenne mich selbst weder mit Python, noch mit anderen Programmiersprachen aus und ich verstehe leider auch nur bruchstückhaft, was der von ChatGPT entwickelte Code genau macht.
Ich weiß, dass das eine ziemliche Zumutung für jeden Programmierer ist, weiß mir aber nicht anders zu helfen.
Hier ein Link zu einer Beispieltabelle bei docs.google
https://docs.google.com/spreadsheets/d/ ... sp=sharing
Ich habe mal versucht zusammenzustellen, was passieren soll, wobei mein Aufbau vielleicht unnötig kompliziert ist.
Ich hoffe es ist klar, was ich theoretisch erreichen möchte.
Zusammenfassungskriterien:
1. Wenn der Wert in der Spalte "isIgnored" "WAHR" lautet -> Zeile ignorieren.
2. Wenn der Wert in der Spalte "isIgnored" "Falsch" lautet -> Zeile verarbeiten.
3. Nur Zeilen mit identischem Eintrag bei "area" können zusammengefasst werden.
4. Nur Zeilen mit identischem Eintrag bei "location" können zusammengefasst werden.
5. Nur Zeilen mit identischem oder leerem Eintrag bei "type" können zusammengefasst werden.
6. An dieser Stelle ist nun eine Prüfung erforderlich, die unterschiedliches weiteres vorgehen erforderlich macht, abhängig davon, ob der Eintrag in der Spalte „type“ die Werte „deposit“, „withdraw“ oder „order“ enthält. Nur gleichartige Einträge können eventuell zusammengefasst werden.
Fangen wir mal mit deposit an. Ich versuche es dann gern für die anderen beiden Typen in Eigenregie hinzubekommen. Withdraw wird nicht so schwer werden (hoffe ich) und für "Order" werde ich dann wohl noch mal fragen müssen.
Die Prüfung geht bei „deposit“ so von statten:
6 a) Bei „deposit“ können nur Spalten zusammengefasst werden in denen der Eintrag in „boughtCurrencyId“ identisch ist.
6 b) Wenn die Einträge identisch sind, muss geprüft werden, ob die Einträge in „feeCurrencyId“ identisch sind.
6 c) Wenn sie identisch sind, dann können sie zusammengefasst werden.
6 d) Wenn sie unterschiedlich sind, so können sie nur zusammengefasst werden, wenn die Einträge der anderen Zeilen bei "feeQuantity" leer sind sind.
6 e) Die Felder „soldQuantity“ „soldCurrency” “soldCurrencyId” müssen leer sein, sonst können die Einträge nicht zusammengefasst werden.
Zeilen sollen bei „deposit“ folgendermaßen zusammengefasst:
Als Uhrzeit in der Spalte „TimeExecuted“ soll die späteste der zusammengefassten Transaktionen übernommen werden.
Hier gibt es die Besonderheit, dass bei Transaktionen am letzten Tag eines Monats die Transaktionen nur bis 23:59:59 zusammengefasst werden sollen.
In der Spalte „type“ bleibt es (logischerweise) bei „deposit“
Die Werte aller zusammengefassten Zeilen aus der Spalte „boughtQuantity“ werden addiert.
Falls es Einträge bei den Fees gibt, so sind die Werte aus „feeQuantity“ zu addieren.
Die Werte aus „feeCurrency“ sind ebenfalls zu übernehmen. Falls eine Transaktion mit einem leeren Wert bei „feeCurrency“ und „feeCurrencyId“ ebenfalls zusammengefasst wird, so verbleibt es bei dem nicht leeren Eintrag.
Die Werte aus allen zusammengefassten Zeilen der Spalte „txId“ sollen in die zusammengefasste Transaktion übernommen werden.
Dazu sollen die Einträge beginnend von der ersten bis zur letzten durch ein „+“ getrennt in die neue und zusammengefasste Transaktion übernommen werden.
Wenn die „txId“ von 3 zusammengefassten Transaktionen also 1, 2 und 3 lautet, so soll in der zussamengefassten Transaktion der Eintrag im Feld „txId“ „1 + 2 + 3“ lauten.
Als Wert für das Feld „Id“ soll der Eintrag der letzten zusammengefassten Transaktion übernommen werden.
Das Feld „comments“ der zusammengefassten Tranaktion soll so befüllt werden:
<Anzahl der zusammengefassten Transaktionen> „Transaktionen“ von <Zeitstempel der frühsten in dieser Zusammenfassung enthaltenen Transaktion einsetzen> bis < Zeitstempel der frühsten in dieser Zusammenfassung enthaltenen Transaktion einsetzen> zusammengefasst. ID: <Einträge der Felder aus der Spalte „Id“ für alle zusammengefassten Transaktionen, getrennt durch ein „+“ einfügen>
Danach sollen eingefügt werden </ ursprüngliche Kommentare> und dahinter alle in den Feldern „comments“ vorhandenen Einträge der zusammengefassten Transaktionen übernommen werden.
Ein vollständiger Eintrag im Feld „comments“ könnte so aussehen:
4 Transaktionen von 01.01.2020 00:09:12 bis 01.01.2020 07:06:14 zusammengefasst. ID: 1 + 2 + 3 + 4 / ursprüngliche Kommentare: Hallo + das + ist + ein + Test
Das beendet die Vorgehensweise für den Typ „deposit“
Mit ChatGPTs Hilfe habe ich folgenden Code für den Bereich "Order" versucht hinzubekommen.
Code: Alles auswählen
import pandas as pd
# Daten einlesen
df = pd.read_excel('testdatei.xlsx', engine='openpyxl')
# Schritt 1: Zeilen mit "Wahr" in "isIgnored" entfernen (Hier soll aber nicht entfernt sondern nur ignoriert werden!)
df = df[df['isIgnored'] != "Wahr"]
# Funktion zum Zusammenfassen von Gruppen von Transaktionen
def summarize_group(group):
if len(group) == 1:
return group
first, last = group.iloc[0], group.iloc[-1].copy()
# Anpassung der relevanten Spalten
last['comments'] = f"Transaktionen von {first['timeExecuted']} bis {last['timeExecuted']} (insgesamt {len(group)} zusammengefasst)"
last['comments'] += '+' + '+'.join(group['comments'].dropna())
last['id'] = '+'.join(group['id'].astype(str))
last['txId'] = '+'.join(group['txId'].dropna())
return pd.DataFrame([last])
# Bestimme die Schlüssel für die Gruppierung
group_keys = df['type'].ne(df['type'].shift()).cumsum()
if 'order' in df['type'].values:
group_keys += (df['area'] + df['boughtCurrency'] + df['soldCurrency']).ne((df['location'] + df['boughtCurrency'] + df['soldCurrency']).shift()).cumsum()
result = df.groupby(group_keys).apply(summarize_group).reset_index(drop=True)
# Speichern des bereinigten DataFrames
result.to_excel('bereinigte_testdatei.xlsx', index=False)