Поиск по блогу

воскресенье, 22 марта 2015 г.

Грязные AEBto3tables - осваиваем 10 из 100 опций read_csv Pandas - как читать построчно куски csv файла

Здесь возвращаемся к папкам с "замусоренными" полуфабрикатами после парсинга pdf-файлов с данными продаж автомобилей с сайта AEBrus.ru в 2014г.
Каждый файл надо просмотреть, убрать особенности форматирования в каждом столбце (например, в качестве разделителея разрядов могут испоьзоваться и запятые, и пробелы), добавть столбец даты(месяца)... не говоря уже о такой ерунде, как traling spaces, кавычки, лишние звездочки (*) и прочее... Начал считывать файл в DataFrame и тут же получил ошибку "CParserError: Error tokenizing data. C error: Expected 8 fields in line 38, saw 9", быстро обнаружил, что можно просто не читать эту строку..., а потом и обработчик ошибок нашелся...

Из w8 скопировал папки на флешку, вот они теперь здесь (пишу в Kali)

In [1]:
!ls "/media/MYLINUXLIVE/Documents/Xpdf"
AEB_2014_4      AEBru_2014_4  aebru_2015_all_txt  text1.txt
AEB_2014_4_tab3.csv  aebru_2014_all  aerbu_2014_all_csv
AEB_2014_4.txt      aebru_2014_all_txt  aerbu_2015_all_csv
aeb_papers      aebru_2015_all  text1.html
In [6]:
!ls /media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv
1  1aug  1aug2 1feb  2  2aug  2aug2  2feb  3  3aug  3aug2  3feb

Так как форматы таблиц изменялись в течение года, то пришлось использовать разные варианты парсеров, это хорошие упражнения для начинающего кодера, часть из них я записал в этом блоге см. ссылки под этим постом (Здесьметка: AEBto3tables)

Здесь же я займусь тем, выберу наиболее удачные файлы, потом каждый почищу и подгоню к единому формату, потом создам отдельную папку, соберу в нее единообразные файлы и склею их в один. Но сначала о коде парсера. Не надо про него забывать, он нам очень скоро понадобится.

Отметим, что пака с кодом для обработки pdf теперь тоже есть на флешке.

In [2]:
!ls /media/MYLINUXLIVE/SkyDrive/Docs/pdftotext/AEB/pdgtotext
aebto3tables.py  aebto3tables.pyc  __init__.py pdgtotext.nja

Запомним, что конвертации pdftotext я проделел на компьютере w8, и там в aebto3tables.py все пути файлов абсолютные, и как раз в это время w8 подвис..., так что в голове мысли об установке pdftotext Linux, но я их пока успешно отгоняю..., хотя, надо бы проверить, может уже все стоит:

In [3]:
!pdftotext
pdftotext version 0.18.4
Copyright 2005-2011 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2004 Glyph & Cog, LLC
Usage: pdftotext [options] <PDF-file> [<text-file>]
  -f <int>          : first page to convert
  -l <int>          : last page to convert
  -r <fp>           : resolution, in DPI (default is 72)
  -x <int>          : x-coordinate of the crop area top left corner
  -y <int>          : y-coordinate of the crop area top left corner
  -W <int>          : width of crop area in pixels (default is 0)
  -H <int>          : height of crop area in pixels (default is 0)
  -layout           : maintain original physical layout
  -raw              : keep strings in content stream order
  -htmlmeta         : generate a simple HTML file, including the meta information
  -enc <string>     : output text encoding name
  -listenc          : list available encodings
  -eol <string>     : output end-of-line convention (unix, dos, or mac)
  -nopgbrk          : don't insert page breaks between pages
  -bbox             : output bounding box for each word and page size to html.  Sets -htmlmeta
  -opw <string>     : owner password (for encrypted files)
  -upw <string>     : user password (for encrypted files)
  -q                : don't print any messages or errors
  -v                : print copyright and version info
  -h                : print usage information
  -help             : print usage information
  --help            : print usage information
  -?                : print usage information

Вот за что я люблю Kali... и Дебиана. Хоть убей, не помню, чтобы я это устанавливал... Скорее всего, оно уже было... Но, так или иначе, мы убедились, что у нас все есть...

In [8]:
!ls /media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2
eng_car-sales-in-april-2014.csv     eng_car-sales-in-october-2014.csv
eng_car-sales-in-august-2014.csv    eng_car-sales-in-september-2014.csv
eng_car-sales-in-december-2014.csv  sales-in-december_2013_eng_final.csv
eng_car-sales-in-july-2014.csv     sales-in-february_2014_eng_final.csv
eng_car-sales-in-june-2014.csv     sales-in-january_2014_eng_final_1.csv
eng_car-sales-in-may-2014.csv     sales-in-march_2014_eng_final.csv
eng_car-sales-in-november-2014.csv
In [10]:
# The usual preamble
%matplotlib inline

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# Make the graphs a bit prettier, and bigger
pd.set_option('display.mpl_style', 'default')
plt.rcParams['figure.figsize'] = (15, 5)

Читаем данные из CSV & Text files

Сначала пробуем взять первые три строки из файла и использовать StringIO

In [44]:
from StringIO import StringIO
In [63]:
data ='"2014","2013","YoY %","2014","2013","YoY %",/n"Lada","128633","151527","-15%","37030","44100","-16%",\n"Renault*","63647","67208","-5%","17395","19178","-9%",\n'
In [58]:
StringIO(data)
Out[58]:
<StringIO.StringIO instance at 0xae4f48c>
In [64]:
apr1 = pd.read_csv(StringIO(data))
In [65]:
apr1
Out[65]:
2014 2013 YoY % 2014.1 2013.1 YoY %.1 /n"Lada" 128633 151527 -15% 37030 44100 -16% Unnamed: 13
0 Renault* 63647 67208 -5% 17395 19178 -9% NaN NaN NaN NaN NaN NaN NaN

