Showing posts with label CSV. Show all posts
Showing posts with label CSV. Show all posts

24 June 2020

Панда - открываем CSV c яндекс-диска

Одна из задач, которая возникла у меня - перенос с одного компа с Windows и Excel данные на виртуалку с Убунтой. Чтобы не заморачиваться с копированием файлов можно выложить CSV, полученный из Excel на яндекс-диск и открыть его в Юпитере Пандой.
Ссылка для доступа будет иметь вид примерной такой :
https://yadi.sk/d/xxYYYzzzKKKzY

Для начала экспортируем то, что надо

import pandas as pd
import requests
from io import StringIO
from urllib.parse import urlencode


Далее заводим строчки:

# адрес на api яндекса
base_url = 'https://cloud-api.yandex.net/v1/disk/public/resources/download?'

# Наша ссылка
public_key = 'https://yadi.sk/d/xxYYYzzzKKKzY' 


Далее загружаем файл:

# Получаем загрузочную ссылку
final_url = base_url + urlencode(dict(public_key=public_key))
response = requests.get(final_url)
download_url = response.json()['href']

# Загружаем файл и сохраняем его
download_response = requests.get(download_url)


Формально можно записать файл, а потом подать его панде:

with open('temp.csv', 'wb') as f:
    f.write(download_response.content)
   
df = pd.read_csv('temp.csv')


Однако в данном случае Панда вылетит с ошибкой.
Причина тут вот какая: если вы сохраняете файл в CSV формате в Excel то используете MS-DOS CSV и у вас разделитель полей - точка с запятой, а не запятая, как в обычном CSV. Файл, с разделениям точкой с запятой, "умная" Панда читать отказывается.
Поэтому надо ей подсказать разделитель. Вот так:

df = pd.read_csv('temp.csv', sep=';')


Но и это не все - русские символы кодируются в кодировке cp866.
Поэтому если нужно перенести корректно русские данные, надо перекодировать символы в другую кодировку.



Собирая это все вместе и обходясь без промежуточного файла ( он желателен при отладке ), получаем:

# Перекодируем из cp866
csv_raw = StringIO( download_response.content.decode('cp866'))

# Читаем пандой прямо из буфера, подставляя нужный разделитель
df = pd.read_csv(csv_raw,  sep=';')


Вот получившиеся данные:


Ответ был подсмотрен тут : как скачивать файлы с яндекс диска

06 June 2020

Полезные ссылки по Pandas для начала

Работа с CSV средствами NumPy меня окончательно убедила в том, что надо переходить на Pandas. Парочка полезных ссылок для начала.

Аналитикам: большая шпаргалка по Pandas
Данная ссылка кроме всего прочего содержит ссылки на два модельных CSV файла, скачав которые, можно потренироваться в работе с Pandas.

Python 3 Pandas: Объекты Series и DataFrame. Построение Index
Вторую ссылку я скорее использовал как справочник - там пристыкованы картинки ( pdf ) которые хороши как наглядные шпаргалки.

Для работы с Pandas я использовал тот же самый Spyder в том числе его консоль IPyhon.

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.