# dynamic_pricing_bandit_app.py from datasets import load_dataset import pandas as pd import numpy as np import gradio as gr import json PRICE_POINTS = [5000, 7500, 10000, 12500, 15000] SEGMENTS = ["Retail", "HNI", "Corporate"] DEAL_TYPES = ["M&A Advisory", "Debt Issuance", "Equity Offering", "Restructuring"] REGIONS = ["North America", "Europe", "Asia Pacific", "Latin America", "Middle East"] INDUSTRIES = ["Technology", "Healthcare", "Financial Services", "Energy", "Consumer Goods", "Industrial"] class ThompsonBandit: def __init__(self, n_arms): self.successes = np.ones(n_arms) self.failures = np.ones(n_arms) def select_arm(self): return np.argmax(np.random.beta(self.successes, self.failures)) def update(self, arm, reward): if reward: self.successes[arm] += 1 else: self.failures[arm] += 1 # Load HF dataset dataset = load_dataset("banking77", split="train[:500]") df = pd.DataFrame(dataset) df["segment"] = np.random.choice(SEGMENTS, len(df)) df["deal_type"] = np.random.choice(DEAL_TYPES, len(df)) df["deal_size"] = np.random.lognormal(mean=16, sigma=1.0, size=len(df)).astype(int) df["region"] = np.random.choice(REGIONS, len(df)) df["industry"] = np.random.choice(INDUSTRIES, len(df)) bandit = ThompsonBandit(len(PRICE_POINTS)) def recommend_price(segment, deal_type, deal_size_str, region, industry): try: deal_size = float(deal_size_str.replace("$", "").replace(",", "")) arm = bandit.select_arm() price = PRICE_POINTS[arm] acceptance_prob = max(0.1, 1 - (price / PRICE_POINTS[-1]) * 0.8) accepted = np.random.binomial(1, acceptance_prob) bandit.update(arm, accepted) return f"Recommended Price: ${price:,}\nClient would {'accept' if accepted else 'decline'} this price." except Exception as e: return str(e) with gr.Blocks() as app: gr.Markdown("# Dynamic Pricing Bandit App") with gr.Row(): with gr.Column(): segment_input = gr.Dropdown(choices=SEGMENTS, label="Client Segment") deal_type_input = gr.Dropdown(choices=DEAL_TYPES, label="Deal Type") deal_size_input = gr.Textbox(label="Deal Size (USD)", value="$50000000") region_input = gr.Dropdown(choices=REGIONS, label="Region") industry_input = gr.Dropdown(choices=INDUSTRIES, label="Industry") btn = gr.Button("Get Recommendation") with gr.Column(): result = gr.Markdown() btn.click(fn=recommend_price, inputs=[segment_input, deal_type_input, deal_size_input, region_input, industry_input], outputs=result) if __name__ == "__main__": app.launch()