/
Student_Sw
/
my_app
Обзор
Документация
Войти
/
Student_Sw
/
my_app
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app.py
188 строк
7 KB
swetiksem234
Create: app.py, items.csv, orders.csv, users.csv
24 июл 2026, 22:03
Верифицирован
24 июл 2026, 22:03
4792409
Код
Авторство
О чём код?
import streamlit as st import pandas as pd import matplotlib.pyplot as plt from pandas.api.types import is_datetime64_any_dtype from pandas.api.types import is_numeric_dtype @st.cache_data def load_data(): #... Загрузка данных ... url_orders = "orders.csv" url_users = "users.csv" url_items = "items.csv" data_orders = pd.read_csv(url_orders) data_users = pd.read_csv(url_users) data_items = pd.read_csv(url_items) data_orders = data_orders.drop_duplicates() data_users = data_users.drop_duplicates() data_items = data_items.drop_duplicates() # ... обработка данных ... # объединение data = ( data_orders .merge( data_users, on='user_id', how='left' ) .merge( data_items, on='item_id', how='left' ) ) nulls = data.isnull().sum() print(nulls) types = {"order_date": "datetime", "registration_date":"datetime", "price_per_unit": "float64", "quantity": "int64", "base_price": "float64"} print(data.dtypes) for col in data.columns: if (col in types and data[col].dtype != types[col]): if (types[col] == "float64" or types[col] == "int64" and is_numeric_dtype(data[col]) == False): data[col] = pd.to_numeric(data[col], errors='coerce') elif (types[col] == "datetime" and is_datetime64_any_dtype(data[col]) == False): data[col] = pd.to_datetime(data[col], errors='coerce') print(data.dtypes) base_values = {"category": "Unknown", "user_name": "Unknown"} del_values = ["registration_date", "price_per_unit", "quantity"] data = data.dropna(subset=del_values) nulls = data.isna().sum() print(nulls) for col in nulls.index: if (nulls[col] > 0 and col in base_values): data[col] = df[col].fillna(base_values[col]) return data # В основном коде приложения st.set_page_config(layout="wide") st.title("Анализ продаж") df = load_data() tab1, tab2, tab3, tab4 = st.tabs(["Сырые данные", "Ключевые показатели", "Визуализация", "Аналитические выводы"]) with tab1: st.header("Сырые данные") with st.sidebar: st.header("Фильтры") #df_visib = df.copy() #df_visib['order_date'] = df['order_date'].dt.strftime('%d-%m-%Y') #df_visib['registration_date'] = df['registration_date'].dt.strftime('%d-%m-%Y') dates = sorted(list(df['order_date'].unique())) date = st.multiselect('Дата заказа:', dates, default=dates) categories = sorted(list(df['category'].unique()))#.sort_values() category = st.multiselect('Категория:', categories, default=categories) filtered_df = df[(df['order_date'].isin(date)) & (df['category'].isin(category))] st.dataframe(filtered_df) with tab2: st.header("Ключевые показатели") count_orders = len(df) total_revenue = (df["quantity"]*df["price_per_unit"]).sum() users = df["user_id"].drop_duplicates() count_users_uniq = len(users) col1, col2, col3, col4 = st.columns(4) with col1: st.metric("Общее количество заказов", f"{count_orders:}") with col2: st.metric("Общая выручка", f"{total_revenue:,.0f}₽") with col3: st.metric("Количество уникальных пользователей", f"{count_users_uniq:}") with col4: st.metric("Средний чек", f"{total_revenue/count_orders:,.0f}₽") # st.dataframe(df) with tab3: st.header("Визуализация") col5, col6 = st.columns(2) df["revenue"] = df["quantity"]*df["price_per_unit"] item_revenue = ( df .groupby('item_name') .agg( total_revenue=('revenue', 'sum'), ) .sort_values('total_revenue', ascending=False) .head(10) .reset_index() ) with col5: st.subheader("Топ 10 товаров по выручке") fig_bar, axs = plt.subplots(figsize=(10, 6)) bars = axs.barh(item_revenue['item_name'], item_revenue['total_revenue']) axs.bar_label(bars, label_type='edge', color='black') st.pyplot(fig_bar) category_revenue = ( df .groupby('category') .agg( total_revenue=('revenue', 'sum'), ) .sort_values('category', ascending=False) .reset_index() ) category_revenue["total_revenue_pr"] = category_revenue["total_revenue"] / total_revenue * 100 with col6: fig_pie, ax = plt.subplots(figsize=(10, 6)) pie = ax.pie(category_revenue["total_revenue_pr"], labels=round(category_revenue["total_revenue_pr"], 2)) #ax.pie_label(pie, '{frac:.1%}g)', textprops=dict(color="w", size=8, weight="bold")) ax.legend(pie.wedges, category_revenue["category"], loc="center left", bbox_to_anchor=(1, 0, 0.5, 1)) st.subheader("Выручка по категориям") st.pyplot(fig_pie) df["weekday"] = df["order_date"].dt.weekday weekday_revenue = ( df .groupby('weekday') .agg( count_orders=('order_id', 'sum'), ) .sort_values('weekday', ascending=False) .reset_index() ) st.subheader("Зависимость количества заказов от дня недели") fig_weekday, ax_weekday = plt.subplots(figsize=(10, 6)) bar_w = ax_weekday.bar(weekday_revenue['weekday'], weekday_revenue['count_orders']) ax_weekday.set_xticklabels([' ', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье']) # Новые метки ax_weekday.bar_label(bar_w, label_type='edge', color='black') st.pyplot(fig_weekday) # st.dataframe(df) with tab4: st.header("Аналитические выводы") st.markdown(f"Основная выручка приходится на категорию \"{category_revenue.sort_values("total_revenue", ascending=False)['category'].head(1)[0]}\"") days = {0: "Понедельник", 1: "Вторник", 2:"Среда", 3:"Четверг", 4: "Пятница", 5:"Суббота", 6:"Воскресенье"} weekday_revenue['weekday'] = weekday_revenue['weekday'].map(days) days_ = weekday_revenue.sort_values('count_orders', ascending=False)['weekday'].head(2).reset_index()['weekday'] print(days_) st.markdown(f"Пик заказов наблюдается в день: {", ".join(days_)}") st.markdown(f"Товар \"{item_revenue.sort_values("item_name", ascending=False)['item_name'].head(1).reset_index()["item_name"][0]}\" является лидером продаж")