Как сравнить два значения данных strframe python pandas - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь сравнить два разных значения в кадре данных. Вопросы / ответы, которые я нашел, я не смог использовать.

import pandas as pd
# from datetime import timedelta

"""
read csv file
clean date column
convert date str to datetime
sort for equity options
replace date str column with datetime column
"""
trade_reader = pd.read_csv('TastyTrades.csv')
trade_reader['Date'] = trade_reader['Date'].replace({'T': ' ', '-0500': ''}, regex=True)
date_converter = pd.to_datetime(trade_reader['Date'], format="%Y-%m-%d %H:%M:%S")
options_frame = trade_reader.loc[(trade_reader['Instrument Type'] == 'Equity Option')]
clean_frame = options_frame.replace(to_replace=['Date'], value='date_converter')

# Separate opening transaction from closing transactions, combine frames
opens = clean_frame[clean_frame['Action'].isin(['BUY_TO_OPEN', 'SELL_TO_OPEN'])]
closes = clean_frame[clean_frame['Action'].isin(['BUY_TO_CLOSE', 'SELL_TO_CLOSE'])]
open_close_set = set(opens['Symbol']) & set(closes['Symbol'])
open_close_frame = clean_frame[clean_frame['Symbol'].isin(open_close_set)]

'''
convert Value to float
sort for trade readability
write
'''
ocf_float = open_close_frame['Value'].astype(float)
ocf_sorted = open_close_frame.sort_values(by=['Date', 'Call or Put'], ascending=True)
# for readability, revert back to ocf_sorted below
ocf_list = ocf_sorted.drop(
    ['Type', 'Instrument Type', 'Description', 'Quantity', 'Average Price', 'Commissions', 'Fees', 'Multiplier'], axis=1
    )
ocf_list.reset_index(drop=True, inplace=True)
ocf_list['Strategy'] = ''
# ocf_list.to_csv('Sorted.csv')

# create strategy list
debit_single = []
debit_vertical = []
debit_calendar = []
credit_vertical = []
iron_condor = []

# shift columns
ocf_list['Symbol Shift'] = ocf_list['Underlying Symbol'].shift(1)
ocf_list['Symbol Check'] = ocf_list['Underlying Symbol'] == ocf_list['Symbol Shift']

# compare symbols, append depending on criteria met
for row in ocf_list:
    if row['Symbol Shift'] is row['Underlying Symbol']:
        debit_vertical.append(row)

print(type(ocf_list['Underlying Symbol']))
ocf_list.to_csv('Sorted.csv')
print(debit_vertical)
# delta = timedelta(seconds=10)

Я получаю ошибку:

line 51, in <module>
    if row['Symbol Check'][-1] is row['Underlying Symbol'][-1]:
TypeError: string indices must be integers

Я пытаюсь сравнить вновь созданный смещенный столбец к оригиналу, и если они совпадают, добавьте в список. Можно ли вообще сравнить два строковых значения в python? Я пытался проверить, является ли проверка символов истинной, и она по-прежнему возвращает ошибку о str индексы должны быть int. .iterrows() не работает

1 Ответ

2 голосов
/ 06 марта 2020

Здесь вы фактически будете выполнять итерацию по столбцам вашего DataFrame, а не по строкам:

for row in ocf_list:
    if row['Symbol Shift'] is row['Underlying Symbol']:
        debit_vertical.append(row)

Вы можете использовать один из методов iterrows или itertuples для итерации по строкам, но они возвращают строки как списки и кортежи соответственно, что означает, что вы не можете индексировать их, используя имена столбцов, как вы это сделали здесь.

Во-вторых, вы должны использовать == вместо is, так как вы, вероятно, сравнение значений, а не тождеств.

Наконец, я бы пропустил итерацию по строкам целиком, так как pandas сделан для выбора строк на основе условия. Вы должны быть в состоянии заменить вышеупомянутый код следующим:

debit_vertical = ocf_list[ocf_list['Symbol Shift'] == ocf_list['Underlying Symbol']].values.tolist()
...