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.