【发布时间】: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