Obsthandel simulieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Ottili
User
Beiträge: 3
Registriert: Montag 24. Januar 2022, 18:26

Hallo Zusammen,

ich hoffe ich bin hier im richtigen Unterforum gelandet und ihr könnt mir hier weiterhelfen.
Ich bin noch recht unerfahren was Python angeht und möchte folgendes Problem lösen:

Ich habe eine csv/txt mit mehreren Spalten. In der einen Spalten ungefähr so:

Art Menge Preis (Zeit des Geschäfts)

Ich möchte nun eine Art Handel simulieren: Also zB habe ich unter "Art" Orangen, Äpfel und Birnen zu unterschiedlichen Mengen (also Händler 1 bietet 10 Orangen zu je 5 Euro, Händler 2 20 zu 3 Euro). Ich selbst kann Orangen zu 4 Euro/Stück produzieren.
Jetzt habe ich es bereits fertig gebracht die Tabelle so zu sortieren, dass ich nur noch Orangen drinstehen habe mit ihren jeweiligen Preisen und Mengen und möchte nun chronologisch folgendes tun: Ich möchte vom Prinzip mit 50 Orangen hin und her handeln. Also ich Möchte die Tabelle von oben nach unten durchsuchen und sobald der Preis entweder 4 Euro+x überschritten wird Orangen verkaufen oder bei 4 Euro - z Orangen zukaufen. Aber eben maximal 50 Stück, sobald ich auch nur eine Orange gekauft habe kann die wieder auf die Verkaufsseite.
Jetzt müsste hierfür ersteinmal die Tabelle durchsucht werden und die Mengen mit den jeweiligen Preisen verrechnet werden, bis maximal 50 zusammengekommen sind oder der Preis wieder unter die Grenze fällt.

Ich hoffe ich konnte mein Problem vernünftig erläutern. Die Schleife, die ich für die Summierung gebaut habe zählt leider nur durch und verrechnet lediglich den letzten Mengenwert mit seinem Preis.

Vielen Dank schonmal im Voraus! :)
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du schon Code hast, der das Problem zeigt, dann poste ihn hier.

Generell gilt, ein so komplexes Problem in Teilprobleme zu zerlegen und die weiter zu teilen, bis die Lösung trivial ist, und man das als Funktionen implementieren kann.
Wie würden solche Teilaufgaben bei Dir aussehen?
Ottili
User
Beiträge: 3
Registriert: Montag 24. Januar 2022, 18:26

i=3
m=2

Mengen=neu.MENGE
Preis=neu.PREIS

Summe_Mengen=0
Preis_gesamt=0
Summe_Mengen2=0

for j in range (0,len(Mengen)):
if Summe_Mengen<=(50-Mengen[j]) & Preis[j] >=4+i:
Summe_Mengen+=Mengen[j]*Preis[j]



Mein Problem hierbei ist jetzt, dass die Schleife zwar den Wert der Tabelle nimmt, ab dem die Summe der Mengen größer als 50 wird, aber dann auch nur die Menge und den Preis dieser Zeile multipliziert.
Ich weiß nicht genau, wie ich die Mengen und Preise alle bis zu diesem Wert miteinander multipliziere und anschließend aufsummiere, ohne dass die Werte für Preise kleiner 4+i mit eingerechnet werden.

Ich weiß nicht recht, wie ich das an dieser Stelle noch weiter in Teilprobleme zerlegen kann.

Danke schonmal für die Hilfe!
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Zusammengehörige Daten sollten in einem Objekt gespeichert sein, nicht in mehreren unabhängigen Listen.
Dafür bieten sich Klassen an:

Code: Alles auswählen

@dataclass
class ProductItem:
    name: str
    vendor: str
    unit_price: float
    quantity_on_hand: int = 0
Variablennamen werden komplett klein geschrieben. Über einen Index iteriert man nicht.
Was ist `neu` und woher kommt das?
`i` und `m` werden initialisiert aber nicht benutzt.
`&` ist ein binäres UND, bei Bedingungen benutzt man `and`.
Man schreibt keine magischen Zahlenwerte irgendwo in den Code. 50 wäre sowas wie `needed_quantity` und die 4 buy_price_limit.

Wenn ich Dein Problem richtig verstanden habe, wäre eine Funktion `find_cheapest_product` sinnvoll, die aus einer Liste das billigste Produkt findet. Dann kannst Du davon so viel kaufen, wie da ist, und dann nach dem nächst billigsten Anbieter suchen.
Ottili
User
Beiträge: 3
Registriert: Montag 24. Januar 2022, 18:26

Danke schonmal für die Tipps, die Speicherung in einem Objekt probiere ich aus!

Die Variable i wird für eine Bedingung des if Teils genutzt. Bei m sähe das ähnlich aus nur als untere Handelsgrenze. Die beiden Variablen sollen später optimiert werden, deshalb hatte ich sie erstmal so eingesetzt.
"neu" ist die Tabelle, die ich neu geschrieben habe aus der Ursprünglichen txt, in der jetzt nur noch die Orangen stehen. Ich wusste mir an der Stelle nicht anders zu helfen um fortlaufende Zeilennummerierungen zu haben.

Eine Funktion "find_cheapest_product" wäre nicht zielführend. Ich muss in jedem Fall die Tabelle chronologisch durchlaufen und immer dann handeln, wenn der Preis über bzw. unter meiner Grenze ist.
Falls das noch hilfreich ist: es gibt einen Zeitstempel, der jeder Zeile zugeordnet ist.
Antworten