我的任务是计算累积本金。使用numpy.ppmt只能给出特定月份的有偿本金,因此我想添加包含每个记录的每月本金的列,然后取总和来获得累积本金。
例如,我有一个如下数据框:
> map head list
[1,4,7]
> map tail list
[[2,3],[5,6],[8,9]]
> let foo xs = if null (head xs) then [] else map head xs : foo (map tail xs)
> foo list
[[1,4,7],[2,5,8],[3,6,9]]
数据框将如下所示:
frame = pd.DataFrame({'rate':[0.1, 0.1], 'per':[2, 4], 'nper':[360, 360], 'pv':[100000, 200000]})
max_per = frame['per'].max()
columns = ['principal%s'%i for i in range(1, max_per + 1)]
df = pd.DataFrame(index=frame.index, columns=columns, dtype='float').fillna(0)
for index, column in enumerate(columns):
df[column] = -np.ppmt(rate=frame['rate'] / 100 / 12, per=index + 1, nper=frame['nper'],
pv=frame['pv'], when=when)
frame.join(df)
问题在于,对于记录1,principal3和principal4应该为0。一种解决方法是基于列“ per”来计算principal1-principal4的总和,例如,如果frame.per == 2,则我仅求和principal1和principal 2,如果frame.per == 4,那么我只将principal1到principal4求和。任何帮助做到这一点。
我可以通过调用apply来计算累计本金,但是我不想这样做,因为它很慢。
谢谢。
答案 0 :(得分:2)
通过布尔掩码在0
之前将join
设置为per
,然后通过布尔掩码将2d numpy array
的列长度与#subtract 1 because python counts from 0
mask = np.arange(len(df.columns)) > frame['per'].values[:, None] - 1
df = frame.join(df.mask(mask, 0))
print(df)
rate per nper pv principal1 principal2 principal3 principal4
0 0.1 2 360 100000 273.643517 273.666321 0.000000 0.000000
1 0.1 4 360 200000 547.287034 547.332642 547.378253 547.423868
列进行比较:< / p>
mask = np.arange(len(df.columns)) > frame['per'].values[:, None] - 1
df[:] = np.where(mask, 0, df)
df = frame.join(df)
print(df)
rate per nper pv principal1 principal2 principal3 principal4
0 0.1 2 360 100000 273.643517 273.666321 0.000000 0.000000
1 0.1 4 360 200000 547.287034 547.332642 547.378253 547.423868
使用mask
的另一种解决方案:
Sub Calc_DoC()
Range("C6:N6").Formula = "=(C5/average(c2:e2))*30"
End Sub