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

标签 python python-3.x pandas currency-exchange-rates

使用此脚本/模块 XRateDKKUSD_test.py,我可以成功获取 DKK 与 USD 的汇率。

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)

显然我已经在前面的函数中设置了“start”和“end”参数。

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

  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 作为 float 传递:

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文字。

关于python - 脚本很好,但不会作为导入的模块运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33694602/

相关文章:

python - 使用 pandas matplotlib 在 x 轴上显示文本描述而不是数字

python - 日期时间.strptime (‘2017-01-12T14:12:06.000-0500’ ,'%Y-%m-%dT%H:%M:%S.%f%Z' )

python-3.x - 如何将数据集 (CSV) 拆分为训练数据和测试数据

python - TypeError : list indices must be integers or slices, 不是电影评级数据的元组

python - 如何在pandas中使用group by复制行

python - 如何比较两个 Pandas DataFrame 并显示 DataFrame 2 中的差异

Python Pandas NLTK 标记 Pandas 数据帧中的列 : expected string or bytes-like object

python - 在 Python 中计算来自不同数组的所有可能组合

python - 类型错误 : 'Food' object does not support indexing

python - turtle 对按键没有反应