Встроенный парсер не хочет разбирать такие строки..., чтобы эту проблему решить, нужно испоьзовать объект "csv", далее я испоьзовал решение с quoting=csv.QUOTE_ALL. А пока приблизим наши действия к реальным - будем работать с файлами, ... и не мудрить со StringIO(data)

Однако, вот интересная идея фомирования строк с .join() ...в первоисточнике Pandas read_csv and UTF-16 еще интересный пример с .read().decode('utf-16').encode('utf-8') ... но это совсем далеко от нашей темы, так что запомним ссылку и пойдем дальше

In [69]:
a = ['Venezuela', 'N/A', 'President', '10/7/12', 'Hugo Rafael Chavez Frias', 'Hugo Ch\xc3\xa1vez', 
     'Hugo Ch\xc3\xa1vez', 'Hugo Chavez', 'Hugo Ch\xc3\xa1vez Fr\xc3\xadas', 'Hugo Chavez', 'Hugo Ch\xc3\xa1vez']

pd.read_csv(StringIO('\t'.join(a)), delimiter='\t')
Out[69]:
Venezuela N/A President 10/7/12 Hugo Rafael Chavez Frias Hugo Chávez Hugo Chávez.1 Hugo Chavez Hugo Chávez Frías Hugo Chavez.1 Hugo Chávez.2

Посмотрим, что тут у нас за файл... Ага, двойные кавычки

In [ ]:
# %load '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/eng_car-sales-in-april-2014.csv'
"2014","2013","YoY %","2014","2013","YoY %",
"Lada","128633","151527","-15%","37030","44100","-16%",
"Renault*","63647","67208","-5%","17395","19178","-9%",
"KIA","60033","60027","0%","17744","18303","-3%",
"Nissan*","57579","44188","30%","11835","8272","43%",
"Hyundai*","57240","56582","1%","15933","15868","0%",
"Toyota*","50160","44610","12%","15103","15278","-1%",
"Chevrolet","48586","52489","-7%","13279","16083","-17%",
"VW","45828","49477","-7%","11497","14203","-19%",
"Mitsubishi","27943","26322","6%","6101","7182","-15%",
"Škoda","26616","26107","2%","7724","7488","3%",
"Opel","24493","26731","-8%","6493","6899","-6%",
"Ford*","22760","32289","-30%","5387","8635","-38%",
"GAZ LCV*","20318","24166","-16%","6274","7183","-13%",
"Daewoo","17369","20139","-14%","4511","4241","6%",
"Mazda","15818","12831","23%","4208","2206","91%",
"Mercedes-Benz","14821","12165","22%","4437","3570","24%",
"BMW","12836","12063","6%","3136","3245","-3%",
"UAZ*","12539","15931","-21%","4073","4580","-11%",
"Audi","11946","11929","0%","3660","3651","0%",
"Peugeot*","8792","11607","-24%","2015","3300","-39%",
"Honda","8760","7697","14%","1971","2749","-28%",
"Citroёn*","8164","8619","-5%","1925","2672","-28%",
"SsangYong","7739","9409","-18%","2006","2306","-13%",
"Suzuki","7113","8954","-21%","1983","2921","-32%",
"Lifan","6783","6437","5%","2178","2116","3%",
"Land Rover","6769","6141","10%","1866","1641","14%",
"Chery","6752","6269","8%","1801","2112","-15%",
"Geely","6598","6573","0%","1747","2312","-24%",
"Great Wall","5595","6928","-19%","1735","2243","-23%",
"Subaru","5495","5897","-7%","1772","1888","-6%",
"Lexus","5475","4938","11%","2100","1726","22%",
"Volvo","4709","3974","18%","1467","1066","38%",
"VW vans*","4485","4917","-9%","1204","1451","-17%",
"Infiniti","3114","3246","-4%","776","427","82%",
"Jeep","2507","1198","109%","650","353","84%",
"FIAT*","2437","1890","29%","682","646","6%",
"Mercedes-Benz","vans*","2114","1201","76%","604","366","65%",
"Porsche","1191","1149","4%","481","372","29%",
"FAW","1129","1028","10%","342","522","-34%",
"Jaguar","558","442","26%","152","121","26%",
"SEAT","550","1217","-55%","241","357","-32%",
"MINI","549","803","-32%","149","244","-39%",
"Cadillac","493","551","-11%","154","173","-11%",
"BAW*","472","634","-26%","118","151","-22%",
"ZAZ","352","1331","-74%","56","401","-86%",
"Changan","285","-","-","90","-","-",
"Haima","161","86","87%","71","3","2267%",
"Acura2","112","-","-","112","-","-",
"smart","99","38","161%","27","14","93%",
"Isuzu*","98","32","206%","42","9","367%",
"Bogdan3","92","1024","-91%","-","247","-",
"Brilliance4","75","-","-","75","-","-",
"JAC5","58","-","-","58","-","-",
"Luxgen","57","-","-","18","-","-",
"TagAZ*","52","94","-45%","14","30","-53%",
"Chrysler","46","54","-15%","10","15","-33%",
"Izh","18","374","-95%","0","123","-100%",
"Dodge","15","74","-80%","6","23","-74%",
"Foton*","9","6","50%","2","0","-",
"Alfa Romeo","9","-","-","6","-","-",

Вспоминаем. Как создать пустой файл в LInux?

In [30]:
!touch /media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/000_eng_car-sales-in-april-2014.csv

Теперь можно записать в него содержание вот этой ячейки командой %%writefile:

In [36]:
%%writefile /media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/000_eng_car-sales-in-april-2014.csv
"2014","2013","YoY %","2014","2013","YoY %",
"Lada","128633","151527","-15%","37030","44100","-16%",
"Renault*","63647","67208","-5%","17395","19178","-9%",
"KIA","60033","60027","0%","17744","18303","-3%",
"Nissan*","57579","44188","30%","11835","8272","43%",
"Hyundai*","57240","56582","1%","15933","15868","0%",
"Toyota*","50160","44610","12%","15103","15278","-1%",
"Chevrolet","48586","52489","-7%","13279","16083","-17%",
"VW","45828","49477","-7%","11497","14203","-19%",
"Mitsubishi","27943","26322","6%","6101","7182","-15%",
Overwriting /media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/000_eng_car-sales-in-april-2014.csv

