Напишем и поймем Decision Tree на Python с нуля! Часть 3. Библиотека для анализа данных Pandas

Автор оригинала: 豊久 中田
  • Перевод
  • Tutorial
Привет, Хабр! Представляю вашему вниманию перевод статьи "Pythonで0からディシジョンツリーを作って理解する (3. データ分析ライブラリPandas編)".

Это третья статья из серии. Ссылки на предыдущие статьи: первая, вторая

В данной статье я объясню, как работать с библиотекой Pandas, чтобы создавать Decision Tree.

3.1 Импортируем библиотеку


# импортируем pandas и прописываем, что далее мы будем ее указывать как pd
import pandas as pd

3.2 Data frame и Series


В pandas используются такие структуры, как Data frame и Series.
Рассмотрим их на примере следующей таблицы, напоминающей Excel.

Одна строка данных называется Series, столбцы — атрибутами этих данных, а вся таблица целиком — Data frame-ом.


3.3 Создаем Data frame


Подключаем Excel-таблицу с помощью read_excel или ExcelWriter
# Сохраняем Excel файл туда же, где находится и файл ipynb
df0 = pd.read_excel("data_golf.xlsx")
 
# выводим DataFrame как HTML таблицу 
from IPython.display import HTML
html = "<div style='font-family:\"メイリオ\";'>"+df0.to_html()+"</div>"
HTML(html)
 
# Сохраняем в Excel файл (with автоматически выполняет f.close)
with pd.ExcelWriter("data_golf2.xlsx") as f: 
       df0.to_excel(f)

Создание Data Frame из словаря (ассоциативного массива): словарь собирает вместе данные столбцов DataFrame

# создание из словаря: сбор данных из столбцов
 
d = {
    "Погода":["Ясно","Ясно","Облачно","Дождь","Дождь","Дождь","Облачно","Ясно","Ясно","Дождь","Ясно","Облачно","Облачно","Дождь"],
    "Температура":["Жарко","Жарко","Жарко","Тепло","Холодно","Холодно","Холодно","Тепло","Холодно","Тепло","Тепло","Тепло","Жарко","Тепло"], 
    "Влажность":["Высокая","Высокая","Высокая","Высокая","Норм","Норм","Норм","Высокая","Норм","Норм","Норм","Высокая","Норм","Высокая"],
    "Ветер":["Нет","Есть","Нет","Нет","Нет","Есть","Есть","Нет","Нет","Нет","Есть","Есть","Нет","Есть"],
 
"Гольф":["×","×","○","○","○","×","○","×","○","○","○","○","○","×"],
}
df0 = pd.DataFrame(d)

Создание Data Frame из массивов: сбор данных из строк DataFrame

# создание из массивов: сбор данных из строк 
d = [["Ясно","Жарко","Высокая","Нет","×"],
     ["Ясно","Жарко","Высокая","Есть","×"],
     ["Облачно","Жарко","Высокая","Нет","○"],
     ["Дождь","Тепло","Высокая","Нет","○"],
     ["Дождь","Холодно","Норм","Нет","○"],
     ["Дождь","Холодно","Норм","Есть","×"],
     ["Облачно","Холодно","Норм","Есть","○"],
     ["Ясно","Тепло","Высокая","Нет","×"],
     ["Ясно","Холодно","Норм","Нет","○"],
     ["Дождь","Тепло","Норм","Нет","○"],
     ["ясно","Тепло","Норм","Есть","○"],
     ["Облачно","Тепло","Высокая","Есть","○"],
     ["Облачно","Жарко","Норм","Нет","○"],
     ["Дождь","Тепло","Высокая","Есть","×"],
    ]
# название столбцов и строк можно указать как columns и index соответственно. В случае, если их опускать, указывается соответствующий им номер.

df0 = pd.DataFrame(d,columns=["Погода","Температура","Влажность","Ветер","Гольф"],index=range(len(d)))

3.4 Получаем информацию из таблицы


# получение информации из таблицы
 
# количество строк и столбцов
print(df0.shape) # вывод (14, 5)
 
#  получаем количество строк
print(df0.shape[0]) # вывод 14
 
# получаем названия столбцов
print(df0.columns) # вывод Index(['Погода', 'Температура', 'Влажность', 'Ветер', 'Гольф'], dtype='object')
 
# получаем названия строк (Название строки df0 - это автоматически присвоенный индекс)
print(df0.index) # вывод RangeIndex(start=0, stop=14, step=1)

3.5 Получаем значения loc iloc values


# получение значений
 
# получаем значение, указав строку и столбец
# получаем значение Влажности в строке под №1 (вторая сверху)
print(df0.loc[1,"Влажность"]) # вывод Высокая

# получаем значение, указав массив из нескольких строк и столбцов
# получаем значения Погоды и Гольфа из строк 1,2,4, и полученные данные тоже будут Data Frame-ом  
df = df0.loc[[1,2,4],["погода","Гольф"]]
print(df)
# вывод
#    Погода    Температура    Влажность    Ветер    Гольф
# 1    Ясно        Жарко        Высокая     Есть      ×
# 2    Облачно    Жарко        Высокая    Нет    ○
# 3    Дождь        Тепло        Высокая    Нет    ○
# 4    Дождь        Холодно    Норм        Нет    ○

