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

воскресенье, 5 апреля 2015 г.

Пример моей глупости: В папке пара десятков ... файлов... пишем класс For1aug2_csv

Это пример моего неправильного мышления. После практикумов с удачным наследованием собственного класса AEBto3tables я возгордился и решил "побыстрому" написат класс для конкатенции и чистки таблиц. Работу пришлось бросить...
Но пост публикую. Здесь все же записан процесс моей работы (а исправления ошибок в следующих постах). Вот неправильное начало поста:
Этот класс будет построен по тому же принципу, что и AEBto3tables - метод с итератором по файлам в папке вызывает последовтельно методы проверки однородности таблиц, чистки столбцов, конвертации форматов, добавления столбцов, конкатенции таблиц. Пишу все в Spyder на компьютере "Kali"
In [1]:
import os
# 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)
In [2]:
path = '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2'
!ls '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2'
000_eng_car-sales-in-april-2014.csv  eng_car-sales-in-november-2014.csv
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

Как выбрать все файлы в папке, задав список для формирования имен по шаблону

In [3]:
months = ['january', 'febrary', 'march', 'april', 'may', 'jun',
        'july', 'august','september', 'october','november', 'december']
In [14]:
dict = {'january':'31-1', 'febrary':'28-2', 'march':'31-1', 'april':'30-4', 'may':'31-5', 'jun':'30-6',
        'july':'31-7', 'august':'31-8','september':'30-9', 'october':'31-10','november':'30-11', 'december':'31-12'}
In [5]:
# We can construct filepath with string formatter '**** ****%d**' % digit
#years = range(1880, 2011)

#names = pd.DataFrame()
for month in months:
    pathm = path +'/eng_car-sales-in-%s-2014.csv' % month
    #frame = pd.read_csv(path, names=columns)

    #frame['year'] = year
    #names = pd.concat(names, frame, ignore_index=True)
    print(pathm) 
/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/eng_car-sales-in-january-2014.csv
/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/eng_car-sales-in-febrary-2014.csv
/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/eng_car-sales-in-march-2014.csv
/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/eng_car-sales-in-april-2014.csv
/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/eng_car-sales-in-may-2014.csv
/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/eng_car-sales-in-jun-2014.csv
/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/eng_car-sales-in-july-2014.csv
/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/eng_car-sales-in-august-2014.csv
/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/eng_car-sales-in-september-2014.csv
/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/eng_car-sales-in-october-2014.csv
/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/eng_car-sales-in-november-2014.csv
/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/eng_car-sales-in-december-2014.csv

Недостаток мкеода в том, что файлов с такими именами может не быт в папке. Значит, нужно писать обработчики ошибок... Альтернатива, прочитать все файлы из папки, используя os.listdir(path), а потом отфильтровать нужные

Как перебрать все имена файлов в папке и отфильтровать удовлетворяющие шаблону

Вот только с фильтром вышла проблемка. Я планировал испоьзовать contains(), а этого метода нет у строк... это я недавно юзал в 6.3 Plotting temperature and snowiness stats together свойства Pandas

In [ ]:
is_snowing = weather_2012['Weather'].str.contains('Snow')

Эти фильты можно применять, но здесь надо по строкам выбирать, вот нашел вариант с .startswith()

In [9]:
for csvfile in os.listdir(path):
    if csvfile.startswith('eng_car-sales-in'):
        csvfile_path = os.path.join(path, csvfile)
    #pdtemp = pd.read_csv(csvfile_path, error_bad_lines=False)
    #
    #
        print(csvfile) 
eng_car-sales-in-april-2014.csv
eng_car-sales-in-august-2014.csv
eng_car-sales-in-december-2014.csv
eng_car-sales-in-july-2014.csv
eng_car-sales-in-june-2014.csv
eng_car-sales-in-may-2014.csv
eng_car-sales-in-november-2014.csv
eng_car-sales-in-october-2014.csv
eng_car-sales-in-september-2014.csv

Можно было бы еще применить .split() или найти подстроку .find() ...

