为了账号安全,请及时绑定邮箱和手机立即绑定

债券息票贴现的循环

债券息票贴现的循环

Go
BIG阳 2022-08-25 14:09:49
关于如何编写一个for循环给我所有优惠券的现值(即折扣值)的快速问题。我的代码如下所示:我想要一个 for-loop 来执行该操作c[0]*np.exp(-r*1)c[1]*np.exp(-r*2)c[2]*np.exp(-r*3) ,依此类推(数乘以 -r 始终是索引 +1)。我想要所有值的总和,例如使用x +=for循环迭代c=[7.5, 7.5, 7.5, 7.5, 7.5, 7.5, 7.5]r=0.071PVx=0 for i in c:    print(i)    year = c.index(i)+1    print(year)    PV=c[i]*np.exp(-r*year)    PVx += PV     print(PVx)不知何故,我收到了我的PV变量的错误代码“TypeError:列表索引必须是整数或切片,而不是浮点数”。从本质上讲,我希望将列表中的每个值乘以np.exp(-r*索引位置+1),然后得到总和:S编辑:我的新代码import numpy as npc=[7.5, 7.5, 7.5, 7.5, 7.5, 7.5, 7.5]r=0.071PVx=0 for i in c:    year = c.index(i)+1    print(year)    PV=i*np.exp(-r*year)    PVx += PV    print(PVx)继续将年份打印为1(意味着c.index(i)产生0 + 1 = 1),而我希望它从1到7。我想我现在的问题。
查看完整描述

2 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

我的新代码[...]继续将年份打印为1(意味着c.index(i)产生0 + 1 = 1),而我希望它从1到7。


list.index(i)返回出现的第一个索引,如果不在列表中,则返回 -1。ii


NumPy 解决方案:


import numpy as np


r = 0.071


arr_1 = np.full(shape=7, fill_value=7.5)

print(arr_1)


arr_2 = np.exp(-r * np.arange(1, arr_1.shape[0] + 1))

print(arr_2)


arr_3 = arr_1 * arr_2

print(arr_3)

print(arr_3.sum())

输出:


[7.5 7.5 7.5 7.5 7.5 7.5 7.5]

[0.93146189 0.86762126 0.80815614 0.75276664 0.70117344 0.65311634

 0.60835298]

[6.98596419 6.50715942 6.06117103 5.64574984 5.25880082 4.89837257

 4.56264738]

39.919865247574606

循环解决方案:


import math

from pprint import pprint


r = 0.071


vals = [7.5 * math.exp(-r * i) for i in range(1, 8)]


pprint(vals)

pprint(sum(vals))

输出:


[6.985964190956941,

 6.507159423644355,

 6.0611710291236625,

 5.645749835296472,

 5.258800824064293,

 4.898372565905067,

 4.562647378583822]

39.919865247574606

我不完全确定我是否理解你想做什么,所以如果我错过了什么,请告诉我。


查看完整回答
反对 回复 2022-08-25
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

错误解释了这个问题:“”浮点是一个带有小数的数字,即不是整数。对于 exampe 7.5.那是你的问题。TypeError: list indices must be integers or slices, not float



查看完整回答
反对 回复 2022-08-25
  • 2 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信