Porady. Pandas. Python. Django. Microsoft Power BI. Tableau.

Pandas. Przewodnik po pd.query() z przykładami e-commerce

| pandas | python | ecommerce

Metoda query() w pandas pozwala na filtrowanie DataFrame'ów przy użyciu wyrażeń napisanych jako stringi, które są bardziej czytelne i przypominają składnię SQL. Zamiast używać złożonych wyrażeń logicznych z nawiasami kwadratowymi, query() umożliwia napisanie warunków w naturalny sposób.

Podstawowa składnia

df.query('warunek', inplace=False)

Przykłady zastosowań w e-commerce

1. Proste filtrowanie zamówień

import pandas as pd

# Przykładowe dane zamówień
df_orders = pd.DataFrame({
    'order_id': [1001, 1002, 1003, 1004, 1005],
    'customer_id': [501, 502, 503, 501, 504],
    'total_amount': [149.99, 89.50, 299.00, 75.25, 450.00],
    'status': ['shipped', 'pending', 'delivered', 'cancelled', 'shipped'],
    'category': ['electronics', 'clothing', 'books', 'electronics', 'home']
})

# Tradycyjny sposób
high_value_orders = df_orders[df_orders['total_amount'] > 150]

# Z query() - bardziej czytelny
high_value_orders = df_orders.query('total_amount > 150')

2. Złożone warunki dla analizy sprzedaży

# Tradycyjny sposób - trudny do czytania
premium_electronics = df_orders[(df_orders['total_amount'] > 100) &
                                (df_orders['status'] == 'shipped') &
                                (df_orders['category'] == 'electronics')]

# Z query() - znacznie czytelniejszy
premium_electronics = df_orders.query(
    "total_amount > 100 and status == 'shipped' and category == 'electronics'"
)

# Zamówienia gotowe do wysyłki lub już dostarczone
ready_orders = df_orders.query("status == 'shipped' or status == 'delivered'")

3. Używanie zmiennych w analizach biznesowych

min_order_value = 100
target_categories = ['electronics', 'home']
vip_customers = [501, 504]

# Zamówienia wysokiej wartości w wybranych kategoriach
high_value_target = df_orders.query(
    'total_amount >= @min_order_value and category in @target_categories'
)

# Zamówienia klientów VIP
vip_orders = df_orders.query('customer_id in @vip_customers')

4. Analiza produktów i inwentarza

# DataFrame produktów
df_products = pd.DataFrame({
    'product_id': ['P001', 'P002', 'P003', 'P004', 'P005'],
    'name': ['iPhone 14', 'Nike Air Max', 'Python Book', 'Samsung TV', 'Coffee Maker'],
    'price': [999.99, 129.99, 45.00, 799.99, 89.99],
    'stock_quantity': [15, 0, 25, 3, 12],
    'rating': [4.5, 4.2, 4.8, 4.0, 3.9],
    'category': ['electronics', 'clothing', 'books', 'electronics', 'home']
})

# Produkty na wyczerpaniu (mało w magazynie)
low_stock = df_products.query('stock_quantity <= 5 and stock_quantity > 0')

# Produkty premium (wysoka cena i ocena)
premium_products = df_products.query('price > 500 and rating >= 4.0')

# Produkty wyprzedane
out_of_stock = df_products.query('stock_quantity == 0')

5. Analiza zachowań klientów

# DataFrame aktywności klientów
df_customers = pd.DataFrame({
    'customer_id': [501, 502, 503, 504, 505],
    'total_orders': [15, 3, 8, 25, 1],
    'total_spent': [1500.50, 200.25, 650.00, 3200.00, 89.99],
    'last_order_days_ago': [5, 30, 15, 2, 45],
    'segment': ['gold', 'bronze', 'silver', 'platinum', 'bronze'],
    'newsletter_subscriber': [True, False, True, True, False]
})

# Klienci aktywni (ostatnie zamówienie w ciągu 14 dni)
active_customers = df_customers.query('last_order_days_ago <= 14')

# Klienci wysokiej wartości którzy mogą potrzebować uwagi
at_risk_vip = df_customers.query(
    "segment in ['gold', 'platinum'] and last_order_days_ago > 30"
)

