Здесь я начал с процесса сравнения файлов в папке (обнаружил, что их два вида), потом я попытался найти методы для того, чтобы рассортировать файлы по (сочетанию) типам столбцов. Обнаружил еще один "подвид" (отрицательные числа в скобках). В процессе поиска я пришел к выводу, что надо фильтровать не по типам, а по регулярным выражениям ... но этот черновик получился довольно длинным, потому экзерсисы с регулярными выражениями в следующим файле. Много времени ущло на поиск команд. Найдены всего лишь: (pdtemp.dtypes[0].name == 'int64'), pdtemp.columns = colnames_3_0-12, ** А начинается пост с констатации методических ошибок...
Когда одновременно приходится осваивать новые методы и решать конкретные задачи, то мой мозг отказывается соображать. Я не могу понять Pandas... ну, это модно "списать" на Pandas, а вот то, что я не могу сообразить, как фильтровать файлы... Это раздражает. Я успокаиваю себя тем, что "переработал", надо отдохнуть...
Я сразу же нашел "правильный" вариант (с регулярными выражениями), но меня заколдобило: "А как фиьтровать по типам, как вообще это работает?" Решил "между делом" разобораться, не разобрался (оказалось, что там Numpy надо копать), но команды нашел..., причем, искать пришлось методом тыка, обычные методы поиска не давали результата.
Но потерял уйму времени.
Утешительные рекомендации самому себе: Если ты не можешь быстро найти подсказки на Stackoverflof, то это решение гениальное, или тупое.
Не позволяй себе гениалных решений, пока не освоил матчасть. А типовые решения надо искать, формулируя ВОПРОС, ва не вариант (гениального) ответа.
Проще надо быть!
import os
import pandas as pd
import numpy as np
DIRPATH = '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/3aug2/'
filterfilenames = 'eng_car-sales-in'
# При считывании каждого файла во фрейм нужно будет добавлять столбец дат,
# для этого мы используем список и словарь:
months = ['january', 'february', 'march', 'april', 'may', 'june',
'july', 'august','september', 'october','november', 'december']
dict = {'january':'31-1', 'february':'28-2', 'march':'31-3',
'april':'30-4', 'may':'31-5', 'june':'30-6',
'july':'31-7', 'august':'31-8','september':'30-9',
'october':'31-10','november':'30-11', 'december':'31-12'}
COLNAMES =['Model', 'Brandt', \
'2014y3', '2013y3', 'u1413y3', '1413y3', \
'2014m3', '2013m3', 'u1413m3', '1413m3', 'Datem']
#import pdb; pdb.set_trace() #Если раскоментировать, то можно испоьзовать паузы
pdall = pd.DataFrame()
for csvfile in os.listdir(DIRPATH):
if csvfile.startswith(filterfilenames):
csvfile_path = os.path.join(DIRPATH, csvfile)
pdtemp = pd.read_csv(csvfile_path, error_bad_lines=False, \
na_values=['-','n/a'], \
quotechar='"', sep=',', thousands=',')
#pdtemp['Datem'] = addDatem(csvfile) #Закомментировать
#pdall = pd.concat([pdall, pdtemp], ignore_index=True) #Закомментировать
#pd.set_option('display.max_columns'= 9, False)
pd.set_option('display.width', 1000)
print (csvfile)
print (len(pdtemp.columns))
print (pdtemp).head(3)
print (pdtemp).tail(2)
pdtemp.info()
print (' ')
#print(pdall)
Для мая не сработал параметр thousands=','
# %load '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/3aug2/eng_car-sales-in-may-2014.csv'
"1","Lada","Granta","12,947","14,471","-1,524","-11%","58,517","67,236","-8,719","-13%",
"2","Hyundai","Solaris","9,791","10,493","-702","-7%","45,009","46,434","-1,425","-3%",
"3","KIA","New Rio","8,513","7,978","535","7%","38,484","36,189","2,295","6%",
"4","Lada","Largus","7,448","5,289","2,159","41%","27,939","19,668","8,271","42%",
"5","Renault","Duster","6,835","7,231","-396","-5%","34,988","33,176","1,812","5%",
"6","Lada","Kalina","5,730","5,778","-48","-1%","31,594","34,173","-2,579","-8%",
"7","VW","Polo","5,393","6,155","-762","-12%","26,759","27,953","-1,194","-4%",
"8","Renault","Logan","5,130","4,791","339","7%","19,472","21,465","-1,993","-9%",
"9","Nissan","Almera","4,456","1,163","3,293","283%","21,406","1,759","19,647","1117%",
"10","Nissan","Qashqai","4,031","2,297","1,734","75%","11,168","13,721","-2,553","-19%",
"11","Lada","Priora","3,695","5,377","-1,682","-31%","21,868","26,872","-5,004","-19%",
"12","Toyota","RAV 4","3,457","4,503","-1,046","-23%","15,958","15,913","45","0%",
"13","Lada","4x4","3,286","3,540","-254","-7%","16,217","18,139","-1,922","-11%",
"14","Hyundai","ix35","3,172","2,337","835","36%","14,910","11,995","2,915","24%",
"15","Škoda","Octavia A7","3,167","-","-","-","16,338","-","-","-",
"16","Chevrolet","Niva","2,658","3,975","-1,317","-33%","18,192","21,723","-3,531","-16%",
"17","Toyota","Camry","2,650","2,737","-87","-3%","12,988","12,811","177","1%",
"18","Renault","Sandero","2,537","4,016","-1,479","-37%","16,314","18,480","-2,166","-12%",
"19","KIA","Sportage","2,368","2,890","-522","-18%","12,347","13,248","-901","-7%",
"20","Toyota","Corolla","2,316","2,289","27","1%","12,777","10,003","2,774","28%",
"21","Chevrolet","Cruze","2,041","4,202","-2,161","-51%","14,404","18,767","-4,363","-23%",
"22","Ford","Focus","1,904","5,942","-4,038","-68%","12,827","28,220","-15,393","-55%",
"23","Opel","Astra","1,592","3,116","-1,524","-49%","11,493","15,196","-3,703","-24%",
"24","Mitsubishi","Outlander","1,469","1,812","-343","-19%","10,916","9,827","1,089","11%",
"25","Nissan","Juke","1,242","2,111","-869","-41%","10,831","9,861","970","10%",
Этот май - баловник¶
#Как такое может быть?
12,947 24 non-null int64
14,471 23 non-null float64
# мы же задали thousands=','
# для одной строчки он сработал
# а для другой - нет?
Вот копипаст всего info для мая:
Data columns (total 12 columns):
1 24 non-null int64
Lada 24 non-null object
Granta 24 non-null object
12,947 24 non-null int64
14,471 23 non-null float64
-1,524 23 non-null float64
-11% 23 non-null object
58,517 24 non-null int64
67,236 23 non-null float64
-8,719 23 non-null float64
-13% 23 non-null object
Unnamed: 11 0 non-null float64
dtypes: float64(5), int64(3), object(4)
Может быть это сбой? Перезагрузимся в новый DataFrame:
csvfile_path = '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/3aug2/eng_car-sales-in-may-2014.csv'
pd_may = pd.read_csv(csvfile_path, error_bad_lines=False, \
na_values=['-','n/a'], \
quotechar='"', sep=',', thousands=',')
pd_may.info()
Не мог понять, в чем дело, на всякий случай распечатал таблицу (ниже). Единственное отличие столбцов формата Int в том, что там нет ячеек Nan (строка 13). Странно эта подстраховка происходит... Почему не object?
pd_may
Проверим июнь¶
csvfile_path = '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/3aug2/eng_car-sales-in-june-2014.csv'
pd_june = pd.read_csv(csvfile_path, error_bad_lines=False, \
na_values=['-','n/a'], \
quotechar='"', sep=',', thousands=',')
pd_june
Теперь мы делаем шаг назад и работаем с последним объектом pdall¶
pd_june.info()
Так или иначе, запятые - разделители разрядов во всех случаях обрабатываются (убираются) верно. Так что, нам не так уж и важно, какой числовой формат...
pdtemp.columns
pdtemp.columns[0], pdtemp.columns[-1], pdtemp.columns[6]
Попробуем идентифицировать шаблон по сочетанию столбцов¶
Данные в нулевом и шестом столбцах должны иметь формат Int, а в 1,2 и 7,8 - это строки. Но санчала проверим, что мы получаем:
pdtemp.info()
pdtemp.dtypes[0], pdtemp.dtypes[6]
Все не так просто, мы получили объекты dtype (numpy) в приложении внизу есть перечень своййств. Я попробовал 'name', подошло:
numpydtype = pdtemp.dtypes[0]
numpydtype.name
numpydtype.type
pdtemp.dtypes
Начинаем с апреля¶
Первые три строчки (номер, Модель, Марка), шестая со знаком процента, а 7 и 8-я - цифры.
Data columns (total 12 columns):
1 24 non-null int64
Granta 24 non-null object
Lada 24 non-null object
45570 24 non-null int64
52765 24 non-null int64
(7,195) 23 non-null object
-14% 23 non-null object
13077 24 non-null int64
15596 24 non-null int64
(2,519) 23 non-null object
-16% 23 non-null object
Unnamed: 11 0 non-null float64
dtypes: float64(1), int64(5), object(6)
Формат отличаеся от мая с июнем. И здесь самое время проверить, есть ли здесь Nan¶
csvfile_path = '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/3aug2/eng_car-sales-in-april-2014.csv'
pd_april = pd.read_csv(csvfile_path, error_bad_lines=False, \
na_values=['-','n/a'], \
quotechar='"', sep=',', thousands=',')
pd_april
Да, действительно, здесь нет "Nan"... Оставляем эту версию рабочей. Это значит, что нам в дальнейшем нужно будет задавать условия для обоих вариантов Int и Float
colnames_3_0_11 =['n1_y', 'Model', 'Brandt', \
'2014y3', '2013y3', 'u1413y3', '1413y3', \
'2014m3', '2013m3', 'u1413m3', '1413m3', 'Datem']
true_3_0_11 = [(pdtemp.dtypes[0].name == 'int64') &
(pdtemp.dtypes[1].name == 'object') &
(pdtemp.dtypes[2].name == 'object') &
(pdtemp.dtypes[6].name == 'object') &
(pdtemp.dtypes[7].name == 'int64 | Float64') &
(pdtemp.dtypes[8].name == 'int64 | Float64')]
true_3_0_11
Май отличается не количеством столбцов, а¶
Повторяются три первых столбца (номер, Модель, Марка) два раза¶
colnames_3_0_12 = ['n1_y', 'Model_y', 'Brandt_y', \
'2014y3', '2013y3', '1413y3', \
'n1_m', 'Model_m', 'Brandt_m', \
'2014m3', '2013m3', '1413m3', 'Datem']
true_3_0_12 = [(pdtemp.dtypes[0].name == 'int64') &
(pdtemp.dtypes[1].name == 'object') &
(pdtemp.dtypes[2].name == 'object') &
(pdtemp.dtypes[6].name == 'int64') &
(pdtemp.dtypes[7].name == 'object') &
(pdtemp.dtypes[8].name == 'object')]
true_3_0_12
if true_3_0_12 = True:
pdtemp.columns = colnames_3_0-12
'u1413y3', 'u1413m3',
pdtemp.loc[:, pdtemp.dtypes == np.float64].tail()
ppd = pdtemp.loc[:, pdtemp.dtypes == np.int64].tail()
ppd.info
ppd.
pdtemp.columns[pdtemp.dtypes == np.int64]
pdtemp.columns.get_indexer
pdtemp.columns.order()
Приложения: dtype¶
dir(numpydtype)
Посты чуть ниже также могут вас заинтересовать
Комментариев нет:
Отправить комментарий