Теперь решим вопрос с двойными кавычками в CSV файле

Красивый вариант с использованием csv

In [16]:
import csv

Поскольку сначала файл не хотел загружаться, то я начал резать его на куски вручную(подробности ниже). Потом догадался, что можно просто задавать количество (первых) строк для загрузки nrows=36

Но оказывается и файл не загружается, здесь я не стал записывать ошибки, а просто вставил решение quoting=csv.QUOTE_ALL, которое нашел ниже по тексту

In [ ]:
#Вот эта команда закончилась ошибкой
pd.read_csv(aprpath, quoting=csv.QUOTE_ALL)
CParserError: Error tokenizing data. C error: Expected 8 fields in line 38, saw 9

Пожалуй, что я нашел способ проверятть "запорченные" csv-файлы, пока не понимаю, почему строка 37 тоже выдала ошибку...

In [42]:
pd.read_csv(aprpath, quoting=csv.QUOTE_ALL, nrows=36)
Out[42]:
2014 2013 YoY % 2014.1 2013.1 YoY %.1 Unnamed: 6
Lada 128633 151527 -15% 37030 44100 -16% NaN
Renault* 63647 67208 -5% 17395 19178 -9% NaN
KIA 60033 60027 0% 17744 18303 -3% NaN
Nissan* 57579 44188 30% 11835 8272 43% NaN
Hyundai* 57240 56582 1% 15933 15868 0% NaN
Toyota* 50160 44610 12% 15103 15278 -1% NaN
Chevrolet 48586 52489 -7% 13279 16083 -17% NaN
VW 45828 49477 -7% 11497 14203 -19% NaN
Mitsubishi 27943 26322 6% 6101 7182 -15% NaN
Škoda 26616 26107 2% 7724 7488 3% NaN
Opel 24493 26731 -8% 6493 6899 -6% NaN
Ford* 22760 32289 -30% 5387 8635 -38% NaN
GAZ LCV* 20318 24166 -16% 6274 7183 -13% NaN
Daewoo 17369 20139 -14% 4511 4241 6% NaN
Mazda 15818 12831 23% 4208 2206 91% NaN
Mercedes-Benz 14821 12165 22% 4437 3570 24% NaN
BMW 12836 12063 6% 3136 3245 -3% NaN
UAZ* 12539 15931 -21% 4073 4580 -11% NaN
Audi 11946 11929 0% 3660 3651 0% NaN
Peugeot* 8792 11607 -24% 2015 3300 -39% NaN
Honda 8760 7697 14% 1971 2749 -28% NaN
Citroёn* 8164 8619 -5% 1925 2672 -28% NaN
SsangYong 7739 9409 -18% 2006 2306 -13% NaN
Suzuki 7113 8954 -21% 1983 2921 -32% NaN
Lifan 6783 6437 5% 2178 2116 3% NaN
Land Rover 6769 6141 10% 1866 1641 14% NaN
Chery 6752 6269 8% 1801 2112 -15% NaN
Geely 6598 6573 0% 1747 2312 -24% NaN
Great Wall 5595 6928 -19% 1735 2243 -23% NaN
Subaru 5495 5897 -7% 1772 1888 -6% NaN
Lexus 5475 4938 11% 2100 1726 22% NaN
Volvo 4709 3974 18% 1467 1066 38% NaN
VW vans* 4485 4917 -9% 1204 1451 -17% NaN
Infiniti 3114 3246 -4% 776 427 82% NaN
Jeep 2507 1198 109% 650 353 84% NaN
FIAT* 2437 1890 29% 682 646 6% NaN

Напоминаем, сначала была ошибка CParserError: Error tokenizing data. C error: Expected 8 fields in line 38, saw 9

я попробовал задать параметр nrows=38, потом 37, и на nrows=36 появилась, наконец вот эта таблица наверху. Я скопировал из распечатки файла (выше в этом посте) подозрительные строчки после "фиата", вот они:

In [ ]:
"FIAT*",                "2437","1890","29%","682","646","6%",
"Mercedes-Benz","vans*","2114","1201","76%","604","366","65%",
"Porsche",              "1191","1149","4%","481","372","29%",

И вот она, очевидная ошибка, которая коварно "прокралась" из парсера в мой замечательный апрельский файл. Хочется сразу ее исправить, еле сдерживаюсь..., но нельзя надо сначала поискать похожие..., а потом уже решать, как с ними со всеми бороться.

Как я искал причину ошибки

Когда выше выскочила ошибка, я не придумал ничего лучше, чем резать этот "испорченный" файл на куски... Из первого куска я постарался убрать все подозрения на ошибки (строку заголовка) и успешно загрузил 000_eng_car-sales-in-april-2014.csv ... Потом добавил строку заголовков, надеясь, что ошибка здесь, но нет, все снова загрузилось.

In [32]:
aprpath000 = '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/000_eng_car-sales-in-april-2014.csv'
In [37]:
pd.read_csv(aprpath000, quoting=csv.QUOTE_ALL)
Out[37]:
2014 2013 YoY % 2014.1 2013.1 YoY %.1 Unnamed: 6
Lada 128633 151527 -15% 37030 44100 -16% NaN
Renault* 63647 67208 -5% 17395 19178 -9% NaN
KIA 60033 60027 0% 17744 18303 -3% NaN
Nissan* 57579 44188 30% 11835 8272 43% NaN
Hyundai* 57240 56582 1% 15933 15868 0% NaN
Toyota* 50160 44610 12% 15103 15278 -1% NaN
Chevrolet 48586 52489 -7% 13279 16083 -17% NaN
VW 45828 49477 -7% 11497 14203 -19% NaN
Mitsubishi 27943 26322 6% 6101 7182 -15% NaN

