当前位置:  开发笔记 > 编程语言 > 正文

在Python或SQL中使用像解算器一样的Excel

如何解决《在Python或SQL中使用像解算器一样的Excel》经验,为你挑选了3个好方法。

这是我在Excel中执行的简单计算.我想知道它是否可以用python或任何其他语言完成.

Loan amount 7692
Period : 12 months
Rate of interest 18 Per Annum
The formula in the B2 cell is =A1*18/100/12
The formula in the A2 cells is =A1+B2-C2

C列是借款人每月可能需要偿还的暂定金额.C2旁边的所有其他单元格只指向200的第一部分.使用如下图所示的求解器后,我在C列中得到正确的705.20部分.

excel目标seak

我想知道是否可以使用任何脚本语言(如python(或SQL))完成此计算

以下是最终版本的样子......

在此输入图像描述

我试过这样的东西,但它不会退出循环并打印所有组合.

loan_amount= 7692
interest = 18
months =12

for rg in range(700, 710):
    for i in range(months):
        x = loan_amount * interest / 100 / 12
        y = loan_amount + x - rg
        if x < 0: 
            print rg, i
            exit
        else:
            loan_amount = y

Vladimir Bar.. 7

好吧,你可以用数值方法解决它(就像Excel那样),你可以通过在某个范围内检查每个量的一些步骤来强力解决它,或者你可以在一张纸上解析它.

使用以下表示法

L - initial loan amount = 7692
R - monthly interest rate = 1 + 0.18/12
m - number of months to repay the loan = 12
P - monthly payment to pay the loan in full after m months = unknown

L_ {N}n第一个月后的贷款额.L_ {0} 是初始贷款额(7692). L_ {M}m月(0)后的贷款额.

n第 - 和(n-1)第 - 月之间的主要关系是:

L_ {n} = L_ {n-1}*R  -  P.

所以,分析公式结果是:

P = L*\frac {R ^ {m}} {\ sum_ {k = 0} ^ {m-1} R ^ {k}} = L*R ^ {m}*\frac {R-1} { R 2 {M} -1}

现在用任何编程语言计算它都应该是相当简单的.

对于给定的初始参数

R = 1 +\frac {0.18} {12} = 1.015

P = 7692*1.015 ^ {12}*\frac {1.015-1} {1.015 ^ {12} -1} \约705.2025054


顺便说一下,如果你正在模拟真实银行的运作方式,那么将其正确计算到最后一分可能会很棘手.

您从上述精确分析公式中得到的答案只是近似值.

实际上,所有月度金额(包括付款和利息)通常都是四分之一.每个月都会出现一些舍入错误,这会导致累积和增长.

除了这些舍入错误之外,不同的月份具有不同的天数,即使每个月的付款相同,通常也会计算每月的每一天的利息,因此每月都会有所不同.然后有额外一天的闰年,这也影响了每月的兴趣.



1> Vladimir Bar..:

好吧,你可以用数值方法解决它(就像Excel那样),你可以通过在某个范围内检查每个量的一些步骤来强力解决它,或者你可以在一张纸上解析它.

使用以下表示法

L - initial loan amount = 7692
R - monthly interest rate = 1 + 0.18/12
m - number of months to repay the loan = 12
P - monthly payment to pay the loan in full after m months = unknown

L_ {N}n第一个月后的贷款额.L_ {0} 是初始贷款额(7692). L_ {M}m月(0)后的贷款额.

n第 - 和(n-1)第 - 月之间的主要关系是:

L_ {n} = L_ {n-1}*R  -  P.

所以,分析公式结果是:

P = L*\frac {R ^ {m}} {\ sum_ {k = 0} ^ {m-1} R ^ {k}} = L*R ^ {m}*\frac {R-1} { R 2 {M} -1}

现在用任何编程语言计算它都应该是相当简单的.

对于给定的初始参数

R = 1 +\frac {0.18} {12} = 1.015

P = 7692*1.015 ^ {12}*\frac {1.015-1} {1.015 ^ {12} -1} \约705.2025054


顺便说一下,如果你正在模拟真实银行的运作方式,那么将其正确计算到最后一分可能会很棘手.

您从上述精确分析公式中得到的答案只是近似值.

实际上,所有月度金额(包括付款和利息)通常都是四分之一.每个月都会出现一些舍入错误,这会导致累积和增长.

除了这些舍入错误之外,不同的月份具有不同的天数,即使每个月的付款相同,通常也会计算每月的每一天的利息,因此每月都会有所不同.然后有额外一天的闰年,这也影响了每月的兴趣.



2> MaxU..:

码:

from __future__ import print_function

"""
Formulas: http://mathforum.org/dr.math/faq/faq.interest.html
"""

def annuity_monthly_payment(P, n, q, i, debug = False):
    """
    Calculates fixed monthly annuity payment
    P   - amount of the Principal 
    n   - Number of years
    q   - the number of times per year that the interest is compounded
    i   - yearly rate of interest (for example: 0.04 for 4% interest)
    """
    if debug:
        print('P = %s\t(amount of the Principal)' %P)
        print('n = %s\t\t(# of years)' %n)
        print('q = %s\t\t(# of periods per year)' %q)
        print('i = %s %%\t(Annual interest)' %(i*100))
    return P*i/( q*(1 - pow(1 + i/q, -n*q)) )


### Given :
P = 7692
n = 1
q = 12
i = 18/100

print('M = %s' %annuity_monthly_payment(P=P, n=n, q=q, i=i, debug=True))

输出:

P = 7692        (amount of the Principal)
n = 1           (# of years)
q = 12          (# of periods per year)
i = 18.0 %      (Annual interest)
M = 705.2025054347173



3> floydn..:

我认为这些表格/矢量/矩阵类型分析非常适合numpy和pandas.您经常可以编写更易于阅读的紧凑代码.看看你是否同意.

import numpy as np
import pandas as pd

def mpmt(amt, i, nper):
    """
    Calculate the monthly payments on a loan/mortgage
    """
    i = i/12  # convert to monthly interest
    i1 = i + 1  # used multiple times in formula below
    return amt*i1**nper*i/(i1**nper-1)

def ipmt(amt, i, per, nper):
    """
    Calculate interest paid in a specific period, per, of a loan/mortgage
    """
    i = i/12  # convert to monthly interest
    i1 = i + 1  # used multiple times in formula below
    return (amt*i*(i1**(nper+1)-i1**per))/(i1*(i1**nper-1))

def amorttable(amt, i, nper):
    """
    Create an amortization table for a loan/mortgage
    """
    monthlypmt = mpmt(amt, i, nper)

    # the following calculations are vectorized
    df = pd.DataFrame({'month':np.arange(1, nper+1)})
    df['intpaid'] = ipmt(amt, i, df['month'], nper)
    df['prinpaid'] = monthlypmt - df['intpaid']
    df['balance'] = amt
    df['balance'] -= np.cumsum(df['prinpaid'])
    return df


print(amorttable(7692, .18, 12).round(2))

这是结果:

    month  intpaid  prinpaid  balance
0       1   115.38    589.82  7102.18
1       2   106.53    598.67  6503.51
2       3    97.55    607.65  5895.86
3       4    88.44    616.76  5279.09
4       5    79.19    626.02  4653.08
5       6    69.80    635.41  4017.67
6       7    60.27    644.94  3372.73
7       8    50.59    654.61  2718.12
8       9    40.77    664.43  2053.69
9      10    30.81    674.40  1379.29
10     11    20.69    684.51   694.78
11     12    10.42    694.78    -0.00

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有