Вопрос или проблема
Это мои данные о фондовом рынке в формате csv:
Дата,Открытие,Максимум,Минимум,Закрытие,Скорректированное закрытие,Объем
43283,511,514.950012,503.5,512.599976,512.599976,261839
43284,512.599976,520,509.700012,512,512,332619
43285,512,515.950012,507.950012,514.299988,514.299988,173621
43286,515.549988,517.5,509.399994,510.899994,510.899994,117474
43287,510.049988,516.5,510.049988,514.25,514.25,82106
43290,514.200012,528.5,514.200012,523.650024,523.650024,322861
43291,530,534.900024,522.099976,532.549988,532.549988,404132
43292,533.400024,541.75,531,536.599976,536.599976,267510
43293,539.450012,545,535.25,537.25,537.25,254942
43294,540,540.799988,520.5,523.900024,523.900024,240378
43297,524,529.75,518.549988,523.099976,523.099976,191192
43298,523,540,519.799988,538.049988,538.049988,213308
43299,542.349976,542.799988,515.849976,524.200012,524.200012,557333
43300,528,536.900024,518.849976,527.299988,527.299988,201716
43301,527.599976,536.450012,524.950012,534.450012,534.450012,156703
43304,534.5,544.950012,531.049988,540.799988,540.799988,209083
43305,542.950012,549,538.450012,546,546,216217
43306,547,547.5,529.450012,531.849976,531.849976,145508
43307,537,543.900024,527,541.650024,541.650024,547093
43308,545,555,538,553.650024,553.650024,540695
43311,555,570,551.099976,568.450012,568.450012,564010
43312,582,584.950012,548,550.099976,550.099976,942588
43313,552.450012,555.549988,538.650024,544.900024,544.900024,440881
Я пытаюсь загрузить файл данных фондового рынка в формате csv в блокнот Jupyter с помощью
import numpy as np
np.loadtxt(r"C:\Users\Souro\Downloads\Data.csv",delimiter=",")
но после компиляции появляется следующая ошибка:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-54-6552d575b229> in <module>
----> 1 np.loadtxt(r"C:\Users\Souro\Downloads\Data.csv",delimiter=",")
c:\python3.7.2\lib\site-packages\numpy\lib\npyio.py in loadtxt(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack, ndmin, encoding, max_rows)
1139 # конвертирование данных
1140 X = None
-> 1141 for x in read_data(_loadtxt_chunksize):
1142 if X is None:
1143 X = np.array(x, dtype)
c:\python3.7.2\lib\site-packages\numpy\lib\npyio.py in read_data(chunk_size)
1066
1067 # Конвертировать каждое значение по его столбцу и сохранить
-> 1068 items = [conv(val) for (conv, val) in zip(converters, vals)]
1069
1070 # Затем упаковать это согласно вложенности dtype
c:\python3.7.2\lib\site-packages\numpy\lib\npyio.py in <listcomp>(.0)
1066
1067 # Конвертировать каждое значение по его столбцу и сохранить
-> 1068 items = [conv(val) for (conv, val) in zip(converters, vals)]
1069
1070 # Затем упаковать это согласно вложенности dtype
c:\python3.7.2\lib\site-packages\numpy\lib\npyio.py in floatconv(x)
773 if '0x' in x:
774 return float.fromhex(x)
--> 775 return float(x)
776
777 typ = dtype.type
ValueError: не удалось преобразовать строку в число с плавающей точкой: '"Дата"'
Как мне избавиться от этой ошибки?
Проблема может возникнуть из-за метатекста в файле .csv
или .txt
, который на самом деле не записан там, но копируется при загрузке его содержимого откуда-либо.
Я думаю, что сначала лучше импортировать ваши данные в массив или строку, а затем разбить их и сохранить в датафрейм, особенно когда ваши данные не слишком велики.
import csv
arrays = []
path = "C:\\Users\\Souro\\Downloads\\AXISBANK.csv"
with open(path, 'r') as f:
reader = csv.reader(f)
for row in reader:
row = str(row).replace('\\', '') # удалить обратную косую черту
arrays.append(row)
Затем посмотрите на массивы[:10], чтобы определить, где заканчиваются метаданные, и удалить нежелательные данные (метаданные), а затем преобразовать массив ‘arrays’ в датафрейм.
например:
arrays = arrays[9:]
df = pd.DataFrame(arrays[1:], columns=arrays[0]) #arrays[0] - это названия столбцов
Что касается ваших комментариев:
Если вы посмотрите на текст в каждой строке (выведите каждую строку), вы обнаружите, что в конце каждой строки есть обратная косая черта, так что с помощью
row = str(row).replace('\\', '')
мы заменяем каждую обратную косую черту на ничего (''
), эффективно удаляя её. Почему '\\'
? Обратная косая черта обычно вводит управляющую последовательность (например, вы можете написать '\n'
для символа новой строки), поэтому вы должны экранировать её (сырой парсинг, как r'a\b'
, работает, но r'\'
не работает: создатель Python выбрал делать так, чтобы последнее считалось синтаксической ошибкой).
И
open('text.txt', 'r')
открывает файл text.txt
в только для чтения режиме (r
).
Ответ или решение
Ошибка, с которой вы столкнулись при использовании функции np.loadtxt
из библиотеки NumPy, связана с тем, что данные в вашем CSV-файле содержат некорректные символы, что препятствует их правильному преобразованию в тип float
. В вашем случае, сообщение об ошибке указывает на проблему с символами, начинающимися с 
, а также на наличие строки с заголовками, которые NumPy пытается интерпретировать как числовые данные.
Причины проблемы
-
Бомба с нулями (Byte Order Mark, BOM): Символы

указывают на то, что файл был сохранен с кодировкой UTF-8 с BOM. Эти символы возникают в начале файла и могут привести к ошибкам при обработке данных. -
Заголовки: NumPy ожидает, что все строки в файле можно будет преобразовать в числа, но строка заголовка (
Date,Open,High,Low,Close,Adj Close,Volume
) не может быть преобразована вfloat
, что также вызывает ошибку.
Решения проблемы
Для устранения данной ошибки вы можете воспользоваться следующими подходами:
Подход 1: Пропуск заголовков и удаление BOM
Используйте аргументы skiprows
и dtype
в функции np.loadtxt
. Это поможет пропустить первую строку заголовка и корректно обработать данные.
import numpy as np
data = np.loadtxt(r"C:\Users\Souro\Downloads\Data.csv", delimiter=",", skiprows=1, dtype=np.float64)
Подход 2: Использование pandas
Библиотека Pandas гораздо более удобна для работы с CSV-файлами и легко справляется с заголовками и различными кодировками. Вы можете использовать следующий код для загрузки ваших данных:
import pandas as pd
df = pd.read_csv(r"C:\Users\Souro\Downloads\Data.csv", encoding='utf-8-sig')
Здесь encoding='utf-8-sig'
автоматически удаляет BOM (если он есть) и правильно загружает данные с заголовками.
Проверка загруженных данных
После загрузки данных с помощью Pandas вы можете просмотреть первые несколько строк, чтобы убедиться, что все загружено корректно:
print(df.head())
Заключение
Использование подхода с библиотекой Pandas обычно является предпочтительным, так как она предлагает много функций для обработки и анализа данных, а также справляется с многими форматами данных, которые могут вызывать проблемы в NumPy. В случае, если вы всё же хотите остаться с NumPy, обязательно пропустите заголовки и удалите BOM из файла CSV.
Если у вас возникнут дополнительные вопросы или сложности с загрузкой данных, пожалуйста, дайте знать, и я помогу вам разобраться!