Итак, оказалось, что дело не в заголовке, а строке 37... Выше я уже нашел вариант - прочитать (по сути) первые 36 строк из файла и поместить их в объект DataFrame. Поищем другие варианты здесь есть полный перечень всех опций: CSV & Text files

А здесь я наше пример для skiprows=[3,4,6] Видео и примеры к "Introduction to Pandas" (часть 1)

In [68]:
pd.read_csv(aprpath, quoting=csv.QUOTE_ALL, nrows=38, skiprows=[1,2,34,37])
Out[68]:
2014 2013 YoY % 2014.1 2013.1 YoY %.1 Unnamed: 6
KIA 60033 60027 0% 17744 18303 -3% NaN
Nissan* 57579 44188 30% 11835 8272 43% NaN
Hyundai* 57240 56582 1% 15933 15868 0% NaN
Toyota* 50160 44610 12% 15103 15278 -1% NaN
Chevrolet 48586 52489 -7% 13279 16083 -17% NaN
VW 45828 49477 -7% 11497 14203 -19% NaN
Mitsubishi 27943 26322 6% 6101 7182 -15% NaN
Škoda 26616 26107 2% 7724 7488 3% NaN
Opel 24493 26731 -8% 6493 6899 -6% NaN
Ford* 22760 32289 -30% 5387 8635 -38% NaN
GAZ LCV* 20318 24166 -16% 6274 7183 -13% NaN
Daewoo 17369 20139 -14% 4511 4241 6% NaN
Mazda 15818 12831 23% 4208 2206 91% NaN
Mercedes-Benz 14821 12165 22% 4437 3570 24% NaN
BMW 12836 12063 6% 3136 3245 -3% NaN
UAZ* 12539 15931 -21% 4073 4580 -11% NaN
Audi 11946 11929 0% 3660 3651 0% NaN
Peugeot* 8792 11607 -24% 2015 3300 -39% NaN
Honda 8760 7697 14% 1971 2749 -28% NaN
Citroёn* 8164 8619 -5% 1925 2672 -28% NaN
SsangYong 7739 9409 -18% 2006 2306 -13% NaN
Suzuki 7113 8954 -21% 1983 2921 -32% NaN
Lifan 6783 6437 5% 2178 2116 3% NaN
Land Rover 6769 6141 10% 1866 1641 14% NaN
Chery 6752 6269 8% 1801 2112 -15% NaN
Geely 6598 6573 0% 1747 2312 -24% NaN
Great Wall 5595 6928 -19% 1735 2243 -23% NaN
Subaru 5495 5897 -7% 1772 1888 -6% NaN
Lexus 5475 4938 11% 2100 1726 22% NaN
Volvo 4709 3974 18% 1467 1066 38% NaN
VW vans* 4485 4917 -9% 1204 1451 -17% NaN
Jeep 2507 1198 109% 650 353 84% NaN
FIAT* 2437 1890 29% 682 646 6% NaN
Porsche 1191 1149 4% 481 372 29% NaN
FAW 1129 1028 10% 342 522 -34% NaN
Jaguar 558 442 26% 152 121 26% NaN
SEAT 550 1217 -55% 241 357 -32% NaN
MINI 549 803 -32% 149 244 -39% NaN

Полагаю, что для выбора строк можно использовать range range(start, stop[, step])

In [86]:
skiprows = range(20) + range(37,38) + range(40,50)

Сначла я попытался испоьзовать append(), но оказалось, что эта команда не проходит после встроенной функции, да и проще использовать range(37,38), и как мне могла прийти в голову такая глупость, как append()...

In [87]:
skiprows 
Out[87]:
[0,
 1,
 2,
 3,
 4,
 5,
 6,
 7,
 8,
 9,
 10,
 11,
 12,
 13,
 14,
 15,
 16,
 17,
 18,
 19,
 37,
 40,
 41,
 42,
 43,
 44,
 45,
 46,
 47,
 48,
 49]

Здесь я вспоминал, как можно склдывать списки

In [81]:
r1 = range(20)
In [74]:
range(20)
Out[74]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
In [80]:
range(5) + range(40,50)
Out[80]:
[0, 1, 2, 3, 4, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
In [82]:
r1.append(33)
In [83]:
r1
Out[83]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 33]
In [88]:
pd.read_csv(aprpath, quoting=csv.QUOTE_ALL, nrows=38, skiprows=skiprows)
Out[88]:
Peugeot* 8792 11607 -24% 2015 3300 -39% Unnamed: 7
0 Honda 8760 7697 14% 1971 2749 -28% NaN
1 Citroёn* 8164 8619 -5% 1925 2672 -28% NaN
2 SsangYong 7739 9409 -18% 2006 2306 -13% NaN
3 Suzuki 7113 8954 -21% 1983 2921 -32% NaN
4 Lifan 6783 6437 5% 2178 2116 3% NaN
5 Land Rover 6769 6141 10% 1866 1641 14% NaN
6 Chery 6752 6269 8% 1801 2112 -15% NaN
7 Geely 6598 6573 0% 1747 2312 -24% NaN
8 Great Wall 5595 6928 -19% 1735 2243 -23% NaN
9 Subaru 5495 5897 -7% 1772 1888 -6% NaN
10 Lexus 5475 4938 11% 2100 1726 22% NaN
11 Volvo 4709 3974 18% 1467 1066 38% NaN
12 VW vans* 4485 4917 -9% 1204 1451 -17% NaN
13 Infiniti 3114 3246 -4% 776 427 82% NaN
14 Jeep 2507 1198 109% 650 353 84% NaN
15 FIAT* 2437 1890 29% 682 646 6% NaN
16 Porsche 1191 1149 4% 481 372 29% NaN
17 FAW 1129 1028 10% 342 522 -34% NaN
18 Isuzu* 98 32 206% 42 9 367% NaN
19 Bogdan3 92 1024 -91% - 247 - NaN
20 Brilliance4 75 - - 75 - - NaN
21 JAC5 58 - - 58 - - NaN
22 Luxgen 57 - - 18 - - NaN
23 TagAZ* 52 94 -45% 14 30 -53% NaN
24 Chrysler 46 54 -15% 10 15 -33% NaN
25 Izh 18 374 -95% 0 123 -100% NaN
26 Dodge 15 74 -80% 6 23 -74% NaN
27 Foton* 9 6 50% 2 0 - NaN
28 Alfa Romeo 9 - - 6 - - NaN

