import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 1. Генерируем синтетические данные
# Сначала тренд вверх (60% рост), потом резкий разворот вниз (30% рост)
np.random.seed(42)
data_up = np.random.choice([1, 0], size=100, p=[0.6, 0.4])
data_down = np.random.choice([1, 0], size=100, p=[0.3, 0.7])
data = np.concatenate([data_up, data_down])

# 2. Параметры модели
gamma = 0.94  # Коэффициент затухания гамма (Чем меньше γ, тем быстрее модель забывает прошлое)
a_curr, b_curr = 1, 1 # Начальные параметры: Beta(1,1) — равномерный априор

history = []

# 3. Цикл динамического байесовского обновления с экспоненциальным затуханием
for y in data:
    #  добавляем 1 чтобы всегда сохранять хотя бы минимальный априор Beta(1,1)
    a_curr = (a_curr - 1) * gamma + 1
    b_curr = (b_curr - 1) * gamma + 1
    
    # Обновление с новым наблюдением
    if y == 1:
        a_curr += 1
    else:
        b_curr += 1
        
    # Вычисляем текущее апостериорное среднее (ожидаемая вероятность успеха)    
    mean = a_curr / (a_curr + b_curr)
    history.append(mean)

# 4. Визуализация
plt.figure(figsize=(12, 5), dpi=100)
plt.plot(history, color='#3498db', lw=2, label=f'Adaptive Bayesian (gamma={gamma})')
plt.axhline(0.5, color='black', linestyle='--', alpha=0.3)
plt.axvline(100, color='red', linestyle=':', label='Change point')

# 5. Сравнение с обычным (неадаптивным) байесовским обновлением (gamma=1)
a_std, b_std = 1, 1  # Начинаем тоже с равномерного априора Beta(1,1)
std_history = []
for y in data:
    # Стандартное байесовское обновление — просто добавляем каждое новое наблюдение
    if y == 1: a_std += 1
    else: b_std += 1
    mean_std = a_std / (a_std + b_std) # Апостериорное среднее
    std_history.append(mean_std)

plt.plot(std_history, color='gray', alpha=0.5, label='Standard Bayesian (gamma=1.0)')

plt.title('Adaptive Bayesian Update vs Standard', fontsize=12)
plt.legend()
plt.grid(alpha=0.2)
plt.show()