mirror of
https://github.com/velocitatem/PHANTOM.git
synced 2026-05-31 16:43:36 +00:00
88 lines
3.3 KiB
Python
88 lines
3.3 KiB
Python
import pytest
|
|
import pandas as pd
|
|
|
|
from procesing.pricers import (
|
|
StaticPricer,
|
|
RandomPricer,
|
|
ElasticityBasedPricer
|
|
)
|
|
|
|
|
|
def test_static_pricer_fit_and_predict():
|
|
# Sample historical data
|
|
historical_data = pd.DataFrame({
|
|
'product_id': [1, 2, 3],
|
|
'base_price': [100.0, 150.0, 200.0]
|
|
})
|
|
|
|
# Initialize and fit StaticPricer
|
|
pricer = StaticPricer()
|
|
pricer.fit(historical_data)
|
|
|
|
# Predict prices
|
|
predicted_prices = pricer.predict(None)
|
|
|
|
# Assert that predicted prices match base prices
|
|
expected_prices = historical_data['base_price'].values
|
|
assert all(predicted_prices == expected_prices), "Predicted prices do not match base prices"
|
|
|
|
|
|
def test_random_pricer_fit_and_predict():
|
|
# Sample historical data
|
|
historical_data = pd.DataFrame({
|
|
'product_id': [1, 2, 3],
|
|
'base_price': [100.0, 150.0, 200.0]
|
|
})
|
|
|
|
# Initialize and fit RandomPricer
|
|
pricer = RandomPricer(price_min=50.0, price_max=250.0, seed=42)
|
|
pricer.fit(historical_data)
|
|
|
|
# Predict prices
|
|
predicted_prices = pricer.predict(None)
|
|
|
|
# Assert that predicted prices are within bounds
|
|
assert predicted_prices.min() >= 50.0, "Predicted prices are below minimum bound"
|
|
assert predicted_prices.max() <= 250.0, "Predicted prices are above maximum bound"
|
|
# distribution check (not so strict)
|
|
assert len(set(predicted_prices)) > 1, "Predicted prices are not varied enough"
|
|
assert len(predicted_prices) == len(historical_data), "Number of predicted prices does not match number of products"
|
|
|
|
def test_elasticity_based_pricer_fit_and_predict():
|
|
# Sample historical data
|
|
historical_data = pd.DataFrame({
|
|
'productId': [1, 2, 3],
|
|
'elasticity': [-1.5, -0.5, -2.0],
|
|
'base_price': [100.0, 150.0, 200.0],
|
|
'mean_demand': [10, 20, 15]
|
|
})
|
|
|
|
# Initialize and fit ElasticityBasedPricer
|
|
pricer = ElasticityBasedPricer(alpha=0.1, price_floor=50.0, price_ceil=300.0)
|
|
pricer.fit(historical_data)
|
|
|
|
# Create a mock state space with demand deviations
|
|
class MockStateSpace:
|
|
def __init__(self, demand):
|
|
self.demand = demand
|
|
|
|
# Simulate demand higher than mean for all products
|
|
state_space = MockStateSpace(demand=[15, 25, 20])
|
|
|
|
# Predict prices
|
|
predicted_prices = pricer.predict(state_space)
|
|
|
|
# Assert that predicted prices are within bounds
|
|
assert predicted_prices.min() >= 50.0, "Predicted prices are below minimum bound"
|
|
assert predicted_prices.max() <= 300.0, "Predicted prices are above maximum bound"
|
|
assert len(predicted_prices) == len(historical_data), "Number of predicted prices does not match number of products"
|
|
|
|
# now we gotta check semantic validity
|
|
# since demand is higher than mean, prices should generally increase
|
|
for i, row in historical_data.iterrows():
|
|
base_price = row['base_price']
|
|
elasticity = row['elasticity']
|
|
expected_increase = base_price * (1 + 0.1 * abs(elasticity) * ((state_space.demand[i] - row['mean_demand']) / row['mean_demand']))
|
|
assert predicted_prices[i] >= base_price, f"Predicted price for product {row['productId']} did not increase as expected"
|
|
assert abs(predicted_prices[i] - expected_increase) < 1e-5, f"Predicted price for product {row['productId']} does not match expected calculation within 1e-5 tolerance"
|