Python 带有web2py和numpy的类型错误消息
这里有点困惑。我有一些直接运行良好的代码:Python 带有web2py和numpy的类型错误消息,python,numpy,web2py,Python,Numpy,Web2py,这里有点困惑。我有一些直接运行良好的代码: results = INPUT dates = set(results[0]) sectors = set(results[2]) columns = ["Port Wt", "Bench Wt", "Port Retn", "Bench Retn", "Attrib", "Select", "Inter", "Total"] results.fillna(0,inplace=True) sectors = sorted(sectors) test
results = INPUT
dates = set(results[0])
sectors = set(results[2])
columns = ["Port Wt", "Bench Wt", "Port Retn", "Bench Retn", "Attrib", "Select", "Inter", "Total"]
results.fillna(0,inplace=True)
sectors = sorted(sectors)
test = np.ones([len(sectors) + 1, len(columns)])
for date in dates:
day = results[results[0] == date]
for n, sector in enumerate(sectors):
s = day[day[2] == unicode(sector)]
pw = s.iloc[:,4].sum()
bw = s.iloc[:,6].sum()
pr = s.apply(lambda x: x.ix[5]/100 * x.ix[4], axis=1).sum().sum()
br = s.apply(lambda x: x.ix[5]/100 * x.ix[6], axis=1).sum().sum()
test[n,:] *= [(1. + pw)**(1./len(dates)), (1.+bw) ** (1./len(dates)), 1. + pr , 1. + br , 1. ,
1. , 1. , 1.]
test -= 1.
但当我在web2py控制器中运行它时
def test():
portfolio = "usequity"
benchmark = "SP500"
startdate = "2013-01-11 00:00:00"
enddate = "2013-01-30 00:00:00"
level1 = 'sector'
level2 = 'industry'
i1 = datadrawn.results(portfolio,benchmark,startdate,enddate,level1,level2,cr)
i2 = datadrawn.sectors(i1['portfolio'], i1['benchmark'])
i3 = datadrawn.brinson(i2)
return dict(i3=i3)
我得到了错误
<type 'exceptions.TypeError'>(unsupported operand type(s) for *=: 'numpy.ndarray' and 'list')
一些研究表明,这可能是数组输入错误,但据我所知,我已将所有内容都转换回float
非常感谢您的帮助。根据您的分享,不清楚您是否在web2py内外运行相同的代码(即web2py代码如何调用第一个代码块?)。另外,在第一段代码中,看起来您在
*=
的左侧有一个数据数组,在右侧有一个列表——如果*=
不支持这两种类型,那么这应该会失败。您好@Anthony,为过于简洁表示歉意。web2py将第一个块作为模块导入调用。它是名为datadraw
的模块中的方法之一。当直接在模块中运行时,这肯定会起作用,因此我非常确信numpy方面可以工作……很清楚,第一个代码块是datadraw.results
方法定义的一部分?在这种情况下,第一步是确认web2py使用与外部运行该方法时完全相同的参数(和参数类型)调用该方法。关于这个错误,您是说TypeError在某种程度上是错误的,*=
实际上应该支持一个ndarray和一个列表,还是说代码实际上不包括一个ndarray和一个列表?Hi@Anthony。是,第一个代码块是datadraw.results的一部分。我刚刚尝试过将np.array([1,2,3,4],dtype='d')*=[1,2,3,1]
相乘,结果成功了,所以我猜类型错误不会像一个小问题那样有意义。您应该尝试使用web2py中的确切参数调用datadraw.results
方法,以查看是否出现相同的错误(看起来所有参数都只是固定字符串,除了cr
,它没有出现在您显示的代码中)。
locals request session response
locals
INPUT : 0 4 ... ... ... ... [6422 rows x 7 columns]
br : 0.0002428845794774927
bw : 0.12515205797541681
columns : ['Port Wt', 'Bench Wt', 'Port Retn', 'Bench Retn', 'Attrib', 'Select', 'Inter', 'Total']
date : u'2013-01-11 00:00:00'
dates : set([u'2013-01-11 00:00:00', u'2013-01-14 00:00:00', u'2013-01-15 00:00:00', u'2013-01-16 00:00:00', u'2013-01-17 00:00:00', u'2013-01-18 00:00:00', ...])
day : 0 4 ..... ... ... [494 rows x 7 columns]
n : 0
pr : -9.970633274708913e-05
pw : 0.075036537596357311
results : 0 4 ... ... ... ... [6422 rows x 7 columns]
s : 0 4 ...... ... ... [82 rows x 7 columns]
sector : u'Consumer Discretionary'
sectors : [u'Consumer Discretionary', u'Consumer Staples', u'Energy', u'Financials', u'Health Care', u'Industrials', u'Information Technology', u'Materials', u'Telecommunications Services', u'Utilities']
test : array([[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],...0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]], dtype=float64)