In [13]:
'eng_car-sales-in-april-2014.csv'.split('-'), 'eng_car-sales-in-april-2014.csv'.split('-')[3]
Out[13]:
(['eng_car', 'sales', 'in', 'april', '2014.csv'], 'april')
In [12]:
'eng_car-sales-in-april-2014.csv'.find('eng_car'), 'eng_car-sales-in-april-2014.csv'.find('notpart')
Out[12]:
(0, -1)
In [16]:
namen = 'eng_car-sales-in-april-2014.csv'.split('-')[3]
dict[namen]
Out[16]:
'30-4'
In [ ]:
 

Повторим код из поста Pandas или file.read...

In [6]:
for csvfile in os.listdir(path):
    csvfile_path = os.path.join(path, csvfile)
    pd000 = pd.read_csv(csvfile_path, error_bad_lines=False)
    print ('******      ' + csvfile)
    pd000.info(verbose=True, buf=None, max_cols=None, memory_usage=True, null_counts=True)
******      eng_car-sales-in-april-2014.csv
<class 'pandas.core.frame.DataFrame'>
Index: 60 entries, Lada to Alfa Romeo
Data columns (total 7 columns):
2014          60 non-null int64
2013          60 non-null object
YoY %         60 non-null object
2014.1        60 non-null object
2013.1        60 non-null object
YoY %.1       60 non-null object
Unnamed: 6    0 non-null float64
dtypes: float64(1), int64(1), object(5)
memory usage: 2.3+ KB
******      eng_car-sales-in-august-2014.csv
<class 'pandas.core.frame.DataFrame'>
Int64Index: 65 entries, 0 to 64
Data columns (total 8 columns):
Lada          65 non-null object
26,467        65 non-null object
39,079        65 non-null object
-32%          65 non-null object
247,289       65 non-null object
303,357       65 non-null object
-18%          65 non-null object
Unnamed: 7    0 non-null float64
dtypes: float64(1), object(7)
memory usage: 2.8+ KB
******      eng_car-sales-in-december-2014.csv
<class 'pandas.core.frame.DataFrame'>
Int64Index: 62 entries, 0 to 61
Data columns (total 8 columns):
Lada          62 non-null object
35,315        62 non-null object
38,948        62 non-null object
-9%           62 non-null object
387,307       62 non-null object
456,309       62 non-null object
-15%          62 non-null object
Unnamed: 7    0 non-null float64
dtypes: float64(1), object(7)
memory usage: 2.7+ KB
******      eng_car-sales-in-july-2014.csv
<class 'pandas.core.frame.DataFrame'>
Int64Index: 59 entries, 0 to 58
Data columns (total 8 columns):
Lada          59 non-null object
28,014        59 non-null object
37,549        59 non-null object
-25%          59 non-null object
220,822       59 non-null object
264,278       59 non-null object
-16%          59 non-null object
Unnamed: 7    0 non-null float64
dtypes: float64(1), object(7)
memory usage: 2.5+ KB
******      eng_car-sales-in-june-2014.csv
<class 'pandas.core.frame.DataFrame'>
Int64Index: 59 entries, 0 to 58
Data columns (total 8 columns):
Lada          59 non-null object
30,114        59 non-null object
37,177        59 non-null object
-19%          59 non-null object
192,808       59 non-null object
226,729       59 non-null object
-15%          59 non-null object
Unnamed: 7    0 non-null float64
dtypes: float64(1), object(7)
memory usage: 2.5+ KB
******      eng_car-sales-in-may-2014.csv
<class 'pandas.core.frame.DataFrame'>
Int64Index: 60 entries, 0 to 59
Data columns (total 8 columns):
Lada          60 non-null object
34,061        60 non-null object
38,025        60 non-null object
-10%          60 non-null object
162,694       60 non-null object
189,552       60 non-null object
-14%          60 non-null object
Unnamed: 7    0 non-null float64
dtypes: float64(1), object(7)
memory usage: 2.6+ KB
******      eng_car-sales-in-november-2014.csv
<class 'pandas.core.frame.DataFrame'>
Int64Index: 62 entries, 0 to 61
Data columns (total 8 columns):
Lada          62 non-null object
30,402        62 non-null object
36,509        62 non-null object
-17%          62 non-null object
351,992       62 non-null object
417,361       62 non-null object
-16%          62 non-null object
Unnamed: 7    0 non-null float64
dtypes: float64(1), object(7)
memory usage: 2.7+ KB
******      eng_car-sales-in-october-2014.csv
<class 'pandas.core.frame.DataFrame'>
Int64Index: 66 entries, 0 to 65
Data columns (total 8 columns):
Lada          66 non-null object
37,788        66 non-null object
37,484        66 non-null object
1%            66 non-null object
321,590       66 non-null object
380,852       66 non-null object
-16%          66 non-null object
Unnamed: 7    0 non-null float64
dtypes: float64(1), object(7)
memory usage: 2.8+ KB
******      eng_car-sales-in-september-2014.csv
<class 'pandas.core.frame.DataFrame'>
Int64Index: 64 entries, 0 to 63
Data columns (total 8 columns):
Lada          64 non-null object
36,513        64 non-null object
40,011        64 non-null object
-9%           64 non-null object
283,802       64 non-null object
343,368       64 non-null object
-17%          64 non-null object
Unnamed: 7    0 non-null float64
dtypes: float64(1), object(7)
memory usage: 2.8+ KB
******      sales-in-december_2013_eng_final.csv
<class 'pandas.core.frame.DataFrame'>
Int64Index: 57 entries, 0 to 56
Data columns (total 8 columns):
Lada          57 non-null object
456 309       57 non-null object
537 625       57 non-null object
-15%          57 non-null object
38 948        57 non-null object
43 354        57 non-null object
-10%          57 non-null object
Unnamed: 7    0 non-null float64
dtypes: float64(1), object(7)
memory usage: 2.4+ KB
******      sales-in-february_2014_eng_final.csv
<class 'pandas.core.frame.DataFrame'>
Int64Index: 56 entries, 0 to 55
Data columns (total 8 columns):
Lada          56 non-null object
54 543        56 non-null object
66 947        56 non-null object
-19%          56 non-null object
30 896        56 non-null object
36910         56 non-null object
-16%          56 non-null object
Unnamed: 7    0 non-null float64
dtypes: float64(1), object(7)
memory usage: 2.4+ KB
******      sales-in-january_2014_eng_final_1.csv
<class 'pandas.core.frame.DataFrame'>
Int64Index: 56 entries, 0 to 55
Data columns (total 5 columns):
Association of European Businesses    56 non-null object
Phone.:                               56 non-null int64
+7 (495) 234 27 64                    56 non-null object
E-mail: info@aebrus.ru                56 non-null object
Unnamed: 4                            0 non-null float64
dtypes: float64(1), int64(1), object(3)
memory usage: 2.0+ KB
******      sales-in-march_2014_eng_final.csv
<class 'pandas.core.frame.DataFrame'>
Int64Index: 58 entries, 0 to 57
Data columns (total 8 columns):
Lada          58 non-null object
91603         58 non-null int64
107427        58 non-null object
-15%          58 non-null object
37060         58 non-null int64
40480         58 non-null object
-8%           58 non-null object
Unnamed: 7    0 non-null float64
dtypes: float64(1), int64(2), object(5)
memory usage: 2.9+ KB
******      000_eng_car-sales-in-april-2014.csv
<class 'pandas.core.frame.DataFrame'>
Index: 9 entries, Lada to Mitsubishi
Data columns (total 7 columns):
2014          9 non-null int64
2013          9 non-null int64
YoY %         9 non-null object
2014.1        9 non-null int64
2013.1        9 non-null int64
YoY %.1       9 non-null object
Unnamed: 6    0 non-null float64
dtypes: float64(1), int64(4), object(2)
memory usage: 468.0+ bytes

Почему в файлах разное количество строк?

Здесь надо бы записать ответ... Открываем исходный pdf-файл апреля и читаем над таблицей:

NEW CAR AND LCV SALES IN RUSSIA BY GROUPS FOR JANUARY - APRIL 2014/2013 AND APRIL 2014/2013

Очевидно, что количество групп может отличаться от месяца к месяцу. Так что пока, даже если мы кого и потеряли, то не страшно. Пока нет задач, требующих тщательного контроля парсинга.



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

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

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