И тут обнаруживатеся, что вторая опция skiprows=skiprows отменяет первую nrows=38, ... Надо быть внимательным, здесь можно создать себе серьезные проблемы.

А как определить номер последней строки?

Заодно пробуем убрать прибамбас с кавычками quoting=csv.QUOTE_ALL, ... И таки да! все работает "на автомате", это приятно, однако. Я изначально неправильно грешил на кавычки и запятые... Критичным оказывается только количество запятых (разделителей).

In [90]:
pd.read_csv(aprpath,  skiprows=[37,])
Out[90]:
2014 2013 YoY % 2014.1 2013.1 YoY %.1 Unnamed: 6
Lada 128633 151527 -15% 37030 44100 -16% NaN
Renault* 63647 67208 -5% 17395 19178 -9% NaN
KIA 60033 60027 0% 17744 18303 -3% NaN
Nissan* 57579 44188 30% 11835 8272 43% NaN
Hyundai* 57240 56582 1% 15933 15868 0% NaN
Toyota* 50160 44610 12% 15103 15278 -1% NaN
Chevrolet 48586 52489 -7% 13279 16083 -17% NaN
VW 45828 49477 -7% 11497 14203 -19% NaN
Mitsubishi 27943 26322 6% 6101 7182 -15% NaN
Škoda 26616 26107 2% 7724 7488 3% NaN
Opel 24493 26731 -8% 6493 6899 -6% NaN
Ford* 22760 32289 -30% 5387 8635 -38% NaN
GAZ LCV* 20318 24166 -16% 6274 7183 -13% NaN
Daewoo 17369 20139 -14% 4511 4241 6% NaN
Mazda 15818 12831 23% 4208 2206 91% NaN
Mercedes-Benz 14821 12165 22% 4437 3570 24% NaN
BMW 12836 12063 6% 3136 3245 -3% NaN
UAZ* 12539 15931 -21% 4073 4580 -11% NaN
Audi 11946 11929 0% 3660 3651 0% NaN
Peugeot* 8792 11607 -24% 2015 3300 -39% NaN
Honda 8760 7697 14% 1971 2749 -28% NaN
Citroёn* 8164 8619 -5% 1925 2672 -28% NaN
SsangYong 7739 9409 -18% 2006 2306 -13% NaN
Suzuki 7113 8954 -21% 1983 2921 -32% NaN
Lifan 6783 6437 5% 2178 2116 3% NaN
Land Rover 6769 6141 10% 1866 1641 14% NaN
Chery 6752 6269 8% 1801 2112 -15% NaN
Geely 6598 6573 0% 1747 2312 -24% NaN
Great Wall 5595 6928 -19% 1735 2243 -23% NaN
Subaru 5495 5897 -7% 1772 1888 -6% NaN
Lexus 5475 4938 11% 2100 1726 22% NaN
Volvo 4709 3974 18% 1467 1066 38% NaN
VW vans* 4485 4917 -9% 1204 1451 -17% NaN
Infiniti 3114 3246 -4% 776 427 82% NaN
Jeep 2507 1198 109% 650 353 84% NaN
FIAT* 2437 1890 29% 682 646 6% NaN
Porsche 1191 1149 4% 481 372 29% NaN
FAW 1129 1028 10% 342 522 -34% NaN
Jaguar 558 442 26% 152 121 26% NaN
SEAT 550 1217 -55% 241 357 -32% NaN
MINI 549 803 -32% 149 244 -39% NaN
Cadillac 493 551 -11% 154 173 -11% NaN
BAW* 472 634 -26% 118 151 -22% NaN
ZAZ 352 1331 -74% 56 401 -86% NaN
Changan 285 - - 90 - - NaN
Haima 161 86 87% 71 3 2267% NaN
Acura2 112 - - 112 - - NaN
smart 99 38 161% 27 14 93% NaN
Isuzu* 98 32 206% 42 9 367% NaN
Bogdan3 92 1024 -91% - 247 - NaN
Brilliance4 75 - - 75 - - NaN
JAC5 58 - - 58 - - NaN
Luxgen 57 - - 18 - - NaN
TagAZ* 52 94 -45% 14 30 -53% NaN
Chrysler 46 54 -15% 10 15 -33% NaN
Izh 18 374 -95% 0 123 -100% NaN
Dodge 15 74 -80% 6 23 -74% NaN
Foton* 9 6 50% 2 0 - NaN
Alfa Romeo 9 - - 6 - - NaN
In [93]:
tabpd = pd.read_csv(aprpath,  skiprows=[37,])
In [96]:
tabpd.ix[-1]
Out[96]:
2014            9
2013            -
YoY %           -
2014.1          6
2013.1          -
YoY %.1         -
Unnamed: 6    NaN
Name: Alfa Romeo, dtype: object

Отложим вопрос о номере последеней строки, поскольку эти свойства решено рассмотреть в отдельных новых постах (см. конец поста - я там захлебнулся) ради того, чтобы "добить" варианты импорта read_csv

Итак, мы научились использовать опции nrows=38, skiprows=[1,2,34,37], они позволяют не считывать из файла определенные строки. Но (в документации) есть и более серьезные возможности. Здесь я приведу только две ссылки на две группы опций:

In [108]:
pd.read_csv(aprpath,  error_bad_lines=False, nrows=38)
Skipping line 38: expected 8 fields, saw 9

