Повышение удобочитаемости: советы по отображению наборов данных в 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
  • Полезно? Купите мне Ко-фи.