【发布时间】:2025-12-03 01:45:02
【问题描述】:
使用以下数据:
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: operands could not be broadcast together with shapes (2,) (12,)
takeBoth = False
targetIsHit,targetIsMiss = False,False
if takeBoth:
targetHit = a[(hit['reversal1'].values==a['price'].values) & (hit['reversal1'].index.values<a['price'].index.values)];
targetMiss = a[(hit['reversal2'].values==a['price'].values) & (hit['reversal2'].index.values<a['price'].index.values)];
targetIsHit,targetIsMiss = not targetHit.empty, not targetMiss.empty
else:
targetHit = a[(hit['reversal1'].values==a['price'].values) & (hit['reversal1'].index.values<a['price'].index.values)];
targetIsHit = not targetHit.empty
if not targetIsHit:
targetMiss = a[(hit['reversal2'].values==a['price'].values) & (hit['reversal2'].index.values<a['price'].index.values)];
targetIsMiss = not targetMiss.empty
if targetIsHit:a.loc[hit.index.values,"target_hit"] = targetHit.index.values;
if targetIsMiss:a.loc[hit.index.values,"target_miss"] = targetMiss.index.values;
如果hit = a.ix[:,:-2].dropna() 只生成一行,我不会收到此错误。在阅读了这个之后,我发现这可能是由于广播规则。
我应该遍历hit 中的行以避免这种情况吗?请对如何解决此问题有任何其他建议?
【问题讨论】:
-
执行
hit['reversal1'].values == a['price'].values时出现错误。你不应该像这样进行元素比较(例如使用np.equals)。不过,在您的具体情况下,我会确保hit['reversal1']评估为标量,例如我将hit替换为hit.iloc[0]以仅选择其第一行。 -
你能告诉我怎么做吗@Kris?
-
在您的第二个单元格中尝试
hit = hit.iloc[0],然后尝试评估您的第三个单元格。