Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pandas as pd | |
| import numpy as np | |
| from datetime import datetime | |
| import plotly.graph_objects as go | |
| import re | |
| from urllib.parse import urlparse | |
| class StartupValuationCalculator: | |
| def __init__(self): | |
| # μ μ’ λ³ λ²€μΉλ§ν¬ λ©ν°ν (EV/ARR) | |
| self.industry_multiples = { | |
| "SaaS - B2B": {"low": 3, "mid": 6, "high": 10}, | |
| "SaaS - B2C": {"low": 2, "mid": 4, "high": 7}, | |
| "λ§μΌνλ μ΄μ€": {"low": 2, "mid": 5, "high": 8}, | |
| "μ΄μ»€λ¨Έμ€": {"low": 1, "mid": 2.5, "high": 4}, | |
| "νν ν¬": {"low": 3, "mid": 5, "high": 8}, | |
| "ν¬μ€μΌμ΄": {"low": 4, "mid": 7, "high": 12}, | |
| "AI/λ₯ν ν¬": {"low": 5, "mid": 8, "high": 15}, | |
| "κΈ°ν": {"low": 2, "mid": 4, "high": 6} | |
| } | |
| # μ±μ₯λ₯ μ‘°μ κ³μ | |
| self.growth_adjustments = { | |
| "0-20%": 0.7, | |
| "20-50%": 0.9, | |
| "50-100%": 1.1, | |
| "100-200%": 1.3, | |
| "200%+": 1.5 | |
| } | |
| # λ¨μκ²½μ μ μ κ°μ€μΉ | |
| self.unit_economics_weights = { | |
| "ltv_cac_ratio": 0.3, | |
| "gross_margin": 0.3, | |
| "retention": 0.2, | |
| "payback": 0.2 | |
| } | |
| # IP μμ° κ°μΉ κ°μ€μΉ | |
| self.ip_asset_weights = { | |
| "patents": 0.25, | |
| "papers": 0.15, | |
| "domains": 0.15, | |
| "trademarks": 0.10, | |
| "github": 0.10, | |
| "awards": 0.10, | |
| "team": 0.15 | |
| } | |
| def calculate_arr(self, monthly_revenue, revenue_type): | |
| """μ λ§€μΆμ μ°κ° λ°λ³΅ λ§€μΆ(ARR)λ‘ λ³ν""" | |
| if revenue_type == "ꡬλ ν (SaaS)": | |
| return monthly_revenue * 12 | |
| elif revenue_type == "κ±°λμμλ£ν": | |
| return monthly_revenue * 12 * 0.8 | |
| else: | |
| return monthly_revenue * 12 * 0.6 | |
| def calculate_ltv(self, arpu, gross_margin, monthly_churn): | |
| """LTV κ³μ°""" | |
| if monthly_churn == 0: | |
| monthly_churn = 0.01 | |
| return arpu * (gross_margin / 100) / monthly_churn | |
| def calculate_cac(self, monthly_marketing, monthly_sales, new_customers): | |
| """CAC κ³μ°""" | |
| if new_customers == 0: | |
| return 0 | |
| return (monthly_marketing + monthly_sales) / new_customers | |
| def calculate_payback(self, cac, arpu, gross_margin): | |
| """Payback Period κ³μ° (κ°μ)""" | |
| if arpu * (gross_margin / 100) == 0: | |
| return 999 | |
| return cac / (arpu * (gross_margin / 100)) | |
| def get_unit_economics_score(self, ltv_cac_ratio, gross_margin, retention_rate, payback_months): | |
| """λ¨μκ²½μ μ μ κ³μ° (0-100)""" | |
| scores = { | |
| "ltv_cac_ratio": min(100, (ltv_cac_ratio / 3) * 100) if ltv_cac_ratio > 0 else 0, | |
| "gross_margin": min(100, gross_margin * 1.25), | |
| "retention": retention_rate, | |
| "payback": max(0, 100 - (payback_months / 24) * 100) if payback_months < 999 else 0 | |
| } | |
| total_score = sum(scores[key] * self.unit_economics_weights[key] for key in scores) | |
| return total_score | |
| def evaluate_domain(self, domains): | |
| """λλ©μΈ κ°μΉ νκ°""" | |
| if not domains: | |
| return 0 | |
| domain_list = [d.strip() for d in domains.split(',') if d.strip()] | |
| score = 0 | |
| for domain in domain_list: | |
| parsed = urlparse(domain if domain.startswith('http') else f'http://{domain}') | |
| domain_name = parsed.netloc or parsed.path | |
| # .com λλ©μΈ κ°μ°μ | |
| if domain_name.endswith('.com'): | |
| score += 30 | |
| elif domain_name.endswith(('.io', '.ai', '.tech')): | |
| score += 20 | |
| else: | |
| score += 10 | |
| # μ§§μ λλ©μΈ κ°μ°μ | |
| name_length = len(domain_name.split('.')[0]) | |
| if name_length <= 5: | |
| score += 20 | |
| elif name_length <= 8: | |
| score += 10 | |
| return min(100, score / len(domain_list)) | |
| def evaluate_patents(self, patent_filed, patent_granted): | |
| """νΉν κ°μΉ νκ°""" | |
| score = 0 | |
| score += patent_filed * 15 # μΆμ νΉνλΉ 15μ | |
| score += patent_granted * 30 # λ±λ‘ νΉνλΉ 30μ | |
| return min(100, score) | |
| def evaluate_papers(self, papers): | |
| """λ Όλ¬Έ κ°μΉ νκ°""" | |
| if not papers: | |
| return 0 | |
| paper_count = len([p.strip() for p in papers.split('\n') if p.strip()]) | |
| score = paper_count * 20 # λ Όλ¬ΈλΉ 20μ | |
| # μ£Όμ νν/μ λ ν€μλ μ²΄ν¬ | |
| prestigious_keywords = ['Nature', 'Science', 'IEEE', 'ACM', 'CVPR', 'NeurIPS', 'ICML'] | |
| for keyword in prestigious_keywords: | |
| if keyword.lower() in papers.lower(): | |
| score += 10 | |
| return min(100, score) | |
| def evaluate_github(self, github_url, github_stars): | |
| """GitHub μ μ₯μ νκ°""" | |
| if not github_url: | |
| return 0 | |
| score = 0 | |
| if github_stars >= 1000: | |
| score = 80 | |
| elif github_stars >= 500: | |
| score = 60 | |
| elif github_stars >= 100: | |
| score = 40 | |
| elif github_stars >= 50: | |
| score = 20 | |
| else: | |
| score = 10 | |
| return score | |
| def evaluate_team(self, team_size, phd_count, serial_entrepreneurs, big_tech_experience): | |
| """ν μλ νκ°""" | |
| score = 0 | |
| # ν κ·λͺ¨ | |
| if team_size >= 20: | |
| score += 20 | |
| elif team_size >= 10: | |
| score += 15 | |
| elif team_size >= 5: | |
| score += 10 | |
| # λ°μ¬ νμ | |
| score += min(30, phd_count * 10) | |
| # μ°μμ°½μ κ° | |
| score += min(30, serial_entrepreneurs * 15) | |
| # λΉ ν ν¬ κ²½ν | |
| score += min(20, big_tech_experience * 5) | |
| return min(100, score) | |
| def calculate_ip_score(self, ip_data): | |
| """μ§μ μ¬μ° μ’ ν© μ μ κ³μ°""" | |
| scores = { | |
| "patents": self.evaluate_patents(ip_data["patent_filed"], ip_data["patent_granted"]), | |
| "papers": self.evaluate_papers(ip_data["papers"]), | |
| "domains": self.evaluate_domain(ip_data["domains"]), | |
| "trademarks": min(100, ip_data["trademarks"] * 20), | |
| "github": self.evaluate_github(ip_data["github_url"], ip_data["github_stars"]), | |
| "awards": min(100, ip_data["awards"] * 25), | |
| "team": self.evaluate_team( | |
| ip_data["team_size"], ip_data["phd_count"], | |
| ip_data["serial_entrepreneurs"], ip_data["big_tech_experience"] | |
| ) | |
| } | |
| total_score = sum(scores[key] * self.ip_asset_weights[key] for key in scores) | |
| return total_score, scores | |
| def get_growth_category(self, growth_rate): | |
| """μ±μ₯λ₯ μΉ΄ν κ³ λ¦¬ κ²°μ """ | |
| if growth_rate < 20: | |
| return "0-20%" | |
| elif growth_rate < 50: | |
| return "20-50%" | |
| elif growth_rate < 100: | |
| return "50-100%" | |
| elif growth_rate < 200: | |
| return "100-200%" | |
| else: | |
| return "200%+" | |
| def calculate_valuation(self, data, ip_data): | |
| """μ’ ν© κ°μΉνκ° κ³μ°""" | |
| # ARR κ³μ° | |
| arr = self.calculate_arr(data["monthly_revenue"], data["revenue_type"]) | |
| # λ¨μκ²½μ κ³μ° | |
| ltv = self.calculate_ltv(data["arpu"], data["gross_margin"], data["monthly_churn"]) | |
| cac = self.calculate_cac(data["monthly_marketing"], data["monthly_sales"], data["new_customers"]) | |
| ltv_cac_ratio = ltv / cac if cac > 0 else 0 | |
| payback = self.calculate_payback(cac, data["arpu"], data["gross_margin"]) | |
| # λ¨μκ²½μ μ μ | |
| ue_score = self.get_unit_economics_score( | |
| ltv_cac_ratio, data["gross_margin"], data["retention_rate"], payback | |
| ) | |
| # IP μμ° μ μ | |
| ip_score, ip_breakdown = self.calculate_ip_score(ip_data) | |
| # μ’ ν© μ μ (λ¨μκ²½μ 60%, IP 40%) | |
| combined_score = ue_score * 0.6 + ip_score * 0.4 | |
| # κΈ°λ³Έ λ©ν°ν μ ν | |
| multiples = self.industry_multiples[data["industry"]] | |
| if combined_score >= 80: | |
| base_multiple = multiples["high"] | |
| elif combined_score >= 50: | |
| base_multiple = multiples["mid"] | |
| else: | |
| base_multiple = multiples["low"] | |
| # μ±μ₯λ₯ μ‘°μ | |
| growth_adj = self.growth_adjustments[self.get_growth_category(data["growth_rate"])] | |
| adjusted_multiple = base_multiple * growth_adj | |
| # μ€ν μ΄μ§ μ‘°μ | |
| stage_adj = { | |
| "MVP/λ² ν": 0.7, | |
| "μ΄κΈ° λ§€μΆ": 0.85, | |
| "μ±μ₯ λ¨κ³": 1.0, | |
| "μμ΅μ± ν보": 1.2 | |
| } | |
| # IP μμ° ν리미μ (μ΅λ 20%) | |
| ip_premium = 1 + (ip_score / 100 * 0.2) | |
| final_multiple = adjusted_multiple * stage_adj[data["stage"]] * ip_premium | |
| # μ΅μ’ κ°μΉνκ° | |
| valuation = arr * final_multiple | |
| # λ°μ¨μ΄ κ³μ° | |
| runway = data["cash_balance"] / data["burn_rate"] if data["burn_rate"] > 0 else 999 | |
| return { | |
| "valuation": valuation, | |
| "arr": arr, | |
| "multiple": final_multiple, | |
| "ltv": ltv, | |
| "cac": cac, | |
| "ltv_cac_ratio": ltv_cac_ratio, | |
| "payback": payback, | |
| "ue_score": ue_score, | |
| "ip_score": ip_score, | |
| "ip_breakdown": ip_breakdown, | |
| "combined_score": combined_score, | |
| "runway": runway | |
| } | |
| def create_comparison_chart(self, valuation, industry, arr): | |
| """λμ’ μ κ³ λΉκ΅ μ°¨νΈ μμ±""" | |
| multiples = self.industry_multiples[industry] | |
| fig = go.Figure() | |
| # μ κ³ λ²μ | |
| low_val = arr * multiples["low"] | |
| mid_val = arr * multiples["mid"] | |
| high_val = arr * multiples["high"] | |
| # λ§λ κ·Έλν | |
| fig.add_trace(go.Bar( | |
| x=["νμ 25%", "μ€κ°κ°", "μμ 25%", "νμ¬ κΈ°μ "], | |
| y=[low_val, mid_val, high_val, valuation], | |
| text=[f"${low_val/1000000:.1f}M", f"${mid_val/1000000:.1f}M", | |
| f"${high_val/1000000:.1f}M", f"${valuation/1000000:.1f}M"], | |
| textposition="outside", | |
| marker_color=["lightgray", "gray", "darkgray", "blue"] | |
| )) | |
| fig.update_layout( | |
| title=f"{industry} μ κ³ κ°μΉνκ° λΉκ΅", | |
| yaxis_title="κΈ°μ κ°μΉ (USD)", | |
| showlegend=False, | |
| height=400 | |
| ) | |
| return fig | |
| def create_ip_breakdown_chart(self, ip_breakdown): | |
| """IP μμ° λΆμ μ°¨νΈ""" | |
| categories = list(ip_breakdown.keys()) | |
| values = list(ip_breakdown.values()) | |
| fig = go.Figure(data=[ | |
| go.Radar( | |
| r=values, | |
| theta=categories, | |
| fill='toself', | |
| name='IP μμ° μ μ' | |
| ) | |
| ]) | |
| fig.update_layout( | |
| polar=dict( | |
| radialaxis=dict( | |
| visible=True, | |
| range=[0, 100] | |
| ) | |
| ), | |
| showlegend=False, | |
| title="μ§μ μ¬μ° μμ° λΆμ" | |
| ) | |
| return fig | |
| def create_ui(): | |
| calculator = StartupValuationCalculator() | |
| def process_valuation( | |
| company_name, founded_year, industry, stage, revenue_type, | |
| monthly_revenue, growth_rate, arpu, gross_margin, monthly_churn, | |
| retention_rate, new_customers, monthly_marketing, monthly_sales, | |
| cash_balance, burn_rate, | |
| # IP κ΄λ ¨ μ λ ₯ | |
| domains, patent_filed, patent_granted, papers, trademarks, | |
| github_url, github_stars, awards, partnerships, | |
| team_size, phd_count, serial_entrepreneurs, big_tech_experience, | |
| media_coverage, app_downloads, social_followers | |
| ): | |
| # μ λ ₯κ° κ²μ¦ | |
| if monthly_revenue <= 0: | |
| return "μ λ§€μΆμ μ λ ₯ν΄μ£ΌμΈμ.", None, None, None | |
| # λ°μ΄ν° μ€λΉ | |
| data = { | |
| "company_name": company_name, | |
| "founded_year": founded_year, | |
| "industry": industry, | |
| "stage": stage, | |
| "revenue_type": revenue_type, | |
| "monthly_revenue": monthly_revenue * 1000, | |
| "growth_rate": growth_rate, | |
| "arpu": arpu, | |
| "gross_margin": gross_margin, | |
| "monthly_churn": monthly_churn / 100, | |
| "retention_rate": retention_rate, | |
| "new_customers": new_customers, | |
| "monthly_marketing": monthly_marketing * 1000, | |
| "monthly_sales": monthly_sales * 1000, | |
| "cash_balance": cash_balance * 1000, | |
| "burn_rate": burn_rate * 1000 | |
| } | |
| ip_data = { | |
| "domains": domains, | |
| "patent_filed": patent_filed, | |
| "patent_granted": patent_granted, | |
| "papers": papers, | |
| "trademarks": trademarks, | |
| "github_url": github_url, | |
| "github_stars": github_stars, | |
| "awards": awards, | |
| "partnerships": partnerships, | |
| "team_size": team_size, | |
| "phd_count": phd_count, | |
| "serial_entrepreneurs": serial_entrepreneurs, | |
| "big_tech_experience": big_tech_experience, | |
| "media_coverage": media_coverage, | |
| "app_downloads": app_downloads, | |
| "social_followers": social_followers | |
| } | |
| # κ°μΉνκ° κ³μ° | |
| results = calculator.calculate_valuation(data, ip_data) | |
| # κ²°κ³Ό ν¬λ§·ν | |
| valuation_text = f""" | |
| # π {company_name} κ°μΉνκ° κ²°κ³Ό | |
| ## π μ£Όμ μ§ν | |
| - **κΈ°μ κ°μΉ**: ${results['valuation']/1000000:.1f}M (β©{results['valuation']/1000000*1300:.0f}μ΅) | |
| - **ARR**: ${results['arr']/1000000:.1f}M | |
| - **μ μ© λ©ν°ν**: {results['multiple']:.1f}x | |
| ## π° λ¨μκ²½μ | |
| - **LTV**: ${results['ltv']:.0f} | |
| - **CAC**: ${results['cac']:.0f} | |
| - **LTV/CAC**: {results['ltv_cac_ratio']:.1f}x | |
| - **Payback Period**: {results['payback']:.1f}κ°μ | |
| - **λ¨μκ²½μ μ μ**: {results['ue_score']:.0f}/100 | |
| ## π― μ§μ μ¬μ° λ° λ¬΄νμμ° | |
| - **IP μμ° μ μ**: {results['ip_score']:.0f}/100 | |
| - **μ’ ν© μ μ**: {results['combined_score']:.0f}/100 | |
| ### IP μμ° μΈλΆ νκ°: | |
| - νΉν: {results['ip_breakdown']['patents']:.0f}/100 | |
| - λ Όλ¬Έ: {results['ip_breakdown']['papers']:.0f}/100 | |
| - λλ©μΈ: {results['ip_breakdown']['domains']:.0f}/100 | |
| - μνκΆ: {results['ip_breakdown']['trademarks']:.0f}/100 | |
| - μ€νμμ€: {results['ip_breakdown']['github']:.0f}/100 | |
| - μμμ€μ : {results['ip_breakdown']['awards']:.0f}/100 | |
| - ν μλ: {results['ip_breakdown']['team']:.0f}/100 | |
| ## π μ¬λ¬΄ 건μ μ± | |
| - **νκΈ λ°μ¨μ΄**: {results['runway']:.1f}κ°μ | |
| - **μκ° λ²λ μ΄νΈ**: ${burn_rate}K | |
| ## π‘ νκ° μΈμ¬μ΄νΈ | |
| """ | |
| # μΈμ¬μ΄νΈ μΆκ° | |
| if results['ltv_cac_ratio'] < 1: | |
| valuation_text += "- β οΈ LTV/CAC λΉμ¨μ΄ 1 λ―Έλ§μ λλ€. λ§μΌν ν¨μ¨μ± κ°μ μ΄ νμν©λλ€.\n" | |
| elif results['ltv_cac_ratio'] > 3: | |
| valuation_text += "- β μ°μν LTV/CAC λΉμ¨μ 보μ΄κ³ μμ΅λλ€.\n" | |
| if results['runway'] < 12: | |
| valuation_text += "- β οΈ λ°μ¨μ΄κ° 12κ°μ λ―Έλ§μ λλ€. μΆκ° μκΈμ‘°λ¬μ κ³ λ €νμΈμ.\n" | |
| if gross_margin < 60: | |
| valuation_text += "- π λ§€μΆμ΄μ΄μ΅λ₯ κ°μ μ¬μ§κ° μμ΅λλ€. (μ κ³ νκ· : 70-80%)\n" | |
| if results['ip_score'] > 70: | |
| valuation_text += "- π κ°λ ₯ν IP ν¬νΈν΄λ¦¬μ€λ₯Ό 보μ νκ³ μμ΄ κ°μΉνκ°μ ν리미μμ΄ μ μ©λμμ΅λλ€.\n" | |
| # λΉκ΅ μ°¨νΈ μμ± | |
| comparison_chart = calculator.create_comparison_chart( | |
| results['valuation'], industry, results['arr'] | |
| ) | |
| # IP λΆμ μ°¨νΈ | |
| ip_chart = calculator.create_ip_breakdown_chart(results['ip_breakdown']) | |
| # μμΈ λΆμ ν μ΄λΈ | |
| metrics_df = pd.DataFrame({ | |
| "μ§ν": ["μ λ§€μΆ", "μ° μ±μ₯λ₯ ", "λ§€μΆμ΄μ΄μ΅λ₯ ", "μ μ΄νλ₯ ", "κ³ κ° μ μ§μ¨", "IP μμ° μ μ"], | |
| "νμ¬ κ°": [f"${monthly_revenue}K", f"{growth_rate}%", f"{gross_margin}%", | |
| f"{monthly_churn}%", f"{retention_rate}%", f"{results['ip_score']:.0f}/100"], | |
| "μ κ³ νκ· ": ["N/A", "50-100%", "70-80%", "2-5%", "80-90%", "50/100"] | |
| }) | |
| return valuation_text, comparison_chart, ip_chart, metrics_df | |
| # Gradio UI | |
| with gr.Blocks(title="μ€ννΈμ κ°μΉνκ° κ³μ°κΈ°", theme=gr.themes.Soft()) as demo: | |
| gr.Markdown(""" | |
| # π¦ μ€ννΈμ κ°μΉνκ° μλν μμ€ν v2.0 | |
| κ°λ¨ν μ 보 μ λ ₯λ§μΌλ‘ κ·μ¬μ μμ κΈ°μ κ°μΉλ₯Ό μ°μΆνκ³ λμ’ μ κ³μ λΉκ΅ν΄λ립λλ€. | |
| μ΄μ μ§μ μ¬μ°κ³Ό 무νμμ°κΉμ§ μ’ ν©μ μΌλ‘ νκ°ν©λλ€. | |
| """) | |
| with gr.Tab("κΈ°λ³Έ μ 보"): | |
| with gr.Row(): | |
| company_name = gr.Textbox(label="νμ¬λͺ ", value="μ°λ¦¬ μ€ννΈμ ") | |
| founded_year = gr.Slider(2015, 2024, value=2022, step=1, label="μ€λ¦½μ°λ") | |
| with gr.Row(): | |
| industry = gr.Dropdown( | |
| choices=list(calculator.industry_multiples.keys()), | |
| value="SaaS - B2B", | |
| label="μ°μ λΆλ₯" | |
| ) | |
| stage = gr.Radio( | |
| choices=["MVP/λ² ν", "μ΄κΈ° λ§€μΆ", "μ±μ₯ λ¨κ³", "μμ΅μ± ν보"], | |
| value="μ΄κΈ° λ§€μΆ", | |
| label="μ¬μ λ¨κ³" | |
| ) | |
| revenue_type = gr.Radio( | |
| choices=["ꡬλ ν (SaaS)", "κ±°λμμλ£ν", "μΌνμ± νλ§€"], | |
| value="ꡬλ ν (SaaS)", | |
| label="μμ΅ λͺ¨λΈ" | |
| ) | |
| with gr.Tab("λ§€μΆ λ° μ±μ₯"): | |
| gr.Markdown("### π° λ§€μΆ μ 보 (λ¨μ: μ² λ¬λ¬)") | |
| with gr.Row(): | |
| monthly_revenue = gr.Number(label="μ λ§€μΆ ($K)", value=50) | |
| growth_rate = gr.Slider(0, 300, value=100, step=10, | |
| label="μ°κ° μ±μ₯λ₯ (%)") | |
| with gr.Row(): | |
| arpu = gr.Number(label="κ³ κ°λΉ νκ· λ§€μΆ (ARPU) ($)", value=100) | |
| gross_margin = gr.Slider(0, 100, value=70, step=5, | |
| label="λ§€μΆμ΄μ΄μ΅λ₯ (%)") | |
| with gr.Tab("κ³ κ° λ° λ§μΌν "): | |
| gr.Markdown("### π₯ κ³ κ° μ§ν") | |
| with gr.Row(): | |
| retention_rate = gr.Slider(0, 100, value=85, step=5, | |
| label="μκ° κ³ κ° μ μ§μ¨ (%)") | |
| monthly_churn = gr.Slider(0, 20, value=3, step=0.5, | |
| label="μ μ΄νλ₯ (%)") | |
| gr.Markdown("### π’ λ§μΌν ν¨μ¨μ±") | |
| with gr.Row(): | |
| new_customers = gr.Number(label="μ μ κ· κ³ κ° μ", value=50) | |
| monthly_marketing = gr.Number(label="μ λ§μΌν λΉμ© ($K)", value=20) | |
| monthly_sales = gr.Number(label="μ μμ λΉμ© ($K)", value=15) | |
| with gr.Tab("μ§μ μ¬μ° λ° κΈ°μ "): | |
| gr.Markdown("### π νΉν λ° λ Όλ¬Έ") | |
| with gr.Row(): | |
| patent_filed = gr.Number(label="μΆμ νΉν μ", value=2) | |
| patent_granted = gr.Number(label="λ±λ‘ νΉν μ", value=1) | |
| trademarks = gr.Number(label="μνκΆ μ", value=1) | |
| papers = gr.Textbox( | |
| label="λ°ν λ Όλ¬Έ (ν μ€μ νλμ©, URL ν¬ν¨ κ°λ₯)", | |
| lines=3, | |
| placeholder="μ: https://arxiv.org/abs/2301.12345 - AI Model Optimization\nICML 2023 - Novel Approach to Machine Learning" | |
| ) | |
| gr.Markdown("### π λμ§νΈ μμ°") | |
| domains = gr.Textbox( | |
| label="보μ λλ©μΈ (μΌνλ‘ κ΅¬λΆ)", | |
| placeholder="μ: mycompany.com, mycompany.ai, myproduct.io" | |
| ) | |
| with gr.Row(): | |
| github_url = gr.Textbox( | |
| label="GitHub μ μ₯μ URL", | |
| placeholder="https://github.com/yourcompany/yourrepo" | |
| ) | |
| github_stars = gr.Number(label="GitHub μ€ν μ", value=100) | |
| gr.Markdown("### π μΈμ¦ λ° μμ") | |
| with gr.Row(): | |
| awards = gr.Number(label="μ£Όμ μμ μ€μ μ", value=1) | |
| partnerships = gr.Number(label="μ λ΅μ ννΈλμ μ", value=2) | |
| with gr.Tab("ν λ° λΈλλ"): | |
| gr.Markdown("### π₯ ν ꡬμ±") | |
| with gr.Row(): | |
| team_size = gr.Number(label="μ 체 ν κ·λͺ¨", value=10) | |
| phd_count = gr.Number(label="λ°μ¬ νμ 보μ μ μ", value=1) | |
| with gr.Row(): | |
| serial_entrepreneurs = gr.Number(label="μ°μμ°½μ κ° μ", value=1) | |
| big_tech_experience = gr.Number(label="λΉ ν ν¬ μΆμ μΈμ", value=2) | |
| gr.Markdown("### π± λΈλλ λ° μ¬μ©μ κΈ°λ°") | |
| with gr.Row(): | |
| media_coverage = gr.Number(label="μ£Όμ μΈλ‘ 보λ μ", value=5) | |
| app_downloads = gr.Number(label="μ± λ€μ΄λ‘λ μ (λ§)", value=10) | |
| social_followers = gr.Number(label="μμ λ―Έλμ΄ νλ‘μ (μ²)", value=50) | |
| with gr.Tab("μ¬λ¬΄ νν©"): | |
| gr.Markdown("### πΈ νκΈ μν© (λ¨μ: μ² λ¬λ¬)") | |
| with gr.Row(): | |
| cash_balance = gr.Number(label="νκΈ μκ³ ($K)", value=1000) | |
| burn_rate = gr.Number(label="μ λ²λ μ΄νΈ ($K)", value=80) | |
| # νκ° μ€ν λ²νΌ | |
| evaluate_btn = gr.Button("π κ°μΉνκ° μ€ν", variant="primary", size="lg") | |
| # κ²°κ³Ό μΆλ ₯ | |
| with gr.Row(): | |
| with gr.Column(scale=2): | |
| valuation_output = gr.Markdown(label="νκ° κ²°κ³Ό") | |
| with gr.Column(scale=1): | |
| metrics_table = gr.DataFrame(label="μ£Όμ μ§ν λΉκ΅") | |
| with gr.Row(): | |
| comparison_chart = gr.Plot(label="λμ’ μ κ³ λΉκ΅") | |
| ip_chart = gr.Plot(label="IP μμ° λΆμ") | |
| # μ΄λ²€νΈ μ°κ²° | |
| evaluate_btn.click( | |
| process_valuation, | |
| inputs=[ | |
| company_name, founded_year, industry, stage, revenue_type, | |
| monthly_revenue, growth_rate, arpu, gross_margin, monthly_churn, | |
| retention_rate, new_customers, monthly_marketing, monthly_sales, | |
| cash_balance, burn_rate, | |
| domains, patent_filed, patent_granted, papers, trademarks, | |
| github_url, github_stars, awards, partnerships, | |
| team_size, phd_count, serial_entrepreneurs, big_tech_experience, | |
| media_coverage, app_downloads, social_followers | |
| ], | |
| outputs=[valuation_output, comparison_chart, ip_chart, metrics_table] | |
| ) | |
| # μμ λ°μ΄ν° λ²νΌλ€ | |
| gr.Markdown("### π μμ λ°μ΄ν°λ‘ ν μ€νΈνκΈ°") | |
| with gr.Row(): | |
| gr.Button("AI μ€ννΈμ μμ").click( | |
| lambda: [ | |
| "AI Tech Corp", 2021, "AI/λ₯ν ν¬", "μ±μ₯ λ¨κ³", "ꡬλ ν (SaaS)", | |
| 100, 150, 200, 75, 2, | |
| 90, 40, 30, 20, | |
| 2000, 120, | |
| "aitech.com, aitech.ai", 5, 2, | |
| "NeurIPS 2023 - Novel AI Architecture\nhttps://arxiv.org/abs/2023.12345", 3, | |
| "https://github.com/aitech/core", 500, 3, 5, | |
| 15, 3, 2, 4, | |
| 10, 50, 100 | |
| ], | |
| outputs=[ | |
| company_name, founded_year, industry, stage, revenue_type, | |
| monthly_revenue, growth_rate, arpu, gross_margin, monthly_churn, | |
| retention_rate, new_customers, monthly_marketing, monthly_sales, | |
| cash_balance, burn_rate, | |
| domains, patent_filed, patent_granted, papers, trademarks, | |
| github_url, github_stars, awards, partnerships, | |
| team_size, phd_count, serial_entrepreneurs, big_tech_experience, | |
| media_coverage, app_downloads, social_followers | |
| ] | |
| ) | |
| gr.Button("λ°μ΄μ€ν ν¬ μμ").click( | |
| lambda: [ | |
| "BioHealth Inc", 2020, "ν¬μ€μΌμ΄", "μ΄κΈ° λ§€μΆ", "ꡬλ ν (SaaS)", | |
| 80, 200, 500, 85, 1, | |
| 95, 20, 40, 30, | |
| 3000, 150, | |
| "biohealth.com, biohealth.health", 8, 4, | |
| "Nature Medicine 2023 - Breakthrough in Drug Discovery\nScience 2023 - Novel Biomarker", 5, | |
| "https://github.com/biohealth/research", 200, 5, 3, | |
| 25, 8, 1, 3, | |
| 15, 5, 30 | |
| ], | |
| outputs=[ | |
| company_name, founded_year, industry, stage, revenue_type, | |
| monthly_revenue, growth_rate, arpu, gross_margin, monthly_churn, | |
| retention_rate, new_customers, monthly_marketing, monthly_sales, | |
| cash_balance, burn_rate, | |
| domains, patent_filed, patent_granted, papers, trademarks, | |
| github_url, github_stars, awards, partnerships, | |
| team_size, phd_count, serial_entrepreneurs, big_tech_experience, | |
| media_coverage, app_downloads, social_followers | |
| ] | |
| ) | |
| return demo | |
| # μ€ν | |
| if __name__ == "__main__": | |
| demo = create_ui() | |
| demo.launch(share=True) |