Распознавание типа данных / угадывание данных CSV в python
моя проблема в контексте обработки данных из больших CSV-файлов.
Я ищу наиболее эффективный способ определить (то есть предположение) тип данных столбца на основе значения в этом столбце. Я потенциально имею дело с очень запутанными данными. Поэтому алгоритм должен быть в какой-то степени устойчив к ошибкам.
вот пример:
arr1 = ['0.83', '-0.26', '-', '0.23', '11.23'] # ==> recognize as float
arr2 = ['1', '11', '-1345.67', '0', '22'] # ==> regognize as int
arr3 = ['2/7/1985', 'Jul 03 1985, 00:00:00', '', '4/3/2011'] # ==> recognize as date
arr4 = ['Dog', 'Cat', '0.13', 'Mouse'] # ==> recognize as str
итог: я ищу пакет python или алгоритм, который может обнаружить либо
- схема файла CSV, или даже лучше
- тип данных отдельного столбца как массив
метод угадывания типа данных, представленных в настоящее время в виде строк идет в похожем направлении. Я беспокоюсь о производительности, хотя, поскольку я, возможно, имею дело со многими большими электронными таблицами (откуда берутся данные)
5 ответов
вас может заинтересовать эта библиотека python, которая делает именно такой тип угадывания по CSVs и XLS-файлам для вас:
он счастливо масштабируется до очень больших файлов, для потоковой передачи данных из интернета и т. д.
существует также еще более простая библиотека оболочки, которая включает в себя инструмент командной строки с именем dataconverters:http://okfnlabs.org/dataconverters/ (и онлайн-сервис:https://github.com/okfn/dataproxy!)
основной алгоритм, который делает угадывание типа, находится здесь: https://github.com/okfn/messytables/blob/7e4f12abef257a4d70a8020e0d024df6fbb02976/messytables/types.py#L164
после некоторого размышления об этом, вот как я бы сам разработал алгоритм:
- из соображений производительности: возьмите образец для каждого столбца (скажем, 1%)
- запустите регулярное выражение для каждой ячейки в образце, проверяя тип данных
- выбрать нужный тип данных для столбца на основе частотного распределения
два вопроса, которые возникают:
- что достаточный размер выборки? Для небольшие наборы данных? Для больших наборов данных?
- каков достаточно высокий порог для выбора типа данных на основе частотного распределения?
вы можете попробовать предварительный анализ с помощью regex. Например:
import re
pattern = re.compile(r'^-?\d+.{1}\d+$')
data = '123.42'
print pattern.match(data) # ----> object
data2 = 'NOT123.42GONNA31.4HAPPEN'
print pattern.match(data2) # ----> None
таким образом, вы можете сделать словарь регулярных выражений и попробовать каждый из них, пока не найдете совпадение
myregex = {int: r'^-?\d+$', float: r'^\d+.{1}\d+$', ....}
for key, reg in myregex.items():
to_del = []
for index, data in enumerate(arr1):
if re.match(reg,data):
d = key(data) # You will need to insert data differently depending on function
....#---> do something
to_del.append(data) # ---> delete this when you can from arr1
Не забывайте " ^ "в начале и" $ " в конце, если регулярное выражение не может соответствовать части строки и возвращать объект.
надеюсь, что это помогает :)
Я решил ту же проблему в C#.
Вот как я построил набор образцов:
Для каждого столбца в CSV я выбрал строку с самым длинным значением, а также строку с самым коротким значением.
Затем я построил массив с 1st 50 непустыми строками.
Так что мои образцы имели не менее 0 и не более 50 строк, которые охватывают весь диапазон в столбце.
После этого я бы попытался проанализировать от самого широкого определения до самого узкого:
если (строка) тогда тип = String;
Если (значение-DateTime), то thisType-DateTime;
Если (значение десятичное), то thisType является десятичным;
if (value is Integer) тогда thisType-целое число;
Если (значение логическое), то thisType является логическим;
Я использую метод tryparse в C#, но я уверен, что другие языки будут иметь аналогичные методы для использования.
может быть csvsql может быть полезно здесь? Не знаю, насколько это эффективно, но определенно выполняет работу по созданию инструкций sql create table из csvs.
$ csvsql so_many_columns.csv >> sql_create_table_with_char_types.txt