如何解决Python:While 循环索引越界
在阅读了许多其他类似帖子中的答案后,我仍然无法弄清楚我错在哪里。
我的问题简而言之:我正在 Python 中转换我已经在 Matlab 和 R 中成功使用的代码。
数据:我有一个名为“sign”(651x1)的数据框,其中有一列“Signals”。唯一的值是: [-1,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,key)
990
991 try:
--> 992 return com.maybe_Box(self,Index.get_value(self,key),key)
993 except KeyError:
994 try:
~\AppData\Local\Programs\Python\python37\lib\site-packages\pandas\core\indexes\base.py in get_value(self,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'有关,但我真的想不通。 我哪里错了? 谢谢
解决方法
好的,我终于明白了:代码很好,但在运行之前,我必须插入这一行:
sign.Signals[-1]=0
原因是在我的可用数据结束时,交易(就像我的情况一样)可能仍处于打开状态。这意味着有一个“卖出”订单 (-1) 未跟有“0”(平仓订单)。 这会影响“while/for 循环”并使其超出其界限。 希望它对某人有用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。