Оценка возможностей csvkit для управления данными из командной строки
Столкнувшись с новым набором данных CSV для анализа, большинство из нас, специалистов по данным, мгновенно запускают нашу любимую среду IDE или редактор блокнотов и начинают с обычного импорта numpy
и pandas
.
Не то чтобы в этом что-то не так, но сегодня я хотел бы показать вам, как поближе познакомиться со своими данными, не выходя из командной строки.
Я буду использовать csvkit
, инструмент, созданный специально для этой цели. Я также буду использовать в примерах набор данных Kaggle, который можно загрузить также из командной строки, как таковой:
pip install kaggle
kaggle datasets download datafiniti/hotel-reviews
unzip hotel-reviews.zip
Изучение набора данных
csvcut:
Мы мало что знаем об этом наборе данных, кроме как об отелях. Во-первых, мы хотели бы знать, какие столбцы там есть. Легкий:
csvcut -n Datafiniti_Hotel_Reviews.csv
csvlook:
Допустим, вы хотите взглянуть на первые несколько значений столбцов province
и postalCode
. В приведенном ниже коде мы выбираем подмножество столбцов с csvcut
и помещаем его в качестве входных данных в csvlook
:
csvcut -c country,province,postalCode Datafiniti_Hotel_Reviews.csv | csvlook --max-rows 10
В качестве альтернативы мы могли бы передать вывод csvlook
команде head
вместо использования параметра --max-rows
.
csvstat:
Теперь, учитывая вышеприведенные выходные данные, мы могли бы проверить, что данные относятся только к США. Чтобы узнать больше о конкретных столбцах, мы можем использовать csvstat
:
csvcut -c country,province,postalCode Datafiniti_Hotel_Reviews.csv | csvstat
Это много очень полезной информации, которую очень легко получить! Обратите внимание, что мы также получаем количество строк в файле из вывода выше.
Если вы хотите получить статистику по всем столбцам, вы, конечно, можете использовать csvstat
напрямую, без конвейера:
csvstat Datafiniti_Hotel_Reviews.csv
csvsort:
Предположим, теперь мы хотим быстро взглянуть на самые последние обзоры вместе с городами. Мы можем попробовать сделать это с помощью csvsort
:
csvcut -c reviews.date,city,reviews.title Datafiniti_Hotel_Reviews.csv | csvsort -c reviews.date -r | csvlook --max-rows 10
Замечание: в зависимости от выбранных столбцов я иногда получаю сообщение об ошибке типа Row has X values, but Table has Y columns
. В этом случае добавление --snifflimit 0
устранило проблему.
csvgrep:
Чтобы завершить этап исследования, давайте поищем все заголовки отзывов, в которых упоминаются "тихие" или "тихие" отели. В приведенной ниже команде я добавляю номера строк с помощью флага -l
. Обратной стороной команды csvgrep
является то, что я не мог передать ее вывод другим командам.
csvcut -c name,reviews.title -l Datafiniti_Hotel_Reviews.csv | csvgrep -c reviews.title -r "(?i)(quiet|peaceful)
Запрос набора данных
Очень интересная особенность csvkit
- это возможность запрашивать данные из командной строки с помощью SQL.
Например, давайте снова выполним поиск тихих отелей, но на этот раз выведем их город и название отеля:
csvsql --query "select city, name from Datafiniti_Hotel_Reviews where [reviews.text] LIKE '%quiet%' limit 10;" Datafiniti_Hotel_Reviews.csv
Выполнение этой команды дает следующий результат:
К сожалению, я должен сказать, что выполнение этого запроса было довольно медленным, что изначально противоречит цели оставаться в командной строке.
Хотя мы можем сохранить CSV как локальную базу данных и после этого запросить эту базу данных, я снова обнаружил, что, если я намерен пойти по пути баз данных, я мог бы полностью использовать язык программирования.
Вывод
В целом, идея csvkit показалась мне интересной, но медленная скорость выполнения запросов sql сильно разочаровала. Для меня ценностного предложения было недостаточно, чтобы отвлечь меня от pandas и jupyter, даже для исследования.