Out[108]:
2014 2013 YoY % 2014.1 2013.1 YoY %.1 Unnamed: 6
Lada 128633 151527 -15% 37030 44100 -16% NaN
Renault* 63647 67208 -5% 17395 19178 -9% NaN
KIA 60033 60027 0% 17744 18303 -3% NaN
Nissan* 57579 44188 30% 11835 8272 43% NaN
Hyundai* 57240 56582 1% 15933 15868 0% NaN
Toyota* 50160 44610 12% 15103 15278 -1% NaN
Chevrolet 48586 52489 -7% 13279 16083 -17% NaN
VW 45828 49477 -7% 11497 14203 -19% NaN
Mitsubishi 27943 26322 6% 6101 7182 -15% NaN
Škoda 26616 26107 2% 7724 7488 3% NaN
Opel 24493 26731 -8% 6493 6899 -6% NaN
Ford* 22760 32289 -30% 5387 8635 -38% NaN
GAZ LCV* 20318 24166 -16% 6274 7183 -13% NaN
Daewoo 17369 20139 -14% 4511 4241 6% NaN
Mazda 15818 12831 23% 4208 2206 91% NaN
Mercedes-Benz 14821 12165 22% 4437 3570 24% NaN
BMW 12836 12063 6% 3136 3245 -3% NaN
UAZ* 12539 15931 -21% 4073 4580 -11% NaN
Audi 11946 11929 0% 3660 3651 0% NaN
Peugeot* 8792 11607 -24% 2015 3300 -39% NaN
Honda 8760 7697 14% 1971 2749 -28% NaN
Citroёn* 8164 8619 -5% 1925 2672 -28% NaN
SsangYong 7739 9409 -18% 2006 2306 -13% NaN
Suzuki 7113 8954 -21% 1983 2921 -32% NaN
Lifan 6783 6437 5% 2178 2116 3% NaN
Land Rover 6769 6141 10% 1866 1641 14% NaN
Chery 6752 6269 8% 1801 2112 -15% NaN
Geely 6598 6573 0% 1747 2312 -24% NaN
Great Wall 5595 6928 -19% 1735 2243 -23% NaN
Subaru 5495 5897 -7% 1772 1888 -6% NaN
Lexus 5475 4938 11% 2100 1726 22% NaN
Volvo 4709 3974 18% 1467 1066 38% NaN
VW vans* 4485 4917 -9% 1204 1451 -17% NaN
Infiniti 3114 3246 -4% 776 427 82% NaN
Jeep 2507 1198 109% 650 353 84% NaN
FIAT* 2437 1890 29% 682 646 6% NaN
Porsche 1191 1149 4% 481 372 29% NaN
FAW 1129 1028 10% 342 522 -34% NaN

skip_footer: number of lines to skip at bottom of file (default 0) #(Unsupported with engine='c')

Теперь посмотрим, как эти 38 строк будут считыватьс по 10 штук, если в последнем "ломте" есть неправильная строка

In [ ]:
pd.read_csv(aprpath,  nrows=38,  chunksize=10) # error_bad_lines=False,
NotImplementedError: 'nrows' and 'chunksize' can not be used together yet

Эти две опции не могут испоьзоваться вместе, уберем одну

In [111]:
reader = pd.read_csv(aprpath, chunksize=10) # error_bad_lines=False,
In [ ]:
for chunk in reader:
    print(chunk)
###
CParserError: Error tokenizing data. C error: Expected 8 fields in line 38, saw 9

А зачем мудрить, если есть встроенный обработчик таких ошибок?

In [118]:
for chunk in reader:
    print(chunk)
              2014    2013 YoY %  2014.1  2013.1 YoY %.1  Unnamed: 6
Lada        128633  151527  -15%   37030   44100    -16%         NaN
Renault*     63647   67208   -5%   17395   19178     -9%         NaN
KIA          60033   60027    0%   17744   18303     -3%         NaN
Nissan*      57579   44188   30%   11835    8272     43%         NaN
Hyundai*     57240   56582    1%   15933   15868      0%         NaN
Toyota*      50160   44610   12%   15103   15278     -1%         NaN
Chevrolet    48586   52489   -7%   13279   16083    -17%         NaN
VW           45828   49477   -7%   11497   14203    -19%         NaN
Mitsubishi   27943   26322    6%    6101    7182    -15%         NaN
Škoda        26616   26107    2%    7724    7488      3%         NaN
                2014   2013 YoY %  2014.1  2013.1 YoY %.1  Unnamed: 6
Opel           24493  26731   -8%    6493    6899     -6%         NaN
Ford*          22760  32289  -30%    5387    8635    -38%         NaN
GAZ LCV*       20318  24166  -16%    6274    7183    -13%         NaN
Daewoo         17369  20139  -14%    4511    4241      6%         NaN
Mazda          15818  12831   23%    4208    2206     91%         NaN
Mercedes-Benz  14821  12165   22%    4437    3570     24%         NaN
BMW            12836  12063    6%    3136    3245     -3%         NaN
UAZ*           12539  15931  -21%    4073    4580    -11%         NaN
Audi           11946  11929    0%    3660    3651      0%         NaN
Peugeot*        8792  11607  -24%    2015    3300    -39%         NaN
            2014  2013 YoY %  2014.1  2013.1 YoY %.1  Unnamed: 6
Honda       8760  7697   14%    1971    2749    -28%         NaN
Citroёn*    8164  8619   -5%    1925    2672    -28%         NaN
SsangYong   7739  9409  -18%    2006    2306    -13%         NaN
Suzuki      7113  8954  -21%    1983    2921    -32%         NaN
Lifan       6783  6437    5%    2178    2116      3%         NaN
Land Rover  6769  6141   10%    1866    1641     14%         NaN
Chery       6752  6269    8%    1801    2112    -15%         NaN
Geely       6598  6573    0%    1747    2312    -24%         NaN
Great Wall  5595  6928  -19%    1735    2243    -23%         NaN
Subaru      5495  5897   -7%    1772    1888     -6%         NaN
          2014  2013 YoY %  2014.1  2013.1 YoY %.1  Unnamed: 6
