Функция np.loadtxt выдает ошибку, не удалось преобразовать строку в число с плавающей запятой: ‘”Date”‘

Вопрос или проблема

Это мои данные о фондовом рынке в формате 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 пытается интерпретировать как числовые данные.

Причины проблемы

  1. Бомба с нулями (Byte Order Mark, BOM): Символы  указывают на то, что файл был сохранен с кодировкой UTF-8 с BOM. Эти символы возникают в начале файла и могут привести к ошибкам при обработке данных.

  2. Заголовки: 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.

Если у вас возникнут дополнительные вопросы или сложности с загрузкой данных, пожалуйста, дайте знать, и я помогу вам разобраться!

Оцените материал
Добавить комментарий

Капча загружается...