Seite 1 von 1

Berechnung nach Erreichung von 0 stoppen

Verfasst: Montag 2. August 2021, 21:05
von YAPD
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

Re: Berechnung nach Erreichung von 0 stoppen

Verfasst: Montag 2. August 2021, 21:23
von Sirius3
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

Re: Berechnung nach Erreichung von 0 stoppen

Verfasst: Montag 2. August 2021, 21:29
von YAPD
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

Re: Berechnung nach Erreichung von 0 stoppen

Verfasst: Montag 2. August 2021, 21:39
von Sirius3
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

Re: Berechnung nach Erreichung von 0 stoppen

Verfasst: Montag 2. August 2021, 21:45
von YAPD
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