# iloc позволяет индексировать строки и столбцы. Индексы отсчитываются от 0.
# получаем данные из строк с 1 по 3, не включая столбец Гольф. Так как iloc указывает индекс, если написать 1:4, то 4-ка включена не будет. 
df = df0.iloc[1:4,:-1]
print(df)
# вывод
#    Погода    Температура    Влажность    Ветер
# 1    Ясно        Жарко        Высокая     Есть     
# 2    Облачно    Жарко        Высокая    Нет
# 3    Дождь        Тепло        Высокая    Нет


# получаем значение из одной строки (Series)
# получаем данные из самой первой строки. s это Series
s = df0.iloc[0,:]
# так же, как и со словарем, значение можно получить с помощью s["название столбца"]
print(s["Погода"]) # вывод Ясно

# все значения получаем в виде массива (numpy.ndarray).
print(df0.values)

3.6 Цикл данных, пройдемся по данным с помощью iterrows iteritems


# цикл данных, просматриваем данные
# в цикле проходимся по строкам. Смотрим данные по каждой строчке.
for i,row in df0.iterrows():
    # i это название строки (индекс строки), row это Series
    print(i,row)
    pass

# в цикле проходимся по столбцам. Смотрим данные по вертикали.
for i,col in df0.iteritems():
    # i это название столбца, col это Series
    print(i,col)
    pass

3.7 Частота value_counts


# частота вывода данных
# получаем все данные из столбца Погода. s это Series
s = df0.loc[:,"Погода"]

# получаем необходимое количество нужных данных
print(s.value_counts())
# вывод
# Ясно    5
# Дождь    5
# Облачно    4
# Name: Погода, dtype: int64

# Например, получили количество строк, когда встречается “Ясно”
print(s.value_counts()["Ясно"]) # Вывод 5

3.8 Извлекаем конкретные данные query


# извлечение конкретных данных
# получаем данные, когда Погода - Ясно.
print(df0.query("Погода=='Ясно'"))
# вывод
#    Погода    Температура    Влажность    Ветер    Гольф
# 0    Ясно        Жарко        Высокая    Нет    ×
# 1    Ясно        Жарко        Высокая    Есть    ×
# 7    Ясно        Тепло        Высокая    Нет    ×
# 8    Ясно        Холодно    Норм        Нет    ○
# 10    Ясно        Тепло        Норм        Есть    ○

# получаем данные, когда Погода - ясно, и иду на гольф 
print(df0.query("Погода=='Ясно' and Гольф=='○'"))
# вывод
#    Погода    Температура    Влажность    Ветер    Гольф
# 8    Ясно        Холодно    Норм        Нет    ○
# 10    Ясно        Тепло        Норм        Есть    ○

# получаем данные, когда Погода - ясно, или иду на гольф 
print(df0.query("Погода=='Ясно' or Гольф=='○'"))
# вывод
#    Погода    Температура    Влажность    Ветер    Гольф
# 0    Ясно        Жарко        Высокая    Нет    ×
# 1    Ясно        Жарко        Высокая    Есть    ×
# 2    Облачно    Жарко        Высокая    Нет    ○
# 3    Дождь        Тепло        Высокая    Нет    ○
# 4    Дождь        Холодно    Норм        Нет    ○
# 6    Облачно    Холодно    Норм        Есть    ○
# 7    Ясно        Тепло        Высокая    Нет    ×
# 8    Ясно        Холодно    Норм        Нет    ○
# 9    Дождь        Тепло        Норм        Нет    ○
# 10    Ясно        Тепло        Норм        Есть    ○
# 11    Дождь        Тепло        Высокая    Есть    ○
# 12    Дождь        Жарко        Норм        Нет    ○

Спасибо за прочтение!

Мы будем очень рады, если вы расскажете нам, понравилась ли вам данная статья, понятен ли перевод, была ли она вам полезна?

Средняя зарплата в IT

111 000 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 7 247 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 9

    +1
    どうもありがとうございます
      0
      こちらこそ、読んでくださってありがとうございました!
      0
      И где здесь дерево решений?
        0
        Добрый день!

        Как вы могли заметить из названия, данная статья посвящена библиотеке Pandas. Она также является только 3-ей статьей из серии, последняя статья (6-ая) как раз будет посвящена генерации дерева решений.
        Обзорный пример есть в первой статье серии. Вы можете ознакомиться с ней по этой ссылке.
        0
        Даешь переводной туториал в 100500 частях!
          0
          Мы решили придерживаться структуры, которую предложил автор :)
          Думаете, лучше было бы одним длиннопостом? :)
          0
          Комментарии на родном языке — это прекрасно
            0
            Написано: «Одна строка данных называется Series, ...» На рисунке, наоборот — «Series» — столбец.
              0
              На рисунке одна строка также указана как Series :)

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое