JC321 commited on
Commit
52019f0
·
verified ·
1 Parent(s): 0e43a7b

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +147 -0
app.py ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import requests
3
+
4
+ MCP_URL = "https://jc321-easyreportdatemcp.hf.space"
5
+
6
+ def query_financial_data(company_name, query_type):
7
+ """查询财务数据的主函数"""
8
+
9
+ if not company_name:
10
+ return "请输入公司名称或股票代码"
11
+
12
+ try:
13
+ # 搜索公司
14
+ search_resp = requests.post(
15
+ f"{MCP_URL}/api/advanced_search",
16
+ json={"company_input": company_name},
17
+ timeout=30
18
+ )
19
+ company = search_resp.json()
20
+
21
+ if company.get("error"):
22
+ return f"❌ 错误: {company['error']}"
23
+
24
+ result = f"# {company['name']}\n\n"
25
+ result += f"**股票代码**: {company.get('tickers', ['N/A'])[0] if company.get('tickers') else 'N/A'}\n"
26
+ result += f"**行业**: {company.get('sic_description', 'N/A')}\n\n---\n\n"
27
+
28
+ cik = company['cik']
29
+
30
+ # 根据查询类型获取数据
31
+ if query_type == "最新财务数据":
32
+ data_resp = requests.post(
33
+ f"{MCP_URL}/api/get_latest_financial_data",
34
+ json={"cik": cik},
35
+ timeout=30
36
+ )
37
+ data = data_resp.json()
38
+
39
+ if data.get("error"):
40
+ return result + f"❌ {data['error']}"
41
+
42
+ result += f"## 财年 {data['period']}\n\n"
43
+ result += f"- **总收入**: ${data['total_revenue']:,.0f} (${data['total_revenue']/1e9:.2f}B)\n"
44
+ result += f"- **净利润**: ${data['net_income']:,.0f} (${data['net_income']/1e9:.2f}B)\n"
45
+ result += f"- **每股收益**: ${data['earnings_per_share']:.2f}\n"
46
+ result += f"- **来源**: {data['source_form']}\n"
47
+
48
+ elif query_type == "3年趋势":
49
+ metrics_resp = requests.post(
50
+ f"{MCP_URL}/api/extract_financial_metrics",
51
+ json={"cik": cik, "years": 3},
52
+ timeout=60
53
+ )
54
+ metrics = metrics_resp.json()
55
+
56
+ if metrics.get("error"):
57
+ return result + f"❌ {metrics['error']}"
58
+
59
+ result += f"## 财务趋势 (共 {metrics['count']} 个期间)\n\n"
60
+
61
+ # 只显示年度数据
62
+ annual_data = [m for m in metrics['metrics'] if 'Q' not in m['period']][:3]
63
+
64
+ result += "| 期间 | 收入(十亿) | 净利润(十亿) | EPS |\n"
65
+ result += "|------|-----------|------------|-----|\n"
66
+
67
+ for m in annual_data:
68
+ period = m['period']
69
+ rev = m.get('total_revenue', 0) / 1e9
70
+ inc = m.get('net_income', 0) / 1e9
71
+ eps = m.get('earnings_per_share', 0)
72
+ result += f"| FY{period} | ${rev:.2f}B | ${inc:.2f}B | ${eps:.2f} |\n"
73
+
74
+ elif query_type == "5年趋势":
75
+ metrics_resp = requests.post(
76
+ f"{MCP_URL}/api/extract_financial_metrics",
77
+ json={"cik": cik, "years": 5},
78
+ timeout=60
79
+ )
80
+ metrics = metrics_resp.json()
81
+
82
+ if metrics.get("error"):
83
+ return result + f"❌ {metrics['error']}"
84
+
85
+ annual_data = [m for m in metrics['metrics'] if 'Q' not in m['period']][:5]
86
+
87
+ result += f"## 5年财务趋势\n\n"
88
+ result += "| 期间 | 收入 | 净利润 | EPS |\n"
89
+ result += "|------|------|--------|-----|\n"
90
+
91
+ for m in annual_data:
92
+ rev = m.get('total_revenue', 0) / 1e9
93
+ inc = m.get('net_income', 0) / 1e9
94
+ eps = m.get('earnings_per_share', 0)
95
+ result += f"| FY{m['period']} | ${rev:.2f}B | ${inc:.2f}B | ${eps:.2f} |\n"
96
+
97
+ return result
98
+
99
+ except Exception as e:
100
+ return f"❌ 发生错误: {str(e)}"
101
+
102
+ # 创建 Gradio 界面
103
+ with gr.Blocks(title="SEC 财务数据查询助手", theme=gr.themes.Soft()) as demo:
104
+ gr.Markdown("# 🤖 SEC 财务数据查询助手")
105
+ gr.Markdown("通过调用 MCP Server 查询美国上市公司的财务数据")
106
+
107
+ with gr.Row():
108
+ company_input = gr.Textbox(
109
+ label="公司名称或股票代码",
110
+ placeholder="例如: NVIDIA, Apple, TSMC, AAPL",
111
+ scale=2
112
+ )
113
+ query_type = gr.Radio(
114
+ ["最新财务数据", "3年趋势", "5年趋势"],
115
+ label="查询类型",
116
+ value="最新财务数据",
117
+ scale=1
118
+ )
119
+
120
+ submit_btn = gr.Button("🔍 查询", variant="primary", size="lg")
121
+ output = gr.Markdown(label="查询结果")
122
+
123
+ # 示例
124
+ gr.Examples(
125
+ examples=[
126
+ ["NVIDIA", "最新财务数据"],
127
+ ["Apple", "3年趋势"],
128
+ ["Microsoft", "5年趋势"],
129
+ ["TSMC", "最新财务数据"],
130
+ ["Tesla", "3年趋势"]
131
+ ],
132
+ inputs=[company_input, query_type],
133
+ outputs=output,
134
+ fn=query_financial_data,
135
+ cache_examples=False
136
+ )
137
+
138
+ submit_btn.click(
139
+ fn=query_financial_data,
140
+ inputs=[company_input, query_type],
141
+ outputs=output
142
+ )
143
+
144
+ gr.Markdown("---")
145
+ gr.Markdown(f"**数据来源**: SEC EDGAR | **MCP Server**: `{MCP_URL}`")
146
+
147
+ demo.launch()