Ошибка значения: значение истинности фрейма данных неоднозначно. Используйте.empty, a.bool(), a.item(), a.any() или a.all()

#python

#python

Вопрос:

Я написал приложение на python, которое позволяет мне покупать и продавать акции, используя платформу zerodha. Теперь, когда я покупаю акции, я хочу их продать, если значения close_price <exit_price . exit_price вычисляется как exit_price = (close_price*0.91)

Вот мой код:

 from kiteconnect import KiteConnect
import os
import pandas as pd
import openpyxl

cwd = os.chdir("C:/Users/Administrator/Desktop/Zerodha")

#generate trading session
access_token = open("access_token.txt",'r').read()
key_secret = open("credentials.txt",'r').read().split()
kite = KiteConnect(api_key=key_secret[0])
kite.set_access_token(access_token)


# Fetch quote details
#quote = kite.quote("INFY")

# Fetch last trading price of an instrument
#ltp = kite.ltp("NSE:INFY")

# Fetch order details
orders = kite.orders()

# Fetch position details
positions = kite.positions()

# Fetch holding details
holdings = kite.holdings()
data = pd.DataFrame(holdings)
hold = data[['tradingsymbol','average_price','last_price','close_price']]
df =hold['close_price']
x = df*0.91
exit_price=pd.DataFrame(x)
exit_price.rename(columns = {'close_price':'exit_price'}, inplace=True)
hold =hold.join(exit_price)
hold.to_csv('holdings.csv')
hold['date'] = pd.date_range(start='23/11/2020', periods=len(hold), freq='B')

hold['exit_signal'] = hold['close_price'] < hold['exit_price'] #generate exit signal

def placeMarketOrder(symbol,buy_sell,quantity):    
# Place an intraday market order on NSE
if buy_sell == "buy":
    t_type=kite.TRANSACTION_TYPE_BUY
elif buy_sell == "sell":
    t_type=kite.TRANSACTION_TYPE_SELL
kite.place_order(tradingsymbol=symbol,
                exchange=kite.EXCHANGE_NSE,
                transaction_type=t_type,
                quantity=quantity,
                order_type=kite.ORDER_TYPE_MARKET,
                product=kite.PRODUCT_MIS,
                variety=kite.VARIETY_REGULAR)
 

Это полученный фрейм данных для хранения:

Удерживайте DF

Теперь, основываясь на этом фрейме данных, если сигнал выхода истинный, я хочу продать этот частичный запас:

Код для этого таков, как описано:

  if (hold.loc[hold['exit_signal'] == True]):
   #write code to sell stock
 

Теперь при оценке оператора if, как описано выше, я получаю сообщение об ошибке:

     ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
 

Акции могут быть проданы следующим образом в соответствии с определением placeMarketOrder(символ,buy_sell,количество): :

 placeMarketOrder("HDFC","buy",1,30,2200)
 

Следовательно, символ «HDFC» будет заменен символом tradingsymbol, для которого условие выхода имеет значение true.

Как мне выполнить мой оператор if без получения ошибки?

Комментарии:

1. Вам нужны все строки из вашего фрейма данных, которые имеют 'exit_signal' == True ?

2. Да, это правильно. В настоящее время рассматриваю две строки в моем фрейме данных. Если exit_signal —True генерируется для любого одного символа, продайте этот stok. Если это для всех, продайте все акции. Это зависит от того, сколько раз условие выполняется для exit_signal

Ответ №1:

 if (hold.loc[hold['exit_signal'] == True]):
 

Вышеописанное вызывает ошибку, поскольку hold.loc[hold['exit_signal']==True] все еще является фреймом данных. Вам нужно указать, какую конкретно запись вашего фрейма данных вы оцениваете. Например,

 if hold.loc[i, 'exit_signal']:
    symbol, date = hold.loc[i, 'tradingsymbol'], hold.loc[i, 'date']
    placeMarketOrder(symbol, date.month, date.day, date.year)
 

Теперь вы можете i заменить индекс (т.Е. Номер строки) и выполнить итерацию по всему фрейму данных. Взгляните на различные способы перебора фрейма данных, которые все более эффективны, чем цикл с простой loc индексацией:

Имейте в виду, что лучше избегать перебора фрейма данных, когда это возможно (и это часто бывает), поскольку эквивалентные векторизованные операции (если они существуют и правильно настроены) часто выполняются на порядки быстрее.

Тем не менее, в случаях, когда цикл неизбежен, а производительность важна, вы можете взглянуть на:

Комментарии:

1. Большое вам спасибо. Itertuples — это то, что я искал: