【问题标题】:Python: While loop index out of boundsPython:While循环索引超出范围
【发布时间】:2021-02-20 17:30:18
【问题描述】:

在阅读了许多其他类似帖子的答案后,我仍然无法弄清楚我错在哪里。

简而言之我的问题:我正在 Python 中转换我已经在 Matlab 和 R 中成功使用的代码。

数据:我有一个名为“sign”(651x1)的数据框,其中有一列“Signals”。唯一的值是: [-1,0,1,nan] 。下面是一个不遵循真实顺序的例子

|             |Signals |
|Date         | ---    |
|2018-07-23   | nan    |
|2018-07-24   |1       |
|2018-07-25   |-1      |
|2018-07-26   |0       |

现在,我创建另外 2 个表: 1)'Pos_long' (651x2) 2)'Pos_short'(651x2)
都用“零”填充“符号”的长度。下面是一个例子:

|             |Entry   |Exit   |
|0            | 0      |0      |     
|1            | 0      |0      | 
|2            | 0      |0      |

我的目标:我想使用这些规则为整个“符号”长度创建一个循环:

  • 如果 sign[row] 为 -1,那么我以这种方式填充表 'Pos_short':第一列(Entry)报告我找到 '-1' 的行数,而第二列(Exit)报告我找到的行数我找到第一个符号时退出交易的行[row]=0
  • 如果 sign[row] 为 1,则我按照上述“Pos_short”的相同标准填写表“Pos_long”。

所以这里遵循我的代码:

r=0
k=0
while k<=(len(sign)-1):
    if  sign['Signals'][k] == -1:
        Pos_short['Entry'][r]=k
        j=0
        while sign['Signals'][k+j]!=0:
            j+=1
        Pos_short['Exit'][r]=k+j
        k+=j
        r+=1
    k+=1
k=1

解释:一旦我找到'-1',我会说它继续计数行,直到我找到我得到'0'的第一行。此时,它会用相应的行数填充两列(入口和出口)。

不幸的是,与 Matlab 和 R 不同,我在理解索引出站时遇到了问题,因为我得到的错误如下:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
~\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
   4722         try:
-> 4723             return self._engine.get_value(s, k, tz=getattr(series.dtype, "tz", None))
   4724         except KeyError as e1:

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas\_libs\index.pyx in pandas._libs.index.DatetimeEngine.get_loc()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

KeyError: 651

During handling of the above exception, another exception occurred:

IndexError                                Traceback (most recent call last)
<ipython-input-44-4d023ff81cb1> in <module>
      6         Pos_short['Entry'][r]=k
      7         j=0
----> 8         while sign['Signals'][k+j]!=0:
      9             j+=1
     10         Pos_short['Exit'][r]=k+j

~\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\core\series.py in __getitem__(self, key)
   1062         key = com.apply_if_callable(key, self)
   1063         try:
-> 1064             result = self.index.get_value(self, key)
   1065 
   1066             if not is_scalar(result):

~\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\core\indexes\datetimes.py in get_value(self, series, key)
    990 
    991         try:
--> 992             return com.maybe_box(self, Index.get_value(self, series, key), series, key)
    993         except KeyError:
    994             try:

~\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
   4727 
   4728             try:
-> 4729                 return libindex.get_value_box(s, key)
   4730             except IndexError:
   4731                 raise

pandas\_libs\index.pyx in pandas._libs.index.get_value_box()

pandas\_libs\index.pyx in pandas._libs.index.get_value_at()

pandas\_libs\util.pxd in pandas._libs.util.get_value_at()

pandas\_libs\util.pxd in pandas._libs.util.validate_indexer()

IndexError: index out of bounds

我知道它与“k+j”有关,但我真的想不通。 我哪里错了? 谢谢

【问题讨论】:

    标签: loops while-loop


    【解决方案1】:

    好的,我终于明白了:代码很好,但在运行它之前,我必须插入这一行:

    sign.Signals[-1]=0
    

    原因是在我的可用数据结束时,一笔交易(就像我的情况一样)可能仍然开放。这意味着有一个“卖出”订单 (-1) 后面还没有一个“0”(关闭订单)。 这会影响“while/for 循环”并使其超出其界限。 希望它对某人有用。

    【讨论】:

      猜你喜欢
      • 2019-04-17
      • 2013-11-25
      • 2016-10-03
      • 2019-05-21
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      相关资源
      最近更新 更多