Файлы таблиц "Brandt 2014y 2013y 1413y 2014m 2013m 1413m Datem" Визуальный тест pandasd.read_csv - как распечатать все файлы из папки при помощи PDB. Считать данные в кавычках, с разделителями разрядов, привести все пропуски данных к единому виду - Nan, перевести строку в число...
Не уверен, что это лучший варинат, но пока не знаю, как поступить иначе при таком уровне неопределенности. Формат исходных (ежемесячные данные) файлов менялся за год несколько раз. Там то появлялись запятые вместо пробелов - разделителей разрядов, то менялось количество столбцов... Пришлось парсеры перенастраивать и менять...
Файлы короткие, распечатаю ка я их все за год и дело с концом... Нет, не так все просто, надо куда-то сохранить полученный файл...
import os
import pandas as pd
Фрагмент со всеми неоднородностями (почти)
"Dodge*******","-","10","-","26","184","-86%",
"Izh","-","31","-","19","678","-97%",
"FAW","n/a","513","-","2,164","3,739","-42%",
"cars","9,322","12,625","-26.2%","103,119","129,847","-20.6%",
"vans","973","1,310","-25.7%","10,381","12,882","-19.4%",
"BENZ cars","4,240","4,157","2.0%","40,673","36,200","12.4%",
"BENZ vans","1,178","489","140.9%","6,795","3,911","73.7%",
Привести пропущенные значения, разделители тысяч, обозначить, что каждое значение в кавычках можно в цикле считывания при импорте csv в один фрейм¶
"-", "n/a"
"12,625" - coma
'"'
При считывании каждого файла во фрейм нужно будет добавлять столбец дат, для этого мы используем список и словарь:¶
months = ['january', 'febrary', 'march', 'april', 'may', 'jun',
'july', 'august','september', 'october','november', 'december']
dict = {'january':'31-1', 'febrary':'28-2', 'march':'31-1',
'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'}
for csvfile in os.listdir(DIRPATH):
if csvfile.startswith('eng_car-sales-in'):
print csvfile
def addDatem(csvfile):
# Parse month name from filename
namen = csvfile.split('-')[3] # 'april' for example
# Replace strings with dict 'april':'30-4',
datstr = dict[namen] + '-2014' # '30-4-2014'
return datstr
csvfile = 'eng_car-sales-in-april-2014.csv'
addDatem(csvfile)
Конкатенция всех файлов в один объект DataFrame¶
pdall = pd.DataFrame()
def concatall(pdall, pdtemp):
#Concat month dataframes to pdall
pdall = pd.concat([pdall, pdtemp], ignore_index=True)
return pdall
А убрать звездочки (не знаю, нужно ли здесь это делать), занк % и перевести в float два столбца нужно будет уже в общем фрейме¶
***
"73.7%" -> 73.7 (float)
"-97%" -> 97 (Int) ?
Особенности в файлах¶
Часть имени для фильтра Да
Строки В первом файле убрать строку заголовков !!!!!
Количество строк Неодинаковое число строк в фалах
Пропуск плохихи строк error_bad_lines=False
Nan na_values=['-','n/a']
CSV quotechar='"', sep=',',
Разделитель разрядов thousands=','
Файлы в папке¶
# Path to dir with files
DIRPATH = '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/'
# Insert my columns names in Dataframe objects
COLNAMES =['Brandt', '2014y', '2013y', '1413y', '2014m', '2013m', '1413m', 'Datem']
# Filter only filenames with
filterfilenames = 'eng_car-sales-in'
# Для длинных файлов можно использовать
print (csvfile)
pdtemp.head(5)
print '...'
pdtemp.tail(3)
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, \
names=COLNAMES, na_values=['-','n/a'], \
quotechar='"', sep=',', thousands=',')
pdtemp['Datem'] = addDatem(csvfile)
pdall = pd.concat([pdall, pdtemp], ignore_index=True)
#print (csvfile)
#print (pdtemp)
print(pdall)
pdtemp[0:3]
pdtemp[-1:]
Не разобрался, как задать печать последних нескольких строк, поскольку
pdtemp[-1:-3], '....', pdtemp[-5:-1]
В лучшем случае глотает последнюю строчку, поэтому проще использовать
pdtemp.tail(3)
pdttemp.info(verbose=True, buf=None, max_cols=None, memory_usage=True, null_counts=True)
#pd.Datem(pd001.dat) # == pd.to_datetime(pd001['dat'])
pd.to_datetime(pdall.Datem).tail() # == pd.to_datetime(pd001['Datem'])
Проверили? Теперь можно переприсвоить:
pdall.Datem = pd.to_datetime(pdall.Datem)
У нас осталось две строки процентов, надо убрать из них знаки "%" и перевести в формат float [¶
ИЗ Python for Data Analysis](http://pythonr.blogspot.ru/2015/03/blog-post.html#%D0%98%D0%97-Python-for-Data-Analysis)
Часть данных имеет вид целых, а в части есть 888.555 точка. В процессе предыдущих экспериментов я пытался все перевести в формат Int, но только посмотрев (распечатав выше) все данные, понял, почему выскакивала ошибка.
pdall['1413y'].str.replace('%','').astype(float)
Теперь проверим второй столбец (такой же)
pdall['1413m'].str.replace('%','').astype(float)
Проверили, все выглядит правдоподобно... Потому переприсвоим столбцы¶
pdall['1413y'] = pdall['1413y'].str.replace('%','').astype(float)
pdall['1413m'] = pdall['1413m'].str.replace('%','').astype(float)
Осталось проверить trailing spaces, но Pandas за такимим мелочами следит сам (в чем я не уверен)¶
Потму здесь просто распечатаеам итог
pdall.head(), pdall[30:40], pdall.tail(5)
pdall.info(verbose=True, buf=None, max_cols=None, memory_usage=True, null_counts=True)
Осталось только сохранить объект Dateframe в файл¶
# Path to dir with files
#DIRPATH = '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/'
newpath = '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv_new'
#COLNAMES =['Brandt', '2014y', '2013y', '1413y', '2014m', '2013m', '1413m', 'Datem']
pdall.to_csv(newpath + '2014.csv',
sep=';',
#float_format='%.8f',
cols=COLNAMES,
index=False)
Надо бы записать информационный файл, пусть пока будет хоть какой-нибудь, а попозже надо бы его как-то структурировать
Зaписываем информационный файл¶
!mkdir /media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv_new
%%writefile /media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv_new/2014_info.txt
"""Записал первый вариант сводного файла за 2014 год из папки
DIRPATH = '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/1aug2/'
Здесь пока только 9 месяцев...
"""
Посты чуть ниже также могут вас заинтересовать
Комментариев нет:
Отправить комментарий