Я работаю над кадром данных и хочу перебрать один столбец, как я делал это сотни раз со многими кадрами данных. Сегодня я получаю ошибку, и я не могу понять, что с ней не так.
Возможно, стоит упомянуть, что фрейм данных представляет собой конкатенацию.
log = (pd.concat([log_entry,log_exit]).sort_values(by=['date']))
фрейм данных:
position order price PnL
date
2022-03-27 20:45:00 short entry 29.242291 0
2022-03-28 13:45:00 short entry 31.052375 0
2022-03-28 15:00:00 short entry 31.072893 0
2022-03-28 19:15:00 short entry 31.070073 0
2022-03-28 20:45:00 short entry 31.220069 0
2022-03-28 23:00:00 - TP 30.016500 0
2022-03-28 23:15:00 - TP 29.788000 0
2022-03-28 23:15:00 - TP 29.820500 0
2022-03-28 23:30:00 - TP 29.640500 0
2022-03-29 05:30:00 short entry 30.902677 0
2022-03-29 06:15:00 short entry 30.893078 0
итерация:
for i in range(len(log.index)):
if log.position[i] == 'short':
print('ok')
ошибка:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_value(self, series, key)
4729 try:
-> 4730 return self._engine.get_value(s, k, tz=getattr(series.dtype, "tz", None))
4731 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.IndexEngine.get_loc()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine._get_loc_duplicates()
TypeError: '<' not supported between instances of 'str' and 'int'
During handling of the above exception, another exception occurred:
IndexError Traceback (most recent call last)
<ipython-input-8-c8832d66a85a> in <module>
156
157 for i in range(len(log.index)):
--> 158 if log.position[i] == 'short':
159 print('ok')
160 # dd_buffer.append(log.price[i])
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/series.py in __getitem__(self, key)
1066 key = com.apply_if_callable(key, self)
1067 try:
-> 1068 result = self.index.get_value(self, key)
1069
1070 if not is_scalar(result):
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_value(self, series, key)
4748 # python 3
4749 if is_scalar(key): # pragma: no cover
-> 4750 raise IndexError(key)
4751 raise InvalidIndexError(key)
4752
IndexError: 0
Как это возможно??
С помощью log.position[i]
вы сопоставляете показатель кадра данных, то есть даты и времени. Нет индекса 0 (только дата и время), поэтому вы получаете IndexError. Вместо этого используйте log.position.iloc[i]
для индексации на основе целочисленного местоположения для выбора по позиции.
До сих пор не понимаю, почему обычно это работает всегда, а не сейчас. В том же проекте с другим df я использую «for i in range(len(df.index)): если df.position[i] == «short»» работает нормально
Возможно, datetime был не индексом, а столбцом
Я всегда использую дату и время в качестве индекса. Но в любом случае это просто целочисленный итератор, использующий range(len()). на самом деле не имеет значения, какой индекс
Редактировать: Кажется, теперь я понимаю ваш вопрос: Вы перебираете диапазон (len (index)) который всегда будет начинаться с 0 и повторяться до len(index)-1
ваш индекс не обязательно должен быть последовательным порядком, вы можете, например, удалить свой индекс = 0, и тогда ваш индекс начнется с 1 (вы можете просмотреть его как еще один столбец, который можно просто редактировать)
Пытаться:
for i in log.index:
print(i)
Это должно показать, что ваш индекс не начинается с 0, если я прав.
for i in log.index:
if log.position.iloc[i] == "short":
print("ok")
Это должно делать то, что вы хотели.
Предыдущий ответ( Я не уверен, чего вы пытаетесь достичь, но похоже, что вы хотите знать, сколько "коротких" в позиции
Пытаться: log.position.value_counts()
чтобы увидеть, сколько каждого значения там
Обычно есть лучшие способы, чем перебирать фрейм данных в pandas)
Нет, я не хочу этого. Дело не в том, что происходит позже в цикле, а только в том, почему итерация не работает.
Я видел ваш другой комментарий, но не могу ответить на него из-за недостаточной репутации. Вы проверили, как выглядит ваш индекс? это не обязательно должно быть 0,1,2,3, но может быть 1000, 10001, 10003 и т. д., вы перебираете len(index), который всегда будет начинаться с 0. Попробуйте i в log.index
Чего вы на самом деле хотите достичь? Зацикливание на DataFrame редко бывает хорошим подходом.