Lexus     5475  4938   11%    2100    1726     22%         NaN
Volvo     4709  3974   18%    1467    1066     38%         NaN
VW vans*  4485  4917   -9%    1204    1451    -17%         NaN
Infiniti  3114  3246   -4%     776     427     82%         NaN
Jeep      2507  1198  109%     650     353     84%         NaN
FIAT*     2437  1890   29%     682     646      6%         NaN
Porsche   1191  1149    4%     481     372     29%         NaN
FAW       1129  1028   10%     342     522    -34%         NaN
Jaguar     558   442   26%     152     121     26%         NaN
SEAT       550  1217  -55%     241     357    -32%         NaN
          2014  2013 YoY % 2014.1 2013.1 YoY %.1  Unnamed: 6
MINI       549   803  -32%    149    244    -39%         NaN
Cadillac   493   551  -11%    154    173    -11%         NaN
BAW*       472   634  -26%    118    151    -22%         NaN
ZAZ        352  1331  -74%     56    401    -86%         NaN
Changan    285     -     -     90      -       -         NaN
Haima      161    86   87%     71      3   2267%         NaN
Acura2     112     -     -    112      -       -         NaN
smart       99    38  161%     27     14     93%         NaN
Isuzu*      98    32  206%     42      9    367%         NaN
Bogdan3     92  1024  -91%      -    247       -         NaN
             2014 2013 YoY %  2014.1 2013.1 YoY %.1  Unnamed: 6
Brilliance4    75    -     -      75      -       -         NaN
JAC5           58    -     -      58      -       -         NaN
Luxgen         57    -     -      18      -       -         NaN
TagAZ*         52   94  -45%      14     30    -53%         NaN
Chrysler       46   54  -15%      10     15    -33%         NaN
Izh            18  374  -95%       0    123   -100%         NaN
Dodge          15   74  -80%       6     23    -74%         NaN
Foton*          9    6   50%       2      0       -         NaN
Alfa Romeo      9    -     -       6      -       -         NaN
Skipping line 38: expected 8 fields, saw 9

Ну вот, получили 6 десятков и уведомелние о том, что строка 38 пропущена (это Mersedec-Benz Van после Fiat)

In [117]:
reader = pd.read_csv(aprpath, error_bad_lines=False, chunksize=10)

Далее попробуем вытащить информацию о номере последней строки..., но захлебнемся в свойиствах объекта DataFrame() и закончим пост

In [95]:
tabpd-1 = tabpd.ix[-1]
tabpd-1
  File "<ipython-input-95-625fd9944323>", line 1
    tabpd-1 = tabpd.ix[-1]
SyntaxError: can't assign to operator
In [104]:
col2014 = tabpd.get('2014')

Где здесь Alfa Romeo?

