368 KiB
368 KiB
Лабораторная работа 1¶
Вариант - 9
Датасет - магазины
Поля
- ID магазина
- площадь магазина
- количество разных товаров
- количество покупателей
- объем продаж
Загрузка и сохранение данных
In [1]:
import pandas as pd
df = pd.read_csv("data/Stores.csv")
df.to_csv("data/Stores_updated.csv", index=False)
Получение сведений о датафрейме с данными
- Общая информация о датафрейме
In [2]:
df.info()
- Статистическая информация
In [3]:
df.describe()
Out[3]:
Получение сведений о колонках датафрейма
- Названия колонок
In [4]:
df.columns
Out[4]:
Вывод отдельных строк и столбцов
- Столбец "Store_Area"
In [5]:
df[["Store_Area"]]
Out[5]:
- Несколько столбцокв
In [6]:
df[["Store ID ", "Store_Sales"]]
Out[6]:
- Первая строка
In [7]:
df.iloc[[0]]
Out[7]:
- Вывод по условию
In [8]:
df[df["Store_Sales"] > 2000]
Out[8]:
Группировка и агрегация данных
- Средняя продажа по каждому магазину
In [9]:
df.groupby(["Store ID "])[["Store_Sales"]].mean()
Out[9]:
- Для каждого магазина общая сумма продаж и среднее количество посетителей
In [10]:
df.groupby("Store ID ").agg({"Store_Sales": "sum", "Daily_Customer_Count": "mean"})
Out[10]:
Сортировка данных
- Сортировка по продажам по убыванию
In [11]:
df.sort_values("Store_Sales", ascending=False)
Out[11]:
- Сортировка по нескольким столбцам
In [12]:
df.sort_values(["Store_Area", "Store_Sales"], ascending=[True, False])
Out[12]:
Удаление строк/столбцов
- Удаление столбца
In [13]:
df.drop("Store_Area", axis=1)
Out[13]:
Удаление строки
In [14]:
df.drop(0, axis=0)
Out[14]:
Создание новых столбцов
- Создание нового столбца с доходом на одного клиента
In [15]:
df["Revenue_per_Customer"] = df["Store_Sales"] / df["Daily_Customer_Count"]
df[["Revenue_per_Customer"]]
Out[15]:
Удаление строк с пустыми значениями
- Удаление строк с NaN
In [16]:
df.dropna()
Out[16]:
- Заполнить пустые значения для определённого столбца
In [17]:
df.fillna({"Store_Sales": df["Store_Sales"].mean()}, inplace=True)
Заполнение пустых значений
- Заполнение средним значением
In [18]:
df.fillna(df.mean(), inplace=True)
Визуализация данных с Pandas и Matplotlib
- Линейная диаграмма (plot). Продажи по магазинам
In [19]:
import matplotlib.pyplot as plt
df.plot(x="Store ID ", y="Store_Sales", kind="line")
plt.xlabel("Store ID")
plt.ylabel("Store Sales")
plt.title("Store Sales by Store ID")
plt.show()
- Столбчатая диаграмма (bar). Средние продажи
In [20]:
df.plot(x="Store ID ", y="Store_Sales", kind="bar")
plt.xlabel("Store ID")
plt.ylabel("Store Sales")
plt.title("Store Sales by Store ID")
plt.show()
- Гистограмма (hist). Распределение количества товаров
In [21]:
df["Items_Available"].plot(kind="hist")
plt.xlabel("Number of Items Available")
plt.ylabel("Frequency")
plt.title("Distribution of Items Available in Stores")
plt.show()
- Ящик с усами (box). Продажи
In [22]:
df["Store_Sales"].plot(kind="box")
plt.ylabel("Store Sales (US $)")
plt.title("Box Plot of Store Sales")
plt.show()
- Диаграмма с областями (area).
In [23]:
df.plot(x="Store ID ", y="Store_Sales", kind="area")
plt.xlabel("Store ID")
plt.ylabel("Store Sales")
plt.title("Store Sales by Store ID")
plt.show()
- Диаграмма рассеяния (scatter). Зависимость продаж от количества посетителей
In [24]:
df.plot(kind="scatter", x="Daily_Customer_Count", y="Store_Sales")
plt.xlabel("Daily Customer Count")
plt.ylabel("Store Sales (US $)")
plt.title("Store Sales vs. Daily Customer Count")
plt.show()
- Круговая диаграмма (pie). Количество товаров
In [25]:
# Определение порога для объединения редких значений
threshold = 0.02 # Порог 2%
# Подсчёт количества уникальных значений и расчёт частот
value_counts = df["Daily_Customer_Count"].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()