Повышение удобочитаемости: советы по отображению наборов данных в CLI
Пару дней назад я хотел помочь отцу решить проблему. Ему нужно было собрать, отфильтровать и отобразить некоторые данные как можно быстрее. Ну… правда в том, что он печатал данные (где-то по 10 страниц каждый раз!!) и искал данные вручную! Я увидел его трудности и решил немедленно помочь ему.
Ничего сложного для того, кто может анализировать данные, как я: данные уже были в формате Excel, поэтому Jupyter Notebook и Pandas были идеальным выбором.
Проблема в том, что я не работаю на своего отца. Также мы разъезжаемся по разным городам и видимся только раз в пару недель. Итак, мне нужно было дать ему инструмент, который он мог бы использовать со следующими характеристиками:
- Простое использование.
- Не делайте так, чтобы ПК взорвался, если он пишет что-то не так.
Вот почему я подумал создать небольшую программу, которой можно было бы управлять через CLI. То, что я хотел создать, было легко: пользователь что-то пишет через командную строку. Затем программа показывает пользователю все связанные данные, как это сделал бы Pandas, но в терминале.
Итак, в этой статье я покажу вам, как мы можем отображать табличные данные через CLI (интерфейс командной строки. То есть: терминал, если вы не знали). Мы создадим простой проект, чтобы вы сразу же познакомились с Python и обсудили библиотеки, которые я использовал.
Создание табличных данных
Итак, прежде всего, давайте создадим некоторые табличные данные просто для упражнения:
import pandas as pd # Create data data = {"fruit":["banana", "apple", "pear", "orange"], "color":["yellow", "red", "green", "orange"], "weight(kg)":[0.3, 0.1, 0.1, 0.2] } # Transform data to data frame df = pd.DataFrame(data)
Итак, наши данные:
Мы создали некоторые табличные данные, которые содержат информацию о некоторых фруктах, в частности: название фрукта, цвет и вес в килограммах.
Теперь, чтобы сделать его «более реальным», мы можем сохранить его в файл Excel следующим образом:
# Save data frame to xlsx file df.to_excel("fruit.xlsx") NOTE: This methodology of saving files that Pandas gives us is very useful. For example, we can use it to convert CSV files into XLSX; We did it in this article here.
Проблема и ее решение
Теперь мы создадим простой фильтр, которому не нужен Python, если мы можем немного использовать Excel. Проблема, с которой я столкнулся, была более сложной, но здесь мы создаем ее просто специально: наша задача не в том, чтобы показать, что этот метод лучше другого. Здесь мы показываем, как мы можем отображать табличные данные через CLI, и простой пример сделает эту работу.
Итак, допустим, это наша проблема: мы хотим, чтобы пользователь написал название фрукта, и наша программа возвращает все характеристики выбранного фрукта. Мы также хотим, чтобы фильтр был каким-то «интеллектуальным», чтобы, если пользователь пишет «горох», он отображал функции, связанные с «грушей».
Для этого в Pandas мы можем использовать метод str.contains()
. Давайте попробуем это в нашем блокноте Jupyter:
import pandas as pd # Import data df = pd.read_excel("fruit.xlsx") # Filter for pear data_frame = df[df["fruit"].str.contains("pea")] # Show filtered data data_frame.head()
И мы получаем:
Прочтите это внимательно: мы специально написали «pea» как опечатку, чтобы убедиться, что Pandas все равно вернет данные. И это происходит, как и ожидалось.
Итак, теперь нам предстоит столкнуться с другой проблемой: вмешательством пользователя через CLI. Насколько я знаю, в этих случаях мы можем использовать два разных метода: мы можем использовать встроенную функцию input
или мы можем использовать библиотеку argparse
.
Если вы пропустили, я написал статью о том, как мы можем использовать argparse
в науке о данных. Проверьте это здесь:
Теперь, в этом случае, я решил использовать встроенную функцию input
, потому что я считаю, что ее проще использовать, и в таких простых случаях, как этот, это очень хороший выбор. На самом деле, это идеальный выбор, если нам нужно просто передать строку в качестве аргумента через CLI (документацию можно прочитать здесь).
Мы можем использовать функцию input
следующим образом:
# User input fruit = input("filter the data for the kind of fruit: ")
Теперь давайте посмотрим, как это работает и как возвращает данные. Это код, который мы можем использовать:
import pandas as pd # User input fruit = input("filter the data for the kind of fruit: ") # Import data df = pd.read_excel("fruit.xlsx") # Filter for user input data_frame = df[df["fruit"].str.contains(fruit)] # Print results print(data_frame) NOTE: look at the difference of how we've pasted the arguments in the method str.contains(). Aboved we've passed "pea" with quotes because we were searching directly for a string. In this case, insetead, we have passed "fruit" without quotes because we have used "fruit" as a variable to invoke the input() function so it has to be passed as is (with no quotes).
Теперь сохраним его как fruit.py
, переместим в папку, где находится fruit.xlsx
, и запустим через терминал:
Ну, как мы видим, все работает нормально. Но только одно: можем ли мы улучшить визуализацию? Что, если мы хотим лучше отображать данные, как если бы мы были на пандах?
Что ж, решение, которое я нашел, было использовать библиотеку tabulate
(вот документация).
Итак, добавим tabulate
в наш код и посмотрим, что получится:
import pandas as pd from tabulate import tabulate # User input fruit = input("filter the data for the kind of fruit: ") # Import data df = pd.read_excel("fruit.xlsx") # Filter for user input data_frame = df[df["fruit"].str.contains(fruit)] # Print results print(tabulate(data_frame, headers='keys', tablefmt='psql'))
И мы получаем:
Как мы видим, данные отображаются в «табличном виде», что более понятно. Кроме того, как мы видим, код правильно обрабатывает опечатки, если мы ищем «горох», как мы делали это раньше в Jupyter.
Выводы
Я надеюсь, что это поможет вам, если вам нужно отображать табличные данные через CLI. Если у вас есть другие предложения, пожалуйста, дайте мне знать в комментариях: я всегда открыт для улучшения и изучения чего-то нового.
- Подпишитесь на мою рассылку, чтобы получать больше информации о Python и науке о данных.
- Понравилась статья? Присоединяйтесь к Medium через мою реферальную ссылку: разблокируйте весь контент на Medium за 5 долл. США в месяц (без дополнительной платы).
- Найдите меня/свяжитесь со мной здесь: https://bio.link/federicotrotta
- Полезно? Купите мне Ко-фи.