Я записываю большое количество данных финансовых временных рядов в отдельные файлы CSV. В одном случае я обнаружил, что метод to_csv повторяется, но я не могу понять, почему. Во время вызова метода to_csv все просто зависает на 10-15 минут. Перед сбоем с ошибкой:
Трассировка (последний последний вызов): Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs.py ", строка 172, в файле сохранения self._save ()" C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs.py ", строка 274, в _save self._save_header () Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs.py", строка 242, в _save_header writer.writerow (encoded_labels) OSError: [Errno 22] Недопустимый аргумент
Во время обработки вышеупомянутого исключения произошло другое исключение:
OSError: [Errno 22] Недопустимый аргумент
Во время обработки вышеупомянутого исключения произошло другое исключение:
Traceback (последний вызов был последним): файл "securitiesArchives.py", строка 1072, в out_df.to_csv ("PRN.csv", mode = 'w', кодировка = 'UTF-8', сжатие = нет) Файл " C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ core \ generi c .py ", строка 3020, в файле to_csv formatter.save ()" * 1 101 *: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs.py ", строка 187, в save f.close () OSError: [Errno 22] Неверный аргумент
Кажется, что он зависает при записи строки заголовка файла csv. Я записал этот же кадр в hdf, затем загрузил из hdf и, используя загруженный hdf кадр, воспроизвел тот же (или очень близкий к тому же) сбой:
Traceback (последний вызов был последним): Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs.py", строка 172, в файле save self._save (). "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs.py ", строка 274, в файле _save self._save_header ()" C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs .py ", строка 242, в _save_header writer.writerow (encoded_labels) PermissionError: [Errno 13] В доступе отказано
Во время обработки вышеуказанного исключения произошло другое исключение:
PermissionError: [Errno 13] В доступе отказано
Во время обработки вышеупомянутого исключения произошло другое исключение:
Traceback (последний вызов был последним): файл "bad_archive.py", строка 12, в # out_df.to_csv ("PRN.csv", mode = 'w', encoding = 'UTF-8', сжатие = нет) Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ core \ generi c .py ", строка 3020, в файле to_csv formatter.save ()" C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ format \ csvs.py ", строка 187, в save f.close () PermissionError: [Errno 13] Разрешение отклонено
Не уверен, почему он изменился с" OSError: [Errno 22] Недопустимый аргумент «to» PermissionError: [Errno 13] Разрешение отклонено »при переходе от более крупного тела кода к небольшой примерной проблеме. Я искал эти ошибки в связи с методом to_csv и видел, что в предыдущей версии pandas могли быть похожие проблемы, но это должно было быть решено в более поздней версии. Мой pandas:
УСТАНОВЛЕННЫЕ ВЕРСИИ ------------------ commit: None python: 3.7.3.final.0 python -бит: 64 ОС: Windows Выпуск ОС: 10 Машина: AMD64 Процессор: Intel64 Семейство 6 Модель 94 Шаг 3, Подлинный метеородел Intel: маленький LC_ALL: Нет LANG: Нет LOCALE: Нет. Нет
pandas: 0.24.2 pytest: 5.0.1 pip: 19.1.1 setuptools: 41.0.1 Cython: 0.29.12 numpy: 1.16.4 scipy: 1.2.1 pyarrow: нет xarray: нет I Python: 7.6.1 сфинкс: 2.1.2 пирсинг: 0.5.1 дата: 2.8.0 pytz: 2019.1 blos c: нет узких мест: 1.2.1 таблицы: 3.5.2 numberxpr: 2.6.9 перо: нет matplotlib: 3.1. 0 openpyxl: 2.6.2 xlrd: 1.2.0 xlwt: 1.3.0 xlsxwriter: 1.1.8 l xml .etree: 4.3.4 bs4: 4.7.1 html5lib: 1.0.1 sqlalchemy: 1.3.5 py mysql : Нет psycopg2: нет jinja2: 2.10.1 s3fs: нет fastparquet: нет pandas_gbq: нет pandas_datareader: 0.8.1 gcsfs: нет
Я на 64-битной машине win-10 с использованием Anaconda Python 3.7.3 (по умолчанию, 24 апреля 2019 г., 15:29:51) [MS C v.1915 64 бит (AMD64)] :: Anaconda, In c. на win32
я пытался:
- преобразовать индекс в str в astype (str) перед вызовом to_csv, та же проблема
- dropna для индекса (строки) как было большое количество записей NaN (первоначально этот кадр был частью гораздо большего многоиндексного фрейма) проблема сохраняется
- аргументы ключевых слов headers = False и index = False, ни один не изменил поведение.
- Использование .loc [] для нарезки только первой строки и выполнения to_csv на этом
out_df.loc[out_df.index.values[0]].to_csv("PRN.csv",mode='w',encoding='UTF-8' ,compression=None)
, что также не удалось. Несмотря на то, что теперь это серия, а не кадр, так как было выдано следующее предупреждение
FutureWarning: подпись Series.to_csv
была выровнена с подписью DataFrame.to_csv
, а аргумент header будет измените значение по умолчанию с False на True: передайте явное значение для подавления этого предупреждения.
- Попробовал снова тот же метод, что и выше, вместо того, чтобы разрезать первые две строки, чтобы убедиться, что они остались в кадре и не преобразуется в серию
Весь двухрядный DataFrame, который отказывается от сотрудничества с to_csv out_df.loc[out_df.index.values[0]:out_df.index.values[1]].to_csv("PRN.csv",mode='w',encoding='UTF-8' ,compression=None,index=False,header=False)
Но это также не удалось, как и раньше. Однако я смог записать последовательность каждого столбца независимо в собственный CSV-файл без проблем.
for col_name in out_df.columns:
print('Writing '+col_name+' as CSV')
out_df[col_name].to_csv(col_name.replace(' ','_')+"_PRN.csv",mode='w',encoding='UTF-8' ,compression=None)
print('Done.')
В совокупности вышеуказанный успех и неудача попытки записи в два ряда заставляют меня думать, что это не проблема, связанная с указанными c значениями столбцов. Кроме того, трассировки заставляют меня думать, что эти проблемы связаны с написанием заголовков столбцов. Но дело в том, что у меня есть 3000+ других DataFrames с точно такими же метками столбцов, и они пишут в csv, используя to_csv без проблем. На данный момент я вне моей глубины.
Неоднократно происходит сбой на одном и том же наборе данных, независимо от того, использую ли я данные, которые я записал в hdf, или использую fre sh pull из Yahoo с помощью yfinance. Следующий код надежно воссоздает проблему в моей системе:
import pandas as pd
import yfinance as yf
good_df = yf.download(tickers='AAPL',interval='1m',period='7d')
bad_df = yf.download(tickers='PRN',interval='1m',period='7d')
print('Writing test case AAPL as CSV')
good_df.to_csv("AAPL.csv",mode='w',encoding='UTF-8' ,compression=None)
print('Writing test case PRN as CSV')
bad_df.to_csv("PRN.csv",mode='w',encoding='UTF-8' ,compression=None)
У кого-нибудь есть какие-либо идеи?
PS - При повторном чтении я решил проверить метки столбцов на эквивалентность и насколько логическое сравнение касается идентификаторов «хорошего» DataFrame и «плохого» DataFrame как идентичных.
>>>print(good_df.columns)
Index(['Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume'], dtype='object')
>>>print(bad_df.columns)
Index(['Open', 'High', 'Low', 'Close', 'Adj Close','Volume'], dtype='object')
>>>print(good_df.columns == bad_df.columns)
[ True True True True True True]
PPS - я также попытался удалить все флаги из to_csv, хотя они должны были быть по умолчанию ценности. Это было перенесено из того, что использовалось в другом коде, и я просматривал другие значения, чтобы посмотреть, сработает ли это. Большинство базовых вызовов c to_csv, как и прежде, завершается неудачно
import pandas as pd
import yfinance as yf
good_df = yf.download(tickers='AAPL',interval='1m',period='7d')
bad_df = yf.download(tickers='PRN',interval='1m',period='7d')
print('Writing test case AAPL as CSV')
good_df.to_csv("AAPL.csv")
print('Writing test case PRN as CSV')
bad_df.to_csv("PRN.csv")
Обновление В ответ на ответ от Cheng
я не вижу файлов в проводнике или через dir в консоли. Но чтобы проверить это, я использовал новое имя файла, которое не было символом «PRN», и вот оно работает.
Я не думал, что это проблема, поскольку я уже пытался писать в другое место назначения папка, как в большем родительском коде, а затем в игрушке проблемы. Ни один из них не работал.
Казалось бы, windows имеет старую ссылку на любой старый файл с именем "PRN.csv" или что-то в этом роде ... как расстраивает. Будем надеяться, что простой перезапуск исправит это.
Спасибо!