Soy nuevo en Python, estoy experimentando algún error en el que en una determinada iteración no se asigna una variable declarada fuera de un ciclo solo después de una iteración específica.

La línea 28 en la octava iteración (x == 7) interest está mal calculada (probablemente no asignada o algo así) y sigue siendo el mismo valor para el resto de las iteraciones. El valor de la variable parece atascarse.

import matplotlib.pyplot as plt 
import numpy as np 

loanAmount = 500000.0
interestRate = 3.5
loanTerm = 30.0

monthlyInterest = []
monthlyPrincipal = []
compoundingRate = float((((interestRate / 12) * 0.01) + 1))
loanTermMonths = float(loanTerm * 12)
preInterestMonthly = loanAmount / loanTermMonths
lastMonthWithInt = preInterestMonthly * compoundingRate

i = 1
sum = 0.0
while i < loanTermMonths - 1:
    lastMonthWithInt = lastMonthWithInt * compoundingRate
    sum += lastMonthWithInt
    i += 1

baseMonthly = sum / loanTermMonths

interest = 0.0
principal = 0.0
x = 0
while x < loanTermMonths - 1:
    interest = float((loanAmount - principal) * (compoundingRate - 1))   
    principal = baseMonthly - interest
    monthlyInterest.append(interest)
    monthlyPrincipal.append(principal)
    x += 1

x1 = np.arange(1, loanTermMonths)
y1 = np.array(monthlyInterest)
x2 = np.arange(1, loanTermMonths)
y2 = np.array(monthlyPrincipal)

plt.plot(x1, y1, label = "Interest") 
plt.plot(x2, y2, label = "Principal") 
plt.xlabel('months') 
plt.ylabel('$') 
plt.show()
0
TheWolf 17 oct. 2018 a las 02:21

2 respuestas

La mejor respuesta

Creo que si ingresas la siguiente declaración justo debajo

monthlyPrincipal.append(principal)

loanAmount -= principal,

Entonces obtendrá los resultados que desea.

EDITAR: Solo una sugerencia, para obtener un pago mensual más preciso, obtuve de Wikipedia una fórmula para calcular los pagos mensuales dado el monto inicial del préstamo.

Aquí hay un programa que usa esa fórmula.

import matplotlib.pyplot as plt 
# https://stackoverflow.com/questions/52845238/python-looping-issue-with-variable-not-being-assigned-to-on-certain-iteration
loanAmount = 500000.0
interestRate = 3.5
loanTerm = 30 # 30 years
loanTermMonths = loanTerm * 12 # 360 months

i = interestRate / 12 * .01
n = loanTermMonths

# get cash flows, (monthly payments), for Present Value of loanAmount
# https://en.wikipedia.org/wiki/Present_value
monthlyPayment = loanAmount * i / (1 - (1 + i)**(-n))

principal = loanAmount

monthlyInterest = []
monthlyPrincipal = []

for x in range(loanTermMonths):
    interest = principal * i
    monthlyInterest.append(interest)

    principalPortion = monthlyPayment - interest
    monthlyPrincipal.append(principalPortion)

    principal -= principalPortion

x1 = list(range(1, loanTermMonths+1))
y1 = monthlyInterest
x2 = list(range(1, loanTermMonths+1))
y2 = monthlyPrincipal

plt.plot(x1, y1, label = "Interest") 
plt.plot(x2, y2, label = "Principal")
plt.title('Loan Amortization')
plt.grid(True)
plt.xlabel('months') 
plt.ylabel('$') 
plt.show()

Es más o menos lo mismo que el tuyo, excepto cómo calcula el pago mensual.

1
Chris Charley 27 oct. 2018 a las 00:35

>>> (100.0 - 6.805590751165351) * (1.0029166666666666 - 1)

0.2718170269757688

>>> (100.0 - 6.805590751165351) * (1.0029166666666667 - 1)

0.2718170269757688

Creo que necesitas más precisión

0
tormich 16 oct. 2018 a las 23:51