Входные данные
Входные данные – это файл CSV на день 5.5.2020 от Тенденции мобильности сообщает База данных, опубликованная Apple. Отчеты публикуются ежедневно и отражают запросы на направления на картах Apple.
Входной файл CSV имеет четыре колонны строки: Geo_Type, Region, Practy_Type, Alternative_Name и каждый следующий столбец – это разница между мобильностью от 13.1.2020, представляющих поплавок и день, названный в столбце. И там проблемы начинаются.
Чтение CSV для Numpy Array
Я использовал родную функцию numpy library с именем genfromtxt. Мой начальный/наивный код для чтения файла, загруженного с отчетов о мобильности, заканчивается ошибкой кодирования.
import numpy as np def getData(): path = "data/applemobilitytrends-2020-05-05.csv" npcsv = np.genfromtxt(path, delimiter=',') print(npcsv) getData()
Ошибка:
Exception has occurred: UnicodeDecodeError 'charmap' codec can't decode byte 0x98 in position 5961: character maps toFile "C:\Users\marcel.kocisek\Documents\marcel\covid\examples\csv.py", line 5, in getData npcsv = np.genfromtxt(path, delimiter=',') File "C:\Users\marcel.kocisek\Documents\marcel\covid\examples\csv.py", line 8, in getData()
Исправление было легко, добавить кодировку в качестве параметра:
import numpy as np def getDataV2(): path = "data/applemobilitytrends-2020-05-05.csv" npcsv = np.genfromtxt(path, delimiter=',', encoding='utf8') print(npcsv) getDataV2()
Результат без первых 4 строковых столбцов и заголовков:
[[ nan nan nan ... nan nan nan] [ nan nan nan ... 36. 43.69 42.61] [ nan nan nan ... 43.41 49.59 46.44] ... [ nan nan nan ... 128.55 110.19 107.62] [ nan nan nan ... 113.52 104.54 104.41] [ nan nan nan ... 82.94 72.42 72.63]] [[ nan nan nan ... nan nan nan] [ nan nan nan ... 36. 43.69 42.61] [ nan nan nan ... 43.41 49.59 46.44] ... [ nan nan nan ... 128.55 110.19 107.62] [ nan nan nan ... 113.52 104.54 104.41] [ nan nan nan ... 82.94 72.42 72.63]]
Почему? Поскольку тип данных по умолчанию для результирования 2D Noat Array является NP.float, и невозможно преобразовать строковые названия состояний/регионов для плавания (логика). Следовательно, добавьте новый параметр для изменения NP.fload на NP.String.
npcsv = np.genfromtxt(path, delimiter=',', encoding='utf8', dtype=np.str)
Результатом является обмочная массив с заголовком и все значения в строке (важно, чтобы у нас были значения:))
[['geo_type' 'region' 'transportation_type' ... '2020-05-03' '2020-05-04' '2020-05-05'] ['country/region' 'Albania' 'driving' ... '36.0' '43.69' '42.61'] ['country/region' 'Albania' 'walking' ... '43.41' '49.59' '46.44'] ... ['sub-region' 'Östergötland County' 'driving' ... '128.55' '110.19' '107.62'] ['sub-region' 'Ústí nad Labem Region' 'driving' ... '113.52' '104.54' '104.41'] ['sub-region' 'Žilina Region' 'driving' ... '82.94' '72.42' '72.63']]
Чтобы игнорировать заголовок, вы можете использовать параметр Skip_Header для функции genfromtxt
npcsv = np.genfromtxt(path, delimiter=',', encoding='utf8', dtype=np.str, skip_header=1)
Или Numpy 2D-индексация массива для игнорирования первой строки [1:,:]:
npcsv = np.genfromtxt(path, delimiter=',', encoding='utf8', dtype=np.str) print(npcsv[1:, :])
Результат:
[['country/region' 'Albania' 'driving' ... '36.0' '43.69' '42.61'] ['country/region' 'Albania' 'walking' ... '43.41' '49.59' '46.44'] ['country/region' 'Argentina' 'driving' ... '16.44' '32.01' '33.63'] ... ['sub-region' 'Östergötland County' 'driving' ... '128.55' '110.19' '107.62'] ['sub-region' 'Ústí nad Labem Region' 'driving' ... '113.52' '104.54' '104.41'] ['sub-region' 'Žilina Region' 'driving' ... '82.94' '72.42' '72.63']]
Оригинал: “https://dev.to/marcelgeo/problems-by-reading-csv-file-with-numpy-python-library-1804”