# Subskrybenci newslettera z segmentów premium
newsletter_premium = df_customers.query(
    "newsletter_subscriber == True and segment in ['gold', 'platinum']"
)

6. Operacje na danych tekstowych w e-commerce

# DataFrame z opisami produktów
df_product_details = pd.DataFrame({
    'product_name': ['iPhone 14 Pro Max', 'Samsung Galaxy S23', 'MacBook Air M2', 'Dell XPS 13'],
    'description': ['Latest iPhone with ProRAW', 'Android flagship phone', 'Apple laptop with M2 chip', 'Windows ultrabook'],
    'brand': ['Apple', 'Samsung', 'Apple', 'Dell'],
    'model': ['iPhone', 'Galaxy', 'MacBook', 'XPS']
})

# Produkty Apple zawierające "Pro" w nazwie
apple_pro = df_product_details.query(
    'brand == "Apple" and product_name.str.contains("Pro")',
    engine='python'
)

# Produkty z opisami zawierającymi "phone"
phones = df_product_details.query(
    'description.str.contains("phone", case=False)',
    engine='python'
)

7. Analiza sprzedaży według dat i sezonowości

# DataFrame sprzedaży dziennej
df_sales = pd.DataFrame({
    'date': pd.date_range('2024-01-01', periods=100),
    'daily_revenue': [1000 + i*10 + (i%7)*200 for i in range(100)],
    'orders_count': [50 + i + (i%7)*20 for i in range(100)],
    'avg_order_value': [20.5, 25.3, 30.1, 18.9, 22.7] * 20
})

# Dni z wysoką sprzedażą
high_sales_days = df_sales.query('daily_revenue > 2000')

# Dni z niską wartością średniego zamówienia
low_aov_days = df_sales.query('avg_order_value < 20')

8. Kombinowanie z innymi metodami pandas

# Analiza najlepszych kategorii produktów
category_performance = (df_orders.query('status == "delivered"')
                       .groupby('category')
                       .agg({
                           'total_amount': ['sum', 'mean', 'count']
                       })
                       .round(2))

# Top klienci w określonym przedziale wartości zamówień
top_medium_spenders = (df_customers.query('500 <= total_spent <= 2000')
                      .sort_values('total_spent', ascending=False)
                      .head(10))

# Produkty do uzupełnienia zapasów
restock_needed = (df_products.query('stock_quantity < 10 and rating >= 4.0')
                 .sort_values(['stock_quantity', 'rating'], ascending=[True, False]))

9. Przykłady zaawansowanych zapytań biznesowych

# Identyfikacja produktów hit i flop
seasonal_threshold = 100
rating_threshold = 4.2

# Produkty hit (wysokie oceny i cena powyżej progu)
hit_products = df_products.query(
    f'rating >= {rating_threshold} and price > {seasonal_threshold}'
)

# Analiza churn risk (klienci którzy mogą odejść)
churn_days = 60
min_orders_for_analysis = 3

churn_risk = df_customers.query(
    f'last_order_days_ago > {churn_days} and total_orders >= {min_orders_for_analysis}'
)

# Produkty wymagające promocji (niska rotacja + wysoka cena)
promotion_candidates = df_products.query(
    'stock_quantity > 20 and price > @df_products.price.median() and rating < 4.0'
)

Zastosowania biznesowe query() w e-commerce

  • Segmentacja klientów - szybkie filtrowanie według wartości, częstotliwości zakupów
  • Analiza produktów - identyfikacja bestselerów, produktów na wyczerpaniu
  • Monitoring zamówień - śledzenie statusów, wartości, kategorii
  • Wykrywanie trendów - analiza sezonowości, wzorców zakupowych
  • Optymalizacja zapasów - identyfikacja produktów do uzupełnienia lub promocji

Metoda query() jest szczególnie przydatna w e-commerce, gdzie często pracujemy ze złożonymi warunkami filtrowania danych sprzedażowych, co czyni kod bardziej czytelnym i łatwiejszym w utrzymaniu.