Рубрики
Без рубрики

Проблемы, чтение файла CSV с Numpy Python Library

Первая часть серии о анализе данных в Python. Пример данных является COVID-19 Apple Mobility https://www.apple.com/covid19/mobility. Github repo https://github.com/marcelgeo/python-messages-apple-mobility. Теги с Python, Numpy, Datascity, Showdev.

Входные данные

Входные данные – это файл 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 to 
  File "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”