Berechnung nach Erreichung von 0 stoppen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

Hallo Zusammen,

ich habe mal eine Frage zu einem Script einer Übungsaufgabe,
über dessen Ziel ich bereits weit hinaus schieße. Eigentlich
ging es nur um die Berechnung eines Versicherungvertrags.

Ich wollte es nun etwas ausbauen, so dass es die Monate zählt,
so lange der Vertrag läuft / bzw. noch eine Summe offen ist.

Folgender Code macht schon fast, was ich möchte. Er zählt pro
Jahre die Monate runter und berechnet die offene Summe und die
Zinsrate :

Code: Alles auswählen

import time

versicherung_summe = 1000.0
versicherung_zins_rate = 0.05
monatliche_rate = 100.0
bezahlter_betrag = 0
versicherung_anfang = "01.01.2021"
versicherung_ende = "01.05.2022"

print("Berechnung :", versicherung_summe)

monate = {
    1: "Januar",
    2: "Februar",
    3: "März",
    4: "April",
    5: "Mai",
    6: "Juni",
    7: "Juli",
    8: "August",
    9: "September",
    10: "Oktober",
    11: "November",
    12: "Dezember",
}

versicherung_jahr_anfang = time.strptime(versicherung_anfang, "%d.%m.%Y").tm_year
versicherung_jahr_ende = time.strptime(versicherung_ende, "%d.%m.%Y").tm_year

for jahr in range(versicherung_jahr_anfang, versicherung_jahr_ende + 1):
    print("Berechnung für Jahr :", jahr)

    for m in monate:
        print(monate[m], jahr)
        versicherung_summe = (versicherung_summe * (1 + versicherung_zins_rate / 12) - monatliche_rate)
        print("Summe :", versicherung_summe)
        print("Zins  :", versicherung_summe * (1 + versicherung_zins_rate / 12) - versicherung_summe)
        bezahlter_betrag = bezahlter_betrag + monatliche_rate
Nun möchte ich realiseren, dass das Skript stoppt sobald,
die Summe im nächsten Monat unter 0 sinken sollte und der
Restwert ausgegeben wird.

Ich habe schon probiert eine while Schleife um die For SChleife zu legen :

Code: Alles auswählen

while versicherung_summe > 0:

    for jahr in range(versicherung_jahr_anfang, versicherung_jahr_ende + 1):
        print("Berechnung für Jahr :", jahr)
 ... 
Leider bringt dies nicht den gewünschten Effekt. Ich habe verschiedenes probiert,
finde aber den Ansatz leider nicht. Newbie halt.

Könnt ihr mir helfen ?

VG
YAPD
-----
Yet Another Python Developer
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt selbst etwas zu programmieren, was Monate zählt, benutzt man am besten etwas, das es schon gibt:

Code: Alles auswählen

import datetime
from dateutil import rrule

versicherung_summe = 1000.0
versicherung_zins_rate = 0.05
monatliche_rate = 100.0
bezahlter_betrag = 0
versicherung_anfang = "01.01.2021"
versicherung_ende = "01.05.2022"

print("Berechnung :", versicherung_summe)
for date in rrule.rrule(freq=rrule.MONTHLY,
        dtstart=datetime.datetime.strptime(versicherung_anfang, "%d.%m.%Y"),
        until=datetime.datetime.strptime(versicherung_ende, "%d.%m.%Y")):
    versicherung_summe = (versicherung_summe * (1 + versicherung_zins_rate / 12) - monatliche_rate)
    print("Datum:", date)
    print("Summe :", versicherung_summe)
    print("Zins  :", versicherung_summe * (1 + versicherung_zins_rate / 12) - versicherung_summe)
    bezahlter_betrag = bezahlter_betrag + monatliche_rate
Dann ist das Abbrechen auch ganz einfach:

Code: Alles auswählen

import datetime
from dateutil import rrule

versicherung_summe = 1000.0
versicherung_zins_rate = 0.05
monatliche_rate = 100.0
bezahlter_betrag = 0
versicherung_anfang = "01.01.2021"

print("Berechnung :", versicherung_summe)
for date in rrule.rrule(freq=rrule.MONTHLY,
        dtstart=datetime.datetime.strptime(versicherung_anfang, "%d.%m.%Y")):
    versicherung_summe = (versicherung_summe * (1 + versicherung_zins_rate / 12) - monatliche_rate)
    print("Datum :", date)
    print("Summe :", versicherung_summe)
    print("Zins  :", versicherung_summe * (1 + versicherung_zins_rate / 12) - versicherung_summe)
    bezahlter_betrag = bezahlter_betrag + monatliche_rate
    if versicherung_summe < 0:
        break
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

Hi Sirus,

vielen Dank für deine Antwort. :) Natürlich hast du Recht, dass man vorhandene
Module auch nutzen sollte. Aber könntest du mir rein interessehalber und zu
Lernzwecken vielleicht mitteilen, wie die Lösung ohne "rrule" wäre.

VG
YAPD
-----
Yet Another Python Developer
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Auch nicht viel anders. Man würde sich nur einen Iterator über die Monate selbst bauen.

Code: Alles auswählen

import datetime

def iter_months(date):
    while True:
        yield date
        date = (date + datetime.timedelta(days=31)).replace(day=1)

versicherung_summe = 1000.0
versicherung_zins_rate = 0.05
monatliche_rate = 100.0
bezahlter_betrag = 0
versicherung_anfang = "01.01.2021"

print("Berechnung :", versicherung_summe)
for date in iter_months(datetime.datetime.strptime(versicherung_anfang, "%d.%m.%Y")):
    versicherung_summe = (versicherung_summe * (1 + versicherung_zins_rate / 12) - monatliche_rate)
    print("Datum :", date)
    print("Summe :", versicherung_summe)
    print("Zins  :", versicherung_summe * (1 + versicherung_zins_rate / 12) - versicherung_summe)
    bezahlter_betrag += monatliche_rate
    if versicherung_summe < 0:
        break
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

Sirius3 hat geschrieben: Montag 2. August 2021, 21:39 Auch nicht viel anders. Man würde sich nur einen Iterator über die Monate selbst bauen.

Code: Alles auswählen

import datetime

def iter_months(date):
    while True:
        yield date
        date = (date + datetime.timedelta(days=31)).replace(day=1)

versicherung_summe = 1000.0
versicherung_zins_rate = 0.05
monatliche_rate = 100.0
bezahlter_betrag = 0
versicherung_anfang = "01.01.2021"

print("Berechnung :", versicherung_summe)
for date in iter_months(datetime.datetime.strptime(versicherung_anfang, "%d.%m.%Y")):
    versicherung_summe = (versicherung_summe * (1 + versicherung_zins_rate / 12) - monatliche_rate)
    print("Datum :", date)
    print("Summe :", versicherung_summe)
    print("Zins  :", versicherung_summe * (1 + versicherung_zins_rate / 12) - versicherung_summe)
    bezahlter_betrag += monatliche_rate
    if versicherung_summe < 0:
        break
Ah OK, alles klar, das ist im Prinzip nur, was ich noch wissen wollte.
Ich danke dir !

VG
YAPD
-----
Yet Another Python Developer
Antworten