Showing posts with label NumPy. Show all posts
Showing posts with label NumPy. Show all posts

05 June 2020

Читаем csv средствами NumPy

Модель проверяется по реальным данным. Одним из наиболее употребительных методов их хранения, являются CSV файлы или ВеличиныРазделенныеЗапятой. Самый очевидный способ их чтения - воспользоваться функциями библиотеки NumPy, а именно функцией loadtxt.
Удобство в том, что можно несколько колонок прочитать одновременно.
Но тогда надо указывать параметр unpack=True чтобы сделать  декомпозицию и присвоить данные нескольким массивам, перечисленным через запятую
Вот пример CSV файла



Как можно видеть первой строчкой идет заголовок, его надо пропустть, для этого ставим параметр skiprows=1. Другим параметром usecols = (1,2) укзываем что надо читать колонки 1 и 2.
Код:

dIreal, Ireal  = np.loadtxt('CovidData.csv',
    delimiter=',',  # разделитель - запятая
    usecols = (1,2),  #  читаем 1 и 2 колонки ( нумерация с нуля )
    skiprows=1,  # пропускаем первую строку заголовка
    unpack=True) # декомпозиция колонок на массивы ( списки )


После выполнения колонки dI и Isum окажутся в массивах dIreal и Ireal соответственно.
Для чтения данных для колонк D и R нам надо пропустить строки - они начинаются позже. Код будет аналогичный, но с бОльшим пропуском

Dreal, Rreal = np.loadtxt('CovidData.csv',
    delimiter=',',
    usecols = (4,6),
    skiprows=16,
    unpack=True)


Однако "шаманство" начинается если нам надо прочитать даты, особенно если они имеют другой формат - в данном случае надо применять конвертер или лямбда-функцию конвертирования данных. Код:

import datetime as dt

# лямбда-функция конвертирования данных
conv2date = lambda x: dt.datetime.strptime ( x.decode("utf-8"), '%d.%m.%Y')

datesMain = np.loadtxt('CovidData.csv',
     delimiter=',',
     usecols = (0), # первая колонка
     converters={0:conv2date}, # применяем конвертер
     dtype='datetime64[D]', # указываем целевой тип данных
     skiprows=1 )


Таким образом можно прочитать и даты - в моем случае я для дат использовал тире, как более читаемый символ-разделитель в CSV.

Однако такой набор кода не очень удобен, поэтому я стал смотреть в сторону библиотеки для работы с данными - Pandas.