Python系列在数据帧错误方面不明确

Python系列在数据帧错误方面不明确,python,pandas,dataframe,Python,Pandas,Dataframe,这是数据帧,我用它做逻辑运算,抛出如下错误。我如何克服这个问题 Traceback (most recent call last): in <module> if( eoddf['High'][Open] > linebreakvalue): File "", line , in __nonzero__ .format(self.__class__.__name__)) ValueError: The truth value of a Series

这是数据帧,我用它做逻辑运算,抛出如下错误。我如何克服这个问题

Traceback (most recent call last):
    in <module>
    if( eoddf['High'][Open] > linebreakvalue):
  File "", line , in __nonzero__
    .format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
代码:

用于范围内打开(1,len(eoddf)):
如果(eoddf['High'][Open]>linebreakvalue):
eoddf['LBHigh']{Open]=eoddf['High'][Open]
eoddf['LBLow'][Open]=eoddf['Low'][Open]
linebreakvalue=eoddf['LBHigh'][打开]
如果(eoddf['Low'][Open]
我正试图根据需要将此MQ4代码写入Python。代码参考如下:

我还想运行这个循环,直到Open列的最后一个条目。这里是否可以使用更好的for循环或其他方法

基本上,我正在尝试将这段代码转换为Python

OLDSwing=Swing;
VALUE1=High[Highest(NULL,0,MODE_HIGH,Lines_Break,shift+1)];
VALUE2= Low[Lowest(NULL,0,MODE_LOW,Lines_Break,shift+1)];
if (OLDSwing==1 &&  Low[shift]<VALUE2) Swing=-1;
if (OLDSwing==-1 && High[shift]>VALUE1 ) Swing=1;
if (Swing==1) 
   { HighBuffer[shift]=High[shift]; LowBuffer[shift]=Low[shift]; }
if (Swing==-1)
{ LowBuffer[shift]=High[shift]; HighBuffer[shift]=Low[shift]; }
OLDSwing=Swing;
值1=高[最高值(零,0,模式高,线断,移位+1)];
值2=低[最低(零,0,模式低,行断,移位+1)];
如果(OLDSwing==1&&Low[shift]值1)Swing=1;
如果(摆动==1)
{HighBuffer[shift]=High[shift];LowBuffer[shift]=Low[shift];}
如果(摆动==-1)
{LowBuffer[shift]=高[shift];高缓冲[shift]=低[shift];}
这方面的规则是:

  • 如果价格超过前一行的高价,将绘制一条新的绿线
  • 如果价格低于前一行的低价,则会画一条新的红线
  • 如果价格不高于或低于前一条线,则不提取任何内容
  • 如果涨势足以形成三条连续的绿线,那么只有当价格跌破最后三条绿线的最低点时,才会画出一条新的红线
  • 如果抛售足以形成三条连续的红线,那么只有当价格上涨超过最后三条红线的最高点时,才会画出一条新的绿线
执行此操作的最佳方法是什么?

我相信您需要双精度条件,但如果条件相等,则返回第二个值:

linebreakvalue = 320
m1 = eoddf['High'] > linebreakvalue
m2 = eoddf['Low'] > linebreakvalue

eoddf['LBHigh']= np.where(m1, eoddf['High'], eoddf['Low'])
eoddf['LBLow'] = np.where(m2, eoddf['Low'], eoddf['High'])

但如果真的需要循环:

for i, x in eoddf.iterrows():
    if(eoddf.loc[i, 'High'] > linebreakvalue):
       eoddf.loc[i, 'LBHigh']=eoddf.loc[i,'High']
       eoddf.loc[i,'LBLow'] =eoddf.loc[i,'Low']
    if(eoddf.loc[i,'Low'] < linebreakvalue):
       eoddf.loc[i,'LBHigh']=eoddf.loc[i,'Low']
       eoddf.loc[i,'LBLow'] =eoddf.loc[i,'High']
eoddf.iterrows()中的i,x的

如果(eoddf.loc[i,‘高’]>linebreakvalue):
eoddf.loc[i,'LBHigh']=eoddf.loc[i,'High']
eoddf.loc[i,'LBLow']=eoddf.loc[i,'Low']
如果(eoddf.loc[i,'Low']
这就是你想要的:

eoddf['LBHigh'] = df.apply(lambda x: x['High'] if x['High'] > linebreakvalue else x['Low'], axis=1)
eoddf['LBLow'] = df.apply(lambda x: x['Low'] if x['Low'] < linebreakvalue else x['High'], axis=1)
eoddf['LBHigh']=df.apply(λx:x['High']如果x['High']>linebreakvalue否则x['Low'],轴=1)
eoddf['LBLow']=df.apply(λx:x['Low'],如果x['Low']
更改<我检查了它,它工作得很好-可能问题是我的解决方案和您的for循环相同,而您的原始代码不同:(我尝试重写循环以矢量化操作。由于格式错误,能否将注释中不起作用的代码添加到答案中?此外,如果循环不起作用,是否可以从示例数据中添加预期输出?输出类似下面的蓝色和红色线,以使用低价和高价形成的蜡烛,如图所示此链接。具有此输出的数据帧准备就绪后,我将使用plotly制作图表。相同的错误回溯(上次调用):结果[i]=func(v)文件“C:\python3\Lib\site packages\nsepy\testplot.py”,第413行,在eoddf['LBHigh']=df.apply中(lambda x:x['High']如果x['High']>linebreakvalue else x['Low'],axis=1)文件“C:\python3\lib\site packages\pandas\core\generic.py”,第953行,非零格式(self.\uuuuuu class.\uuuuuuu name.\uuuuuuuuuuu))ValueError:(“序列的真值不明确。请使用a.empty、a.bool()、a.item()、a.any()或a.all(),”出现在索引2017-10-03中”)此解决方案未使用
for
循环,因此您可能希望删除该部分。
print (eoddf)

           Symbol Series  Prev Close    Open    High     Low    Last   Close  \
2015-01-01   SBIN     EQ      311.85  312.45  315.00  310.70  314.00  314.00   
2015-01-02   SBIN     EQ      314.00  314.35  318.30  314.35  315.60  315.25   
2015-01-05   SBIN     EQ      315.25  316.25  316.80  312.10  312.80  312.75   
2015-01-06   SBIN     EQ      312.75  310.00  311.10  298.70  299.90  299.90   
2015-01-07   SBIN     EQ      299.90  300.00  302.55  295.15  301.40  300.15   
2015-01-08   SBIN     EQ      300.15  305.00  306.50  302.35  305.25  304.85   
2015-01-09   SBIN     EQ      304.85  306.70  307.85  302.00  303.00  303.20   
2015-01-12   SBIN     EQ      303.20  304.15  307.80  301.10  306.90  307.10   
2015-01-13   SBIN     EQ      307.10  308.15  310.75  304.15  305.25  305.10   
2015-01-14   SBIN     EQ      305.10  304.00  307.00  302.25  305.00  304.70   
2015-01-15   SBIN     EQ      304.70  319.90  323.70  314.00  318.40  320.30   
2015-01-16   SBIN     EQ      320.30  320.00  320.30  313.10  315.25  315.45   
2015-01-19   SBIN     EQ      315.45  316.55  317.95  312.50  313.20  313.15   
2015-01-20   SBIN     EQ      313.15  314.00  319.80  314.00  318.00  318.15   
2015-01-21   SBIN     EQ      318.15  319.90  327.60  319.00  326.00  326.20   
2015-01-22   SBIN     EQ      326.20  326.90  327.60  321.80  325.20  324.65   
2015-01-23   SBIN     EQ      324.65  328.25  332.55  324.65  327.05  327.45   
2015-01-27   SBIN     EQ      327.45  329.40  332.15  322.60  331.45  330.05   
2015-01-28   SBIN     EQ      330.05  330.40  336.00  328.20  333.40  334.60   

            LBHigh   LBLow  
2015-01-01  310.70  315.00  
2015-01-02  314.35  318.30  
2015-01-05  312.10  316.80  
2015-01-06  298.70  311.10  
2015-01-07  295.15  302.55  
2015-01-08  302.35  306.50  
2015-01-09  302.00  307.85  
2015-01-12  301.10  307.80  
2015-01-13  304.15  310.75  
2015-01-14  302.25  307.00  
2015-01-15  323.70  323.70  
2015-01-16  320.30  320.30  
2015-01-19  312.50  317.95  
2015-01-20  314.00  319.80  
2015-01-21  327.60  327.60  
2015-01-22  327.60  321.80  
2015-01-23  332.55  324.65  
2015-01-27  332.15  322.60  
2015-01-28  336.00  328.20  
for i, x in eoddf.iterrows():
    if(eoddf.loc[i, 'High'] > linebreakvalue):
       eoddf.loc[i, 'LBHigh']=eoddf.loc[i,'High']
       eoddf.loc[i,'LBLow'] =eoddf.loc[i,'Low']
    if(eoddf.loc[i,'Low'] < linebreakvalue):
       eoddf.loc[i,'LBHigh']=eoddf.loc[i,'Low']
       eoddf.loc[i,'LBLow'] =eoddf.loc[i,'High']
eoddf['LBHigh'] = df.apply(lambda x: x['High'] if x['High'] > linebreakvalue else x['Low'], axis=1)
eoddf['LBLow'] = df.apply(lambda x: x['Low'] if x['Low'] < linebreakvalue else x['High'], axis=1)