问题描述
我有以下代码。但是我在执行时出错。我希望该函数计算计划日期并输出相同的新数据帧。 似乎错误在 for 循环中。我是新手,所以只是想弄清楚
import QuantLib as ql
import pandas as pd
import numpy as np
import datetime
from dateutil.parser import parse
data = pd.read_excel (r'C:\Users\Avishen\Desktop\Python\BONDDATA.xlsx')
for ISIN,issuedate,maturitydate in data:
issueDate = ql.Date(issuedate,'%d-%m-%Y')
maturityDate = ql.Date(maturitydate,'%d-%m-%Y')
tenor = ql.Period(ql.Semiannual)
day_count = ql.Thirty360
calendar = ql.UnitedStates()
businessConvention = ql.Unadjusted
dateGeneration = ql.DateGeneration.Backward
monthEnd = False
# Dates in Bond Period
df['Test']= df['t'].apply(ISIN)
df['Test']= df['t1'].apply(ql.Schedule (issueDate,maturityDate,tenor,calendar,businessConvention,dateGeneration,monthEnd))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-14-b6dc0a0bd926> in <module>
8
9
---> 10 for ISIN,maturitydate in data:
11 issueDate = ql.Date(issuedate,'%d-%m-%Y')
12 maturityDate = ql.Date(maturitydate,'%d-%m-%Y')
ValueError: too many values to unpack (expected 3)
期望输出
t t1
Test1 Date(22,10,2019)
Test1 Date(8,2,2020)
Test1 Date(8,8,2021)
Test1 Date(8,2022)
Test1 Date(8,2023)
Test1 Date(8,2023)
Test2 Date(31,7,2020)
Test2 Date(21,9,3,2021)
Test2 Date(21,2022)
Test2 Date(21,2023)
Test2 Date(21,2024)
Test2 Date(21,2025)
解决方法
我假设您想要做的是逐行修改数据框(如果还有更多可能有更好的解决方案):
df['new_issueDate'] = df['issuedate'].apply(lambda row: ql.Date(row,'%d-%m-%Y')
df['new_maturityDate'] = df['maturityDate'].apply(lambda row: ql.Date(row,'%d-%m-%Y')
编辑:您只想遍历行:
t_list = []
t1_list = []
for _,row in data.iterrows():
issueDate = ql.Date(row['issuedate'],'%d-%m-%Y')
maturityDate = ql.Date(row['maturitydate'],'%d-%m-%Y')
tenor = ql.Period(ql.Semiannual)
day_count = ql.Thirty360
calendar = ql.UnitedStates()
businessConvention = ql.Unadjusted
dateGeneration = ql.DateGeneration.Backward
monthEnd = False
t_list.append(row['ISIN'])
t1_list.append(ql.Schedule(issueDate,maturityDate,tenor,calendar,businessConvention,dateGeneration,monthEnd))
new_df = pd.DataFrame({'t':t_list,'t1':t1_list})
还有其他方法可以逐行附加到数据帧,但这种方式也很好。