#python #pandas #csv #anaconda
Вопрос:
Недавно я начал погружаться в торговлю algo и создавать бота для криптоторговли.
Для этого я создал бэктестер с пандами для запуска разных стратегий с разными параметрами. Наборы данных (csv-файлы) Я использую довольно большие (около 40 МБ каждый).
Они обрабатываются, но как только я хочу сохранить обработанные данные в csv, ничего не происходит. Никаких выходных данных, даже сообщения об ошибке. Я попытался использовать полный путь, я попытался сохранить его только с именем файла, я даже попытался сохранить его в виде файла .txt. Кажется, ничего не работает. Я также попробовал решения, которые смог найти в stackoverflow.
Я использую Anaconda3 на случай, если это может быть источником моей проблемы.
Здесь вы можете найти часть моего кода ,которая пытается сохранить фрейм данных в файл.
results_df = pd.DataFrame(results)
results_df.columns = ['strategy', 'number_of_trades', "capital"]
print(results_df)
for i in range(2, len(results_df)):
if results_df.capital.iloc[i] < results_df.capital.iloc[0]:
results_df.drop([i],axis="index")
#results to csv
current_dir = os.getcwd()
results_df.to_csv(os.getcwd() '\file.csv')
print(results_df)
Спасибо вам за вашу помощь!
Комментарии:
1. Его лучше использовать
os.path.join(os.getcwd(),"file.csv")
. В противном случае, есть ли у python разрешение на запись в этом каталоге?2. Получаете ли вы вывод своей функции печати внутри цикла?
3. Может
current_dir
быть, это не то, что вы думаете, распечатайте это и убедитесь. Также я настоятельно рекомендую использоватьpathlib
.4. Я проверил еще раз. os.getcwd() нацелена на каталог записи. Я использовал функцию печати, чтобы проверить это еще раз.
Ответ №1:
Вы можете значительно упростить свой код и написать его так, как (также должно выполняться быстрее):
results_df = pd.DataFrame(results)
results_df.columns = ['strategy', 'number_of_trades', "capital"]
print(results_df)
first_row_capital= results_df.capital.iloc[0]
indexer_capital_smaller= results_df.capital < first_row_capital
values_to_delete= indexer_capital_smaller[indexer_capital_smaller].index
results_df.drop(index=values_to_delete, inplace=True)
#results to csv
current_dir = os.getcwd()
results_df.to_csv(os.getcwd() '\file.csv')
print(results_df)
Я думаю, что основная проблема в вашем коде может заключаться в том, что вы пишете csv каждый раз, когда находите запись во фрейме данных, в которой прописная буква соответствует условию, и вы пишете ее только в том случае, если находите такой случай.
И если вы просто удалите данные для вывода csv, но вам больше не нужен фрейм данных в памяти, вы можете сделать это еще проще:
results_df = pd.DataFrame(results)
results_df.columns = ['strategy', 'number_of_trades', "capital"]
print(results_df)
first_row_capital= results_df.capital.iloc[0]
indexer_capital_smaller= results_df.capital < first_row_capital
#results to csv
current_dir = os.getcwd()
results_df[indexer_capital_smaller].to_csv(os.getcwd() '\file.csv')
print(results_df[indexer_capital_smaller])
Этот второй вариант применяет фильтр только перед записью отфильтрованных строк и перед печатью содержимого.
Комментарии:
1. Большое спасибо! Похоже, ты был прав! Теперь я могу сгенерировать файл без проблем!