脚本很好,但不会作为导入的模块运行



使用这个脚本/模块XRateDKKUSD_test.py,我可以成功获取DKK兑美元的汇率。

import pandas as pd
import pandas.io.data as web
import datetime
def xRate_pd(years,modus,start=datetime.datetime(2000,1,1),end=pd.Timestamp.utcnow()):
    global xrate, xratedate, df_xrate
    days = int(252 * years)  # ant. arb. dage pr år = 252
    if modus == 'sim':
        start = datetime.datetime(2014,1,1)  # indstil manuelt
        end   = datetime.datetime(2015,5,18) # indstil manuelt
    if modus == 'trading':
        end   = pd.Timestamp.utcnow()
        start = end - days * pd.tseries.offsets.BDay()
    df_xrate = web.DataReader('DEXDNUS', 'fred',
                       start = start, end = end)
    print('df_xrate n',df_xrate)
    # Selecting only last day from df, saving to xrate, xratedate
    xrate = df_xrate.ix[-1, 'DEXDNUS']
    xratedate = df_xrate.index[-1]
    return xrate, xratedate, df_xrate
if __name__ == '__main__':
#    xrate_lookup()
    xRate_pd(modus='trading',years=0.25)

然而,当我尝试用这个函数从我的主程序运行这个脚本时。。。

def xRate(start, end, years, modus): 
    global xrate, xratedate, df_xrate
    xrate, xratedate, df_xrate = XRateDKKUSD_test.xRate_pd(start, end, modus) 
    return xrate, xratedate, df_xrate

使用此调用运行

import XRateDKKUSD_test
xRate_pd(start, end)

很明显,我已经设置了"开始"&ampend"参数。

当脚本作为模块导入运行时,我突然遇到了这个问题,当脚本独立运行时我不会遇到这个问题:

  File "z:/python/crystallball/git - crystalball/_crystalball_main.py", line 277, in <module>
    xRate_pd(start, end)
  File "Z:/python/CrystallBall/Git - CrystalBall/XRateDKKUSD.py", line 55, in xRate_pd
    days = int(252 * years)
TypeError: unsupported operand type(s) for *: 'int' and 'Timestamp'

有谁知道为什么在导入和运行脚本时会出现这种差异和错误?

您的脚本作为模块导入没有问题。您正在为years参数传入不同类型的对象。

当您从if __name__ == '__main__':保护调用代码时,您将以浮点形式传入years

xRate_pd(modus='trading', years=0.25)

这对你的乘法很有效:

days = int(252 * years)  # ant. arb. dage pr år = 252

但是当您在导入后调用函数时,years是根据变量start:设置的

xRate_pd(start, end)

并且start不是float而是Timestamp实例,如错误消息所证明的:

TypeError: unsupported operand type(s) for *: 'int' and 'Timestamp'

这里的int252文字。

最新更新