Добавить в корзинуПозвонить
Найти в Дзене
SQL аналитика

Как в Python найти заказы, ушедшие в минус после возвратов

```python import pandas as pd sales = pd.read_csv('sales.csv') returns = pd.read_csv('returns.csv') print(sales.head()) ``` Что делает: Импортирует pandas, считывает два CSV-файла в датафреймы и выводит первые 5 строк для визуальной проверки структуры и наличия данных. ```python sales['order_id'] = sales['order_id'].astype(str).str.strip() returns['order_id'] = returns['order_id'].astype(str).str.strip() sales['amount'] = pd.to_numeric(sales['amount'], errors='coerce').fillna(0) returns['amount'] = pd.to_numeric(returns['amount'], errors='coerce').fillna(0) ``` Что делает: Приводит ID к строке без пробелов, суммы - к числам, а пустые значения заменяет нулями для корректных расчётов. ```python sales_agg = sales.groupby('order_id')['amount'].sum().reset_index() sales_agg.rename(columns={'amount': 'sales_amount'}, inplace=True) returns_agg = returns.groupby('order_id')['amount'].sum().reset_index() returns_agg.rename(columns={'amount': 'return_amount'}, inplace=True) ``` Что делает: Сумми
Оглавление

Блок кода 1. Загрузка и первичный осмотр

```python
import pandas as pd
sales = pd.read_csv('sales.csv')
returns = pd.read_csv('returns.csv')
print(sales.head())
```

Что делает: Импортирует pandas, считывает два CSV-файла в датафреймы и выводит первые 5 строк для визуальной проверки структуры и наличия данных.

Блок кода 2. Очистка и приведение типов

```python
sales['order_id'] = sales['order_id'].astype(str).str.strip()
returns['order_id'] = returns['order_id'].astype(str).str.strip()
sales['amount'] = pd.to_numeric(sales['amount'], errors='coerce').fillna(0)
returns['amount'] = pd.to_numeric(returns['amount'], errors='coerce').fillna(0)
```

Что делает: Приводит ID к строке без пробелов, суммы - к числам, а пустые значения заменяет нулями для корректных расчётов.

Блок кода 3. Агрегация по заказам

```python
sales_agg = sales.groupby('order_id')['amount'].sum().reset_index()
sales_agg.rename(columns={'amount': 'sales_amount'}, inplace=True)
returns_agg = returns.groupby('order_id')['amount'].sum().reset_index()
returns_agg.rename(columns={'amount': 'return_amount'}, inplace=True)
```

Что делает: Суммирует продажи и возвраты по каждому уникальному ID, предотвращая «раздувание» сумм при объединении.

Блок кода 4. Безопасное объединение

```python
merged = pd.merge(sales_agg, returns_agg, on='order_id', how='left')
merged['return_amount'] = merged['return_amount'].fillna(0)
```

Что делает: Соединяет таблицы по order_id через левое соединение. Заказы без возвратов получают ноль, никто не теряется.

Блок кода 5. Расчёт, фильтрация и сохранение

```python
merged['profit'] = merged['sales_amount'] - merged['return_amount']
negative_orders = merged[merged['profit'] < 0]
negative_orders.to_csv('negative_orders.csv', index=False, encoding='utf-8-sig')
```

Что делает: Считает чистую прибыль, оставляет только убыточные заказы и сохраняет результат в CSV с корректной кодировкой для Excel