将输入指定为类

时间:2017-03-31 17:26:50

标签: excel-vba python-3.x class xlwings vba

我正在尝试使用xlwing模块将Excel中的数据(即期费率和成熟度)输入到python代码中。

在我的python文件(pythonLearn.py)中,我有以下几行

import os
import numbers
import xlwings as xw
import datetime as dt
import numpy as np
import YieldCurve as yc


@xw.func
def py_Rate(T, spot_rate):
    yc.add_spot_rate(T, spot_rate)

在我的类模块文件(YieldCurve.py)中,我有以下代码

import math

class ForwardRates(object): # create a bootstrap yieldcurve

    def __init__(self):
        self.forward_rates = []
        self.spot_rates = dict()

    def add_spot_rate(self, T, spot_rate):
        self.spot_rates[T] = spot_rate

    def __calculate_forward_rate___(self, T1, T2):
        R1 = self.spot_rates[T1]
        R2 = self.spot_rates[T2]
        forward_rate = (R2*T2 - R1*T1)/(T2 - T1)
        return forward_rate

    def get_forward_rates(self):
        periods = sorted(self.spot_rates.keys())
        for T2, T1 in zip(periods, periods[1:]):
            forward_rate = self.__calculate_forward_rate___(T1, T2)
            self.forward_rates.append(forward_rate)
        return self.forward_rates

当我尝试使用命令添加点率(在Excel中)时,'= py_Rate(1.0,10.5);我收到以下错误

AttributeError:'module'对象没有属性'add_spot_rate'fr.add_spot_rate(T,spot_rate)文件“c:\ users \ admin \ documents \ pythonlearning \ pythonLearningExcel5.py”,第155行,py_Rate ret = func( * args)文件“C:\ Python34 \ lib \ site-ckages \ xlwings \ udfs.py”,ine 250,在call_udf中res = call_udf(脚本,fname,args,this_workbook,FromVariant(调用者))文件“C:\ Python34 \ lib \ site-packages \ xlwings \ server.py“,第190行,在CallUDF中返回func(* args)文件”C:\ Python34 \ lib \ site-packages \ win32com \ server \ policy.py“,第586行,在 invokeex 中返回S_OK,-1,self。 invokeex (dispid,lcid,wFlags,args,None,None)文件“C:\ Python34 \ lib \ site- packages \ win32com \ server \ policy.py“,第283行,在调用中返回self。调用(dispid,lcid,wFlags,args)文件”C:\ Python34 \ lib \ site-packages \ win32com \ server \ policy.py“,第278行,调用

任何xlwings / python(3.4是我的版本,顺便说一句)谁可以提供帮助?

亲切的问候

1 个答案:

答案 0 :(得分:0)

从专家那里找到,我在这里提交了有效的解决方案。 显然,人们不能直接使用类方法,你需要做这样的事情:

import xlwings as xw
import numpy as np
import yieldCurve as fr

@xw.func
def py_Rate(T, spotRate):
    fwd_rate = fr.ForwardRates()
    fwd_rate.add_spot_rate(T, spotRate)