Skip to main content

PriceProphet

Multi-model price forecasting, anomaly detection, price elasticity, and seasonality analysis for Python.

PyPI version CI Python 3.10+ License: MIT

Installation

pip install priceprophet

Quick Start

from priceprophet import PriceProphet
import pandas as pd

pp = PriceProphet()

df = pd.DataFrame({
    'date':  pd.date_range('2025-01-01', periods=180),
    'price': [100 + i*0.3 + (i % 7)*2 for i in range(180)]
})

# Auto-select best model
forecast = pp.forecast(df, periods=30, model="auto")
print(forecast.head())

# Detect price anomalies
anomalies = pp.detect_anomalies(df)
print(anomalies[anomalies['is_anomaly']])

# Market shock simulation
impact = pp.simulate_impact(current_price=150.0, shock_magnitude=0.15, shock_type="competitor")
print(impact)

Features at a Glance

Feature Description
4 Forecasting Models Linear, Ridge, Polynomial (deg 1–5), EMA
Auto Model Selection Picks the best model via train/test split
Model Comparison Compare all models — MAE, RMSE, R² table
Price Elasticity Arc and point elasticity with revenue simulation
Seasonality Detection Weekly, monthly, FFT-based dominant cycle
Anomaly Detection Z-score with configurable threshold
Shock Simulation competitor / supply / demand / regulation shocks

Forecasting Models

from priceprophet import PriceProphet
import pandas as pd, numpy as np

pp = PriceProphet()
df = pd.DataFrame({
    'date':  pd.date_range('2024-01-01', periods=365),
    'price': 100 + np.cumsum(np.random.randn(365) * 0.5)
})

# Linear regression (fastest, good for stable trends)
fc_linear = pp.forecast(df, periods=30, model="linear")

# Ridge (L2-regularized, robust to outliers)
fc_ridge  = pp.forecast(df, periods=30, model="ridge", alpha=0.5)

# Polynomial (captures curve, degree=3 for S-curves)
fc_poly   = pp.forecast(df, periods=30, model="polynomial", degree=3)

# EMA (exponential moving average, follows recent trend)
fc_ema    = pp.forecast(df, periods=30, model="ema", span=14)

# Auto-select: runs comparison, picks lowest MAE model
fc_auto   = pp.forecast(df, periods=30, model="auto")

print(fc_auto[['Date', 'Predicted_Value', 'Lower_Bound', 'Upper_Bound']].tail())

Model Comparison

comparison = pp.compare_models(df, cv_split=0.8)
print(comparison)
#              model      MAE     RMSE      R2
# 0            ridge   1.832    2.341   0.972
# 1           linear   1.944    2.501   0.969
# 2  polynomial_deg2   2.103    2.788   0.961
# 3              ema   2.891    3.672   0.943

Price Elasticity

from priceprophet import PriceElasticity
import pandas as pd

prices  = pd.Series([10.0, 11.0, 12.0, 11.5, 13.0, 12.5])
demands = pd.Series([100,   90,   80,   88,   70,   83])

pe = PriceElasticity()
result = pe.calculate(prices, demands)
print(result)
# Price Elasticity: -1.247
# Interpretation: Elastic — demand changes more than proportionally to price
# A 10% price increase → 12.5% demand drop
# Revenue Impact: Raising price DECREASES revenue

# Simulate a specific price change
sim = pe.simulate_price_change(
    current_price=12.0,
    current_demand=80,
    price_change_pct=0.10,    # +10%
    elasticity=result.elasticity,
)
print(sim)
# {'new_price': 13.2, 'new_demand': 69.8, 'revenue_change_pct': -2.7, ...}

Seasonality Detection

from priceprophet import SeasonalityDetector
import pandas as pd, numpy as np

df = pd.DataFrame({
    'date':  pd.date_range('2024-01-01', periods=365),
    'price': [100 + 20 * np.sin(2 * np.pi * i / 7) for i in range(365)]
})

sd = SeasonalityDetector()
result = sd.detect(df)
print(result)
# Weekly seasonality  : Yes
# Monthly seasonality : No
# Peak day of week    : Wednesday
# Dominant cycle      : ~7 days

Anomaly Detection

df_with_spike = df.copy()
df_with_spike.loc[45, 'price'] = 999  # inject spike

anomalies = pp.detect_anomalies(df_with_spike, threshold=2.5)
spikes = anomalies[anomalies['is_anomaly']]
print(f"Found {len(spikes)} anomalies")
print(spikes[['date', 'price', 'z_score']])

Market Shock Simulation

for shock_type in ["competitor", "supply", "demand", "regulation"]:
    result = pp.simulate_impact(
        current_price=100.0,
        shock_magnitude=0.20,
        shock_type=shock_type
    )
    print(f"{shock_type:12s}: price {result['new_price']:.1f}  |  "
          f"recovery {result['estimated_recovery_days']} days")
# competitor  : price 86.0  |  recovery 14 days
# supply      : price 76.0  |  recovery 30 days
# demand      : price 82.0  |  recovery 21 days
# regulation  : price 70.0  |  recovery 60 days

Full Analysis Pipeline

from priceprophet import PriceProphet
import pandas as pd, numpy as np

pp = PriceProphet()

# Generate realistic price series
np.random.seed(42)
n = 365
trend   = np.linspace(100, 140, n)
weekly  = 8 * np.sin(2 * np.pi * np.arange(n) / 7)
noise   = np.random.randn(n) * 2
prices  = trend + weekly + noise

df = pd.DataFrame({'date': pd.date_range('2025-01-01', periods=n), 'price': prices})

# 1. Seasonality
season = pp.seasonality(df)
print("Peak day:", season.peak_day)

# 2. Best model forecast
fc = pp.forecast(df, periods=90, model="auto")
print(f"90-day forecast: {fc['Predicted_Value'].mean():.2f} avg")

# 3. Anomalies
anom = pp.detect_anomalies(df, threshold=2.5)
print(f"Anomalies: {anom['is_anomaly'].sum()}")

# 4. Model comparison
print(pp.compare_models(df).to_string(index=False))

License

MIT — Teyfik Öz

Metadata

Release files for priceprophet 1.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for priceprophet 1.1.0
File Size Uploaded
priceprophet-1.1.0.tar.gz 14.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for priceprophet 1.1.0
File Interpreter ABI Platform
priceprophet-1.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 27.2 kB

Release files / priceprophet-1.1.0.tar.gz

Download URL priceprophet-1.1.0.tar.gz
Size 14.3 kB
Tags Source
SHA-256 checksum
How to use checksums
9bee3caf54aec724bac5e50e5790722ae9ffea3c4e2c81f16fbfb3723a51b2c3
BLAKE2b-256 checksum
How to use checksums
d639c9b4680ea4e507ac36fd11b7ce423ae4c9e50a6c7c557f6282e7ec812215
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.4

Release files / priceprophet-1.1.0-py3-none-any.whl

Download URL priceprophet-1.1.0-py3-none-any.whl
Size 12.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f7b988567a6c4f7334f107c2f07dd0f1c923ab609ed654d8f0a56537c9bdf3ec
BLAKE2b-256 checksum
How to use checksums
194239281d8e7e801acbf353b0170d05a07b118f975138376f60808341d6d788
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.4

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page