Python 使用两行时操作数无法一起广播错误
使用以下数据:Python 使用两行时操作数无法一起广播错误,python,pandas,Python,Pandas,使用以下数据: import datetime,numpy as np,pandas as pd nan = np.nan a = pd.DataFrame( {'price': {datetime.time(9, 0): 1, datetime.time(10, 0): 0, datetime.time(11, 0): 3, datetime.time(12, 0): 4, datetime.time(13, 0): 7, datetime.time(14, 0): 6
import datetime,numpy as np,pandas as pd
nan = np.nan
a = pd.DataFrame( {'price': {datetime.time(9, 0): 1, datetime.time(10, 0): 0, datetime.time(11, 0): 3, datetime.time(12, 0): 4, datetime.time(13, 0): 7, datetime.time(14, 0): 6, datetime.time(15, 0): 5, datetime.time(16, 0): 4, datetime.time(17, 0): 0, datetime.time(18, 0): 2, datetime.time(19, 0): 4, datetime.time(20, 0): 7}, 'reversal': {datetime.time(9, 0): 1, datetime.time(10, 0): nan, datetime.time(11, 0): nan, datetime.time(12, 0): nan, datetime.time(13, 0): nan,
datetime.time(14, 0): 6.0, datetime.time(15, 0): nan, datetime.time(16, 0): nan, datetime.time(17, 0): nan, datetime.time(18, 0): nan, datetime.time(19, 0): nan, datetime.time(20, 0): nan}})
a['target_hit']=nan;
a['target_miss']=nan;
a['reversal1']=a['reversal']+1;
a['reversal2']=a['reversal']-a['reversal'];
a.sort_index(1,inplace=True);
我创建一个子集,如下所示:
hit = a.ix[:,:-2].dropna()
hit
这将给出显示两行匹配的输出:
price reversal reversal1 reversal2
09:00:00 1 1.0 2.0 0.0
14:00:00 6 6.0 7.0 0.0
然后,当我尝试使用这些行来匹配以下内容时,我得到了以下错误ValueError:操作数无法与形状(2,)(12,)一起广播
takeBoth=False
targetIsHit,targetIsMiss=False,False
如果两者都有:
targetHit=a[(hit['reversal1'].values==a['price'].values)&(hit['reversal1'].index.values是的,它必须用于循环…现在我将其更改为从hit或miss中选择第一个
import datetime,numpy as np,pandas as pd;
nan = np.nan;
a = pd.DataFrame( {'price': {datetime.time(9, 0): 1, datetime.time(10, 0): 0, datetime.time(11, 0): 3, datetime.time(12, 0): 4, datetime.time(13, 0): 7, datetime.time(14, 0): 6, datetime.time(15, 0): 5, datetime.time(16, 0): 4, datetime.time(17, 0): 0, datetime.time(18, 0): 2, datetime.time(19, 0): 4, datetime.time(20, 0): 7}, 'reversal': {datetime.time(9, 0): 1, datetime.time(10, 0): nan, datetime.time(11, 0): nan, datetime.time(12, 0): nan, datetime.time(13, 0): nan,
datetime.time(14, 0): 6.0, datetime.time(15, 0): nan, datetime.time(16, 0): nan, datetime.time(17, 0): nan, datetime.time(18, 0): nan, datetime.time(19, 0): nan, datetime.time(20, 0): nan}});
a['target_hit']=a['target_miss']=nan;
a['reversal1']=a['reversal']+1;
a['reversal2']=a['reversal']-a['reversal'];
a.sort_index(1,inplace=True);
hits = a.ix[:,:-2].dropna();
for row,hit in hits.iterrows():
forwardRows = [row]<a['price'].index.values
targetHit = a.index.values[(hit['reversal1']==a['price'].values) & forwardRows][0];
targetMiss = a.index.values[(hit['reversal2']==a['price'].values) & forwardRows][0];
if targetHit>targetMiss:
a.loc[row,"target_miss"] = targetMiss;
else:
a.loc[row,"target_hit"] = targetHit;
print '#'*50
print a
'''
当您执行hit['reversal1']时会发生错误。值==a['price'].值
。您不应该像这样进行元素级比较(例如使用np.equals
)。但是,在您的特定情况下,我会确保hit['reversal1']
的计算结果为标量,例如,我会将hit
替换为hit
只选择它的第一行。你能告诉我怎么做@Kris吗?在你的第二个单元格中尝试hit=hit.iloc[0]
,然后尝试评估你的第三个单元格。再次感谢。这回答了我的问题。如果你有时间看,我还有另一个相关问题
import datetime,numpy as np,pandas as pd;
nan = np.nan;
a = pd.DataFrame( {'price': {datetime.time(9, 0): 1, datetime.time(10, 0): 0, datetime.time(11, 0): 3, datetime.time(12, 0): 4, datetime.time(13, 0): 7, datetime.time(14, 0): 6, datetime.time(15, 0): 5, datetime.time(16, 0): 4, datetime.time(17, 0): 0, datetime.time(18, 0): 2, datetime.time(19, 0): 4, datetime.time(20, 0): 7}, 'reversal': {datetime.time(9, 0): 1, datetime.time(10, 0): nan, datetime.time(11, 0): nan, datetime.time(12, 0): nan, datetime.time(13, 0): nan,
datetime.time(14, 0): 6.0, datetime.time(15, 0): nan, datetime.time(16, 0): nan, datetime.time(17, 0): nan, datetime.time(18, 0): nan, datetime.time(19, 0): nan, datetime.time(20, 0): nan}});
a['target_hit']=a['target_miss']=nan;
a['reversal1']=a['reversal']+1;
a['reversal2']=a['reversal']-a['reversal'];
a.sort_index(1,inplace=True);
hits = a.ix[:,:-2].dropna();
for row,hit in hits.iterrows():
forwardRows = [row]<a['price'].index.values
targetHit = a.index.values[(hit['reversal1']==a['price'].values) & forwardRows][0];
targetMiss = a.index.values[(hit['reversal2']==a['price'].values) & forwardRows][0];
if targetHit>targetMiss:
a.loc[row,"target_miss"] = targetMiss;
else:
a.loc[row,"target_hit"] = targetHit;
print '#'*50
print a
'''
##################################################
##################################################
price reversal reversal1 reversal2 target_hit target_miss
09:00:00 1 1.0 2.0 0.0 NaN 10:00:00
10:00:00 0 NaN NaN NaN NaN NaN
11:00:00 3 NaN NaN NaN NaN NaN
12:00:00 4 NaN NaN NaN NaN NaN
13:00:00 7 NaN NaN NaN NaN NaN
14:00:00 6 6.0 7.0 0.0 NaN 17:00:00
15:00:00 5 NaN NaN NaN NaN NaN
16:00:00 4 NaN NaN NaN NaN NaN
17:00:00 0 NaN NaN NaN NaN NaN
18:00:00 2 NaN NaN NaN NaN NaN
19:00:00 4 NaN NaN NaN NaN NaN
20:00:00 7 NaN NaN NaN NaN NaN
'''