|
|
from typing import Dict, Any |
|
|
import pandas as pd |
|
|
import numpy as np |
|
|
from .base_predictor import BasePredictor |
|
|
|
|
|
class FintechPredictor(BasePredictor): |
|
|
""" |
|
|
Predicts: |
|
|
1. Days until next funding |
|
|
2. Funding amount |
|
|
3. Round series |
|
|
""" |
|
|
def _preprocess(self, data: Dict) -> pd.DataFrame: |
|
|
|
|
|
features = { |
|
|
'download_velocity_30d': data.get('download_velocity', 0), |
|
|
'hiring_spike': 1 if data.get('hiring_spike') == 'Active' else 0, |
|
|
'review_sentiment': data.get('review_sentiment', 0), |
|
|
|
|
|
'competitor_funding_gap': np.random.randint(0, 180), |
|
|
'burn_rate_proxy': np.random.uniform(0.5, 5.0) |
|
|
} |
|
|
return pd.DataFrame([features]) |
|
|
|
|
|
def _run_inference(self, features: pd.DataFrame) -> Dict[str, Any]: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hiring_strength = features['hiring_spike'].iloc[0] |
|
|
downloads = features['download_velocity_30d'].iloc[0] |
|
|
|
|
|
days_to_funding = max(14, 120 - (downloads * 0.5) - (hiring_strength * 30)) |
|
|
funding_amount = (downloads * 10000) + (hiring_strength * 5000000) |
|
|
|
|
|
return { |
|
|
'days_to_funding': int(days_to_funding), |
|
|
'funding_amount': round(funding_amount, -5), |
|
|
'round_series': 'Series B' if funding_amount > 20000000 else 'Series A' |
|
|
} |
|
|
|
|
|
class AiTalentPredictor(BasePredictor): |
|
|
""" |
|
|
Predicts: |
|
|
1. Next model release date |
|
|
2. Performance leap magnitude |
|
|
3. Commercialization timeline |
|
|
""" |
|
|
def _preprocess(self, data: Dict) -> pd.DataFrame: |
|
|
features = { |
|
|
'github_stars_7d': data.get('github_stars_7d', 0), |
|
|
'arxiv_papers': data.get('arxiv_papers', 0), |
|
|
'talent_score': data.get('talent_score', 0) |
|
|
} |
|
|
return pd.DataFrame([features]) |
|
|
|
|
|
def _run_inference(self, features: pd.DataFrame) -> Dict[str, Any]: |
|
|
stars = features['github_stars_7d'].iloc[0] |
|
|
papers = features['arxiv_papers'].iloc[0] |
|
|
|
|
|
days_to_release = max(30, 180 - (stars * 0.1) - (papers * 2)) |
|
|
perf_leap = min(50, (stars * 0.05) + (papers * 1.5)) |
|
|
|
|
|
return { |
|
|
'next_release_days': int(days_to_release), |
|
|
'performance_leap_pct': round(perf_leap, 1), |
|
|
'commercialization_months': int(days_to_release / 30) + 2 |
|
|
} |
|
|
|
|
|
class EsgPredictor(BasePredictor): |
|
|
""" |
|
|
Predicts: |
|
|
1. Greenwashing exposure score |
|
|
2. Correction timing |
|
|
3. Fine probability |
|
|
""" |
|
|
def _preprocess(self, data: Dict) -> pd.DataFrame: |
|
|
features = { |
|
|
'esg_claims': data.get('esg_claims', 0), |
|
|
'verifiable_actions': data.get('verifiable_actions', 0), |
|
|
'greenwashing_index': data.get('greenwashing_index', 0) |
|
|
} |
|
|
return pd.DataFrame([features]) |
|
|
|
|
|
def _run_inference(self, features: pd.DataFrame) -> Dict[str, Any]: |
|
|
claims = features['esg_claims'].iloc[0] |
|
|
verified = features['verifiable_actions'].iloc[0] |
|
|
|
|
|
gap = max(0, claims - verified) |
|
|
risk_score = min(100, gap * 5) |
|
|
|
|
|
return { |
|
|
'greenwashing_score': int(risk_score), |
|
|
'correction_days': int(max(7, 90 - risk_score)), |
|
|
'fine_probability': 'High' if risk_score > 60 else 'Low' |
|
|
} |
|
|
|
|
|
class RegulatoryPredictor(BasePredictor): |
|
|
def _preprocess(self, data: Dict) -> pd.DataFrame: |
|
|
return pd.DataFrame([data]) |
|
|
|
|
|
def _run_inference(self, features: pd.DataFrame) -> Dict[str, Any]: |
|
|
return { |
|
|
'enforcement_probability': 0.75, |
|
|
'estimated_fine': 5000000, |
|
|
'action_timeline_days': 45 |
|
|
} |
|
|
|
|
|
class SupplyChainPredictor(BasePredictor): |
|
|
def _preprocess(self, data: Dict) -> pd.DataFrame: |
|
|
return pd.DataFrame([data]) |
|
|
|
|
|
def _run_inference(self, features: pd.DataFrame) -> Dict[str, Any]: |
|
|
return { |
|
|
'disruption_risk_score': 65, |
|
|
'recovery_time_days': 14, |
|
|
'impact_revenue_pct': 3.5 |
|
|
} |
|
|
|