Hi there…
I am working on a financial anylysis of German so called BWA (business reports made by tax consultants with a tax Software called DATEV) . They are served as table data inside PDFs and have an average Page number of 40 pages.
Here is one example:
I already extracted the table data:, modified the table header (add the dates to the following columns for better understanding for the LLM, cleaned the data frame (deleted NONE Values and empty rows (for smaller in-Token), here is the result) and converted the data into JSON:
[{'Bezeichnung': 'Umsatzerlöse',
  'Mrz/2016': '412575.15',
  'Mrz/2016 % Ges.-Leistg.': '99.95',
  'Jan/2016-Mrz/2016': '1100164.63',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '100.04'},
 {'Bezeichnung': 'Best.Verdg. FE/UE',
  'Mrz/2016': '222.25',
  'Mrz/2016 % Ges.-Leistg.': '0.05',
  'Jan/2016-Mrz/2016': '-450,97',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '-0,04'},
 {'Bezeichnung': 'Akt.Eigenleistungen',
  'Mrz/2016': '0.00',
  'Jan/2016-Mrz/2016': '0.00'},
 {'Bezeichnung': 'Gesamtleistung',
  'Mrz/2016': '412797.40',
  'Mrz/2016 % Ges.-Leistg.': '100.00',
  'Mrz/2016 % Ges.-Kosten': '255.26',
  'Mrz/2016 % Pers.-Kosten': '367.53',
  'Jan/2016-Mrz/2016': '1099713.66',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '100.00',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '203.92',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '302.00'},
 {'Bezeichnung': 'Mat./Wareneinkauf',
  'Mrz/2016': '177825.59',
  'Mrz/2016 % Ges.-Leistg.': '43.08',
  'Mrz/2016 % Ges.-Kosten': '109.96',
  'Mrz/2016 % Pers.-Kosten': '158.33',
  'Mrz/2016 Auf-schlag': '100.00',
  'Jan/2016-Mrz/2016': '503196.62',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '45.76',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '93.31',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '138.19',
  'Jan/2016-Mrz/2016 Auf-schlag': '100.00'},
 {'Bezeichnung': 'Rohertrag',
  'Mrz/2016': '234971.81',
  'Mrz/2016 % Ges.-Leistg.': '56.92',
  'Mrz/2016 % Ges.-Kosten': '145.30',
  'Mrz/2016 % Pers.-Kosten': '209.21',
  'Mrz/2016 Auf-schlag': '132.14',
  'Jan/2016-Mrz/2016': '596517.04',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '54.24',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '110.61',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '163.81',
  'Jan/2016-Mrz/2016 Auf-schlag': '118.55'},
 {'Bezeichnung': 'So. betr. Erlöse',
  'Mrz/2016': '294.12',
  'Mrz/2016 % Ges.-Leistg.': '0.07',
  'Mrz/2016 % Ges.-Kosten': '0.18',
  'Mrz/2016 % Pers.-Kosten': '0.26',
  'Jan/2016-Mrz/2016': '882.36',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '0.08',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '0.16',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '0.24'},
 {'Bezeichnung': 'Betriebl. Rohertrag',
  'Mrz/2016': '235265.93',
  'Mrz/2016 % Ges.-Leistg.': '56.99',
  'Mrz/2016 % Ges.-Kosten': '145.48',
  'Mrz/2016 % Pers.-Kosten': '209.47',
  'Mrz/2016 Auf-schlag': '132.30',
  'Jan/2016-Mrz/2016': '597399.40',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '54.32',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '110.78',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '164.06',
  'Jan/2016-Mrz/2016 Auf-schlag': '118.72'},
 {'Bezeichnung': 'Kostenarten:'},
 {'Bezeichnung': 'Personalkosten',
  'Mrz/2016': '112316.53',
  'Mrz/2016 % Ges.-Leistg.': '27.21',
  'Mrz/2016 % Ges.-Kosten': '69.45',
  'Mrz/2016 % Pers.-Kosten': '100.00',
  'Jan/2016-Mrz/2016': '364141.58',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '33.11',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '67.52',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '100.00'},
 {'Bezeichnung': 'Raumkosten',
  'Mrz/2016': '15414.89',
  'Mrz/2016 % Ges.-Leistg.': '3.73',
  'Mrz/2016 % Ges.-Kosten': '9.53',
  'Mrz/2016 % Pers.-Kosten': '13.72',
  'Jan/2016-Mrz/2016': '46826.52',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '4.26',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '8.68',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '12.86'},
 {'Bezeichnung': 'Betriebl. Steuern',
  'Mrz/2016': '568.00',
  'Mrz/2016 % Ges.-Leistg.': '0.14',
  'Mrz/2016 % Ges.-Kosten': '0.35',
  'Mrz/2016 % Pers.-Kosten': '0.51',
  'Jan/2016-Mrz/2016': '2110.00',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '0.19',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '0.39',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '0.58'},
 {'Bezeichnung': 'Versich./Beiträge',
  'Mrz/2016': '2371.52',
  'Mrz/2016 % Ges.-Leistg.': '0.57',
  'Mrz/2016 % Ges.-Kosten': '1.47',
  'Mrz/2016 % Pers.-Kosten': '2.11',
  'Jan/2016-Mrz/2016': '14418.78',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '1.31',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '2.67',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '3.96'},
 {'Bezeichnung': 'Besondere Kosten',
  'Mrz/2016': '0.00',
  'Jan/2016-Mrz/2016': '0.00'},
 {'Bezeichnung': 'Kfz-Kosten (o. St.)',
  'Mrz/2016': '7168.00',
  'Mrz/2016 % Ges.-Leistg.': '1.74',
  'Mrz/2016 % Ges.-Kosten': '4.43',
  'Mrz/2016 % Pers.-Kosten': '6.38',
  'Jan/2016-Mrz/2016': '32046.92',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '2.91',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '5.94',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '8.80'},
 {'Bezeichnung': 'Werbe-/Reisekosten',
  'Mrz/2016': '4497.19',
  'Mrz/2016 % Ges.-Leistg.': '1.09',
  'Mrz/2016 % Ges.-Kosten': '2.78',
  'Mrz/2016 % Pers.-Kosten': '4.00',
  'Jan/2016-Mrz/2016': '11915.39',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '1.08',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '2.21',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '3.27'},
 {'Bezeichnung': 'Kosten Warenabgabe',
  'Mrz/2016': '1422.70',
  'Mrz/2016 % Ges.-Leistg.': '0.34',
  'Mrz/2016 % Ges.-Kosten': '0.88',
  'Mrz/2016 % Pers.-Kosten': '1.27',
  'Jan/2016-Mrz/2016': '4562.58',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '0.41',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '0.85',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '1.25'},
 {'Bezeichnung': 'Abschreibungen',
  'Mrz/2016': '6124.62',
  'Mrz/2016 % Ges.-Leistg.': '1.48',
  'Mrz/2016 % Ges.-Kosten': '3.79',
  'Mrz/2016 % Pers.-Kosten': '5.45',
  'Jan/2016-Mrz/2016': '18998.51',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '1.73',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '3.52',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '5.22'},
 {'Bezeichnung': 'Reparatur/Instandh.',
  'Mrz/2016': '0.00',
  'Jan/2016-Mrz/2016': '7647.13',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '0.70',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '1.42',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '2.10'},
 {'Bezeichnung': 'Sonstige Kosten',
  'Mrz/2016': '11835.35',
  'Mrz/2016 % Ges.-Leistg.': '2.87',
  'Mrz/2016 % Ges.-Kosten': '7.32',
  'Mrz/2016 % Pers.-Kosten': '10.54',
  'Jan/2016-Mrz/2016': '36612.01',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '3.33',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '6.79',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '10.05'},
 {'Bezeichnung': 'Gesamtkosten',
  'Mrz/2016': '161718.80',
  'Mrz/2016 % Ges.-Leistg.': '39.18',
  'Mrz/2016 % Ges.-Kosten': '100.00',
  'Mrz/2016 % Pers.-Kosten': '143.98',
  'Jan/2016-Mrz/2016': '539279.42',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '49.04',
  'Jan/2016-Mrz/2016 % Ges.-Kosten': '100.00',
  'Jan/2016-Mrz/2016 % Pers.-Kosten': '148.10'},
 {'Bezeichnung': 'Betriebsergebnis',
  'Mrz/2016': '73547.13',
  'Mrz/2016 % Ges.-Leistg.': '17.82',
  'Jan/2016-Mrz/2016': '58119.98',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '5.29'},
 {'Bezeichnung': 'Zinsaufwand',
  'Mrz/2016': '7962.48',
  'Mrz/2016 % Ges.-Leistg.': '1.93',
  'Jan/2016-Mrz/2016': '11853.12',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '1.08'},
 {'Bezeichnung': 'Sonst. neutr. Aufw',
  'Mrz/2016': '0.00',
  'Jan/2016-Mrz/2016': '400.00',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '0.04'},
 {'Bezeichnung': 'Neutraler Aufwand',
  'Mrz/2016': '7962.48',
  'Mrz/2016 % Ges.-Leistg.': '1.93',
  'Jan/2016-Mrz/2016': '12253.12',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '1.11'},
 {'Bezeichnung': 'Zinserträge',
  'Mrz/2016': '61.51',
  'Mrz/2016 % Ges.-Leistg.': '0.01',
  'Jan/2016-Mrz/2016': '61.51',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '0.01'},
 {'Bezeichnung': 'Sonst. neutr. Ertr',
  'Mrz/2016': '0.00',
  'Jan/2016-Mrz/2016': '0.00'},
 {'Bezeichnung': 'Verr. kalk. Kosten',
  'Mrz/2016': '0.00',
  'Jan/2016-Mrz/2016': '0.00'},
 {'Bezeichnung': 'Neutraler Ertrag',
  'Mrz/2016': '61.51',
  'Mrz/2016 % Ges.-Leistg.': '0.01',
  'Jan/2016-Mrz/2016': '61.51',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '0.01'},
 {'Bezeichnung': 'Kontenkl. unbesetzt',
  'Mrz/2016': '0.00',
  'Jan/2016-Mrz/2016': '0.00'},
 {'Bezeichnung': 'Ergebnis vor Steuern',
  'Mrz/2016': '65646.16',
  'Mrz/2016 % Ges.-Leistg.': '15.90',
  'Jan/2016-Mrz/2016': '45928.37',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '4.18'},
 {'Bezeichnung': 'Steuern Eink.u.Ertr',
  'Mrz/2016': '13550.00',
  'Mrz/2016 % Ges.-Leistg.': '3.28',
  'Jan/2016-Mrz/2016': '26910.00',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '2.45'},
 {'Bezeichnung': 'Vorläufiges Ergebnis',
  'Mrz/2016': '52096.16',
  'Mrz/2016 % Ges.-Leistg.': '12.62',
  'Jan/2016-Mrz/2016': '19018.37',
  'Jan/2016-Mrz/2016 % Ges.-Leistg.': '1.73'}
Making a API call looks like that:
from openai import OpenAI
from IPython.display import display
api_key = 'sk-xxx xxx xxx.xxx'
organization = 'org-xxx xxxx xxxx'
client = OpenAI(api_key=api_key, organization=organization)
response = client.chat.completions.create(
  model="gpt-3.5-turbo-1106",
  messages = [
    {
        "role": "system",
# You are a tax consultant who analyzes business evaluations (BWA) for your clients.
        "content": "Du bist  Steuerberater, der betriebswirtschaftliche Auswertungen (BWA) für seine Mandanten analysiert."
    },
    {
        "role": "user",
# Here is the BWA data: {json}
        "content": f"Hier sind die BWA-Daten: {json}"
    },
    {
        "role": "user",
# Analyze the data briefly, concisely and understandably for trends, anomalies, opportunities and risks.
        "content": "Analysiere die Daten kurz, prägnant und verständlich nach Trends, Anomalien, Chancen und Risiken."
    }
],
  temperature=0.8,
  max_tokens=1000,
  top_p=1
)
display(response)
display(response.choices[0].finish_reason)
display(response.choices[0].message.content)
The whole 40 page PDF generates a token length of 57229 Token (and as I told you before, the data has already cleaned up )
So my Questions are:
- What you think about the extraction, data cleaning and converting to JSON (especially the key: value assignment): Is it all done well so far or would you do it differently?
- Now I’m sending the JSON directly to the API which create a lot of tokens, therefore costs. Is the a better way to send this big data to the LLM for Analysis? Maybe as a Assistent? And open up a new assistant for every analysis?


