脚本很好,但不会 运行 作为导入模块
Script is fine, but will not run as imported module
有了这个script/module,XRateDKKUSD_test.py,我可以成功获取丹麦克朗兑美元的汇率。
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
作为浮点数传入:
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'
这里的int
是252
字面量。
有了这个script/module,XRateDKKUSD_test.py,我可以成功获取丹麦克朗兑美元的汇率。
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
作为浮点数传入:
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'
这里的int
是252
字面量。