302 KiB
302 KiB
Лабораторная работа 1¶
Вариант - 11 Датасет - цены на бриллианты
Загрузка и сохранение данных
In [17]:
import pandas as pd
df = pd.read_csv("data/Diamonds Prices2022.csv")
df.to_csv("data/Diamonds Prices2022 updated.csv", index=False)
Получение сведений о датафрейме с данными
- Общая информация о датафрейме
In [2]:
df.info()
- Статистическая информация
In [3]:
df.describe()
Out[3]:
Получение сведений о колонках датафрейма
- Названия колонок
In [4]:
df.columns
Out[4]:
Вывод отдельных строк и столбцов
- Столбец "carat"
In [5]:
df[["carat"]]
Out[5]:
- Несколько столбцокв
In [6]:
df[["id", "cut"]]
Out[6]:
- Первая строка
In [7]:
df.iloc[[0]]
Out[7]:
- Вывод по условию
In [8]:
df[df["price"] > 400]
Out[8]:
Группировка и агрегация данных
- Средняя стоимость по типу огранки
In [9]:
df.groupby(["cut"])[["price"]].mean()
Out[9]:
- Средний вес по типу огранки
In [10]:
df.groupby("cut")[["carat"]].mean()
Out[10]:
Сортировка данных
- Сортировка по цене по убыванию
In [11]:
df.sort_values("price", ascending=False)
Out[11]:
- Сортировка по нескольким столбцам
In [12]:
df.sort_values(["carat", "price"], ascending=[True, False])
Out[12]:
Удаление строк/столбцов
- Удаление столбца
In [13]:
df.drop("depth", axis=1)
Out[13]:
Удаление строки
In [14]:
df.drop(0, axis=0)
Out[14]:
Создание новых столбцов
- Создание нового столбца "стоимость 1 карата"
In [15]:
df["price_carat"] = df["price"] / df["carat"]
df[["price_carat"]]
Out[15]:
Удаление строк с пустыми значениями
- Удаление строк с NaN
In [16]:
df.dropna()
Out[16]:
- Заполнить пустые значения для определённого столбца
In [17]:
df.fillna({"price": df["price"].mean()}, inplace=True)
Заполнение пустых значений
- Заполнение средним значением
In [19]:
cut_mapping = {'Fair': 0, 'Good': 1, 'Very Good': 2, 'Premium': 3, 'Ideal': 4}
df['cut'] = df['cut'].map(cut_mapping)
color_mapping = {'J': 0, 'I': 1, 'H': 2, 'G': 3, 'F': 4, 'E': 5, 'D': 6}
df['color'] = df['color'].map(color_mapping)
clarity_mapping = {'I1': 0, 'SI2': 1, 'SI1': 2, 'VS2': 3, 'VS1': 4, 'VVS2': 5, 'VVS1': 6, 'IF': 7}
df['clarity'] = df['clarity'].map(clarity_mapping)
df.fillna(df.mean(), inplace=True)
Визуализация данных с Pandas и Matplotlib
- Линейная диаграмма (plot). Вес бриллиантов
In [27]:
import matplotlib.pyplot as plt
df.plot(x="id", y="carat", kind="line")
plt.xlabel("id")
plt.ylabel("weight")
plt.title("Weight of diamonds")
plt.show()
- Столбчатая диаграмма (bar). Соотношение цены и веса
In [28]:
df.plot(x="carat", y="price", kind="bar")
plt.xlabel("weight")
plt.ylabel("price")
plt.title("Price-Weight")
plt.show()
- Гистограмма (hist). Частота встречаемости по глубине
In [6]:
df["depth"].plot(kind="hist")
plt.xlabel("depth")
plt.ylabel("Frequency")
plt.title("Frequency of depth")
plt.show()
- Ящик с усами (box). Вес
In [11]:
df["carat"].plot(kind="box")
plt.ylabel("weight (carat)")
plt.title("Box Plot of diamond weight")
plt.show()
- Диаграмма с областями (area).
In [12]:
df.plot(x="id", y="price", kind="area")
plt.xlabel("id")
plt.ylabel("price")
plt.title("Price by id diamonds")
plt.show()
- Диаграмма рассеяния (scatter). Зависимость цены от веса
In [25]:
df.plot(kind="scatter", x="carat", y="price")
plt.xlabel("weight")
plt.ylabel("price")
plt.title("The dependence of price on weight")
plt.show()
- Круговая диаграмма (pie). Прозрачность
In [19]:
# Определение порога для объединения редких значений
threshold = 0.02 # Порог 2%
# Подсчёт количества уникальных значений и расчёт частот
value_counts = df["clarity"].value_counts()
total_count = value_counts.sum()
# Условие для агрегации значений ниже порога
other_values = value_counts[value_counts / total_count < threshold].sum()
main_values = value_counts[value_counts / total_count >= threshold]
# Добавление категории "Other"
main_values["Other"] = other_values
# Построение диаграммы
main_values.plot(kind="pie",
autopct='%1.1f%%', # Проценты
startangle=90, # Начальный угол
counterclock=False, # По часовой стрелке
cmap="Set3", # Цветовая схема
wedgeprops={'edgecolor': 'black'}) # Границы сегментов
plt.title("Distribution of Daily Customer Count in Stores (Aggregated)")
plt.subplots_adjust(left=0.3, right=0.7, top=0.9, bottom=0.1)
plt.show()