In [107]:
dir(col2014)
Out[107]:
['Acura2',
 'Audi',
 'BMW',
 'Bogdan3',
 'Brilliance4',
 'Cadillac',
 'Changan',
 'Chery',
 'Chevrolet',
 'Chrysler',
 'Daewoo',
 'Dodge',
 'FAW',
 'Geely',
 'Haima',
 'Honda',
 'Infiniti',
 'Izh',
 'JAC5',
 'Jaguar',
 'Jeep',
 'KIA',
 'Lada',
 'Lexus',
 'Lifan',
 'Luxgen',
 'MINI',
 'Mazda',
 'Mitsubishi',
 'Opel',
 'Porsche',
 'SEAT',
 'SsangYong',
 'Subaru',
 'Suzuki',
 'T',
 'VW',
 'Volvo',
 'ZAZ',
 '_AXIS_ALIASES',
 '_AXIS_IALIASES',
 '_AXIS_LEN',
 '_AXIS_NAMES',
 '_AXIS_NUMBERS',
 '_AXIS_ORDERS',
 '_AXIS_REVERSED',
 '_AXIS_SLICEMAP',
 '__abs__',
 '__add__',
 '__and__',
 '__array__',
 '__array_prepare__',
 '__array_priority__',
 '__array_wrap__',
 '__bool__',
 '__bytes__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__delitem__',
 '__dict__',
 '__dir__',
 '__div__',
 '__doc__',
 '__eq__',
 '__finalize__',
 '__float__',
 '__floordiv__',
 '__format__',
 '__ge__',
 '__getattr__',
 '__getattribute__',
 '__getitem__',
 '__getstate__',
 '__gt__',
 '__hash__',
 '__iadd__',
 '__idiv__',
 '__imul__',
 '__init__',
 '__int__',
 '__invert__',
 '__ipow__',
 '__isub__',
 '__iter__',
 '__itruediv__',
 '__le__',
 '__len__',
 '__long__',
 '__lt__',
 '__mod__',
 '__module__',
 '__mul__',
 '__ne__',
 '__neg__',
 '__new__',
 '__nonzero__',
 '__or__',
 '__pow__',
 '__radd__',
 '__rand__',
 '__rdiv__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__rfloordiv__',
 '__rmod__',
 '__rmul__',
 '__ror__',
 '__rpow__',
 '__rsub__',
 '__rtruediv__',
 '__rxor__',
 '__setattr__',
 '__setitem__',
 '__setstate__',
 '__sizeof__',
 '__str__',
 '__sub__',
 '__subclasshook__',
 '__truediv__',
 '__unicode__',
 '__weakref__',
 '__xor__',
 '_add_numeric_operations',
 '_agg_by_level',
 '_align_frame',
 '_align_series',
 '_allow_index_ops',
 '_at',
 '_binop',
 '_box_item_values',
 '_can_hold_na',
 '_check_inplace_setting',
 '_check_is_chained_assignment_possible',
 '_check_setitem_copy',
 '_clear_item_cache',
 '_consolidate_inplace',
 '_construct_axes_dict',
 '_construct_axes_dict_for_slice',
 '_construct_axes_dict_from',
 '_construct_axes_from_arguments',
 '_constructor',
 '_constructor_sliced',
 '_create_indexer',
 '_expand_axes',
 '_from_axes',
 '_get_axis',
 '_get_axis_name',
 '_get_axis_number',
 '_get_axis_resolvers',
 '_get_block_manager_axis',
 '_get_bool_data',
 '_get_cacher',
 '_get_index_resolvers',
 '_get_item_cache',
 '_get_numeric_data',
 '_get_repr',
 '_get_val_at',
 '_get_values',
 '_get_values_tuple',
 '_get_with',
 '_iat',
 '_iget_item_cache',
 '_iloc',
 '_index',
 '_indexed_same',
 '_info_axis',
 '_info_axis_name',
 '_info_axis_number',
 '_init_mgr',
 '_internal_names',
 '_internal_names_set',
 '_is_cached',
 '_is_datelike_mixed_type',
 '_is_mixed_type',
 '_is_numeric_mixed_type',
 '_is_view',
 '_ix',
 '_ixs',
 '_loc',
 '_local_dir',
 '_maybe_box',
 '_maybe_cache_changed',
 '_maybe_update_cacher',
 '_metadata',
 '_needs_reindex_multi',
 '_protect_consolidate',
 '_reduce',
 '_reindex_axes',
 '_reindex_axis',
 '_reindex_indexer',
 '_reindex_multi',
 '_reindex_with_indexers',
 '_repr_footer',
 '_reset_cache',
 '_set_as_cached',
 '_set_axis',
 '_set_is_copy',
 '_set_item',
 '_set_labels',
 '_set_subtyp',
 '_set_values',
 '_set_with',
 '_set_with_engine',
 '_setup_axes',
 '_slice',
 '_stat_axis',
 '_stat_axis_name',
 '_stat_axis_number',
 '_tidy_repr',
 '_typ',
 '_unpickle_series_compat',
 '_update_inplace',
 '_validate_dtype',
 '_xs',
 'abs',
 'add',
 'add_prefix',
 'add_suffix',
 'align',
 'all',
 'any',
 'append',
 'apply',
 'argmax',
 'argmin',
 'argsort',
 'as_blocks',
 'as_matrix',
 'asfreq',
 'asof',
 'astype',
 'at',
 'at_time',
 'autocorr',
 'axes',
 'base',
 'between',
 'between_time',
 'bfill',
 'blocks',
 'bool',
 'cat',
 'clip',
 'clip_lower',
 'clip_upper',
 'combine',
 'combine_first',
 'compound',
 'compress',
 'consolidate',
 'convert_objects',
 'copy',
 'corr',
 'count',
 'cov',
 'cummax',
 'cummin',
 'cumprod',
 'cumsum',
 'data',
 'describe',
 'diff',
 'div',
 'divide',
 'dot',
 'drop',
 'drop_duplicates',
 'dropna',
 'dt',
 'dtype',
 'dtypes',
 'duplicated',
 'empty',
 'eq',
 'equals',
 'factorize',
 'ffill',
 'fillna',
 'filter',
 'first',
 'first_valid_index',
 'flags',
 'floordiv',
 'from_array',
 'from_csv',
 'ftype',
 'ftypes',
 'ge',
 'get',
 'get_dtype_counts',
 'get_ftype_counts',
 'get_value',
 'get_values',
 'groupby',
 'gt',
 'hasnans',
 'head',
 'hist',
 'iat',
 'idxmax',
 'idxmin',
 'iget',
 'iget_value',
 'iloc',
 'imag',
 'index',
 'interpolate',
 'irow',
 'is_copy',
 'is_time_series',
 'isin',
 'isnull',
 'item',
 'itemsize',
 'iteritems',
 'iterkv',
 'ix',
 'keys',
 'kurt',
 'kurtosis',
 'last',
 'last_valid_index',
 'le',
 'load',
 'loc',
 'lt',
 'mad',
 'map',
 'mask',
 'max',
 'mean',
 'median',
 'min',
 'mod',
 'mode',
 'mul',
 'multiply',
 'nbytes',
 'ndim',
 'ne',
 'nlargest',
 'nonzero',
 'notnull',
 'nsmallest',
 'nunique',
 'order',
 'pct_change',
 'plot',
 'pop',
 'pow',
 'prod',
 'product',
 'ptp',
 'put',
 'quantile',
 'radd',
 'rank',
 'ravel',
 'rdiv',
 'real',
 'reindex',
 'reindex_axis',
 'reindex_like',
 'rename',
 'rename_axis',
 'reorder_levels',
 'repeat',
 'replace',
 'resample',
 'reset_index',
 'reshape',
 'rfloordiv',
 'rmod',
 'rmul',
 'round',
 'rpow',
 'rsub',
 'rtruediv',
 'save',
 'searchsorted',
 'select',
 'sem',
 'set_axis',
 'set_value',
 'shape',
 'shift',
 'size',
 'skew',
 'slice_shift',
 'smart',
 'sort',
 'sort_index',
 'sortlevel',
 'squeeze',
 'std',
 'str',
 'strides',
 'sub',
 'subtract',
 'sum',
 'swapaxes',
 'swaplevel',
 'tail',
 'take',
 'to_clipboard',
 'to_csv',
 'to_dense',
 'to_dict',
 'to_frame',
 'to_hdf',
 'to_json',
 'to_msgpack',
 'to_period',
 'to_pickle',
 'to_sparse',
 'to_sql',
 'to_string',
 'to_timestamp',
 'tolist',
 'transpose',
 'truediv',
 'truncate',
 'tshift',
 'tz_convert',
 'tz_localize',
 'unique',
 'unstack',
 'update',
 'valid',
 'value_counts',
 'values',
 'var',
 'view',
 'where',
 'xs']


Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий