在当今数字化的商业环境中,财务分析对于企业决策至关重要。本文章将介绍如何部署一个基于 Flask 的智能财务分析 API,它利用了百度文心一言大模型来生成智能分析报告。该文章将分为两部分,第一部分主要介绍该API使用的核心代码及其部署测试。第二部分将会在一个月后上传,将会专注于提升该API生成的报告的准确性,并尝试为其添加Wed页面以方便用户使用。
一、前期准备
安装必要的库
你需要确保已经安装了以下 Python 库:
flask
、
pandas
、
statsmodels
、
requests
、
json
。可以使用
pip install
命令来安装它们。
pip install flask pandas statsmodels requests
获取 API 密钥
在百度智能云千帆平台申请并获取
API_key
和
secret_key
,这两个密钥将用于获取访问令牌(access_token)以调用文心一言的 ModelBuilder API。关于如何注册百度账号并获取模型密钥的文章已经很多,本文不再赘述,具体操作方法可以参考另一篇blog。
二、代码结构与功能解析
框架选择——Flask
在构建财务分析 API 时,选择 Flask 主要因其具备多方面优势。Flask 极为轻量,核心代码简洁易懂,像创建基本应用仅需寥寥数行代码,使开发人员可快速搭建 API 基础架构。尤其适合对Python编程熟练度较低的新手。同时其灵活性很高,能与诸如
pandas
、
statsmodels
、
requests
等多种库自由集成,在处理数据、分析及与百度千帆通信时,不会受框架限制,方便按业务逻辑操作。
最重要的是,使用 Flask 可以让我们后续为该财务分析 API 添加 Web 界面时更加便捷。其路由(Routing)机制可以将 URL 与特定的 Python 函数关联起来。它决定了当用户访问某个特定 URL 时,应用程序应该执行什么逻辑。比如我们后续可以新增
/dashboard
等路由展示分析结果,增强用户体验。
Flask 应用初始化
我们首先创建一个 Flask 应用实例
from flask import Flask, request, jsonify
app = Flask(__name__)
这是整个 API 的基础框架,后续所有的路由和功能都将围绕这个
app
展开。
获取访问令牌
在调用大模型之前,需要使用 API Key,Secret Key 获取access_token。因此我们需要首先定义get_access_token()函数并向百度千帆平台发送请求以获取访问令牌,该令牌将用于后续的 API 调用。
def get_access_token():
"""
使用 API Key,Secret Key 替换下列示例中的 client_id 与 client_secret
"""
url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=cL8yxxxx9ReF&client_secret=Y3QPxxxxexUo"
payload = json.dumps("")
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
return response.json().get("access_token")
其中不同模型的请求地址(url)均不同,可以在示例代码中心 查看你想要调用的具体模型的要求。本文使用的模型为 ERNIE-4.0-8K。
财务分析函数
由于文心一言是一款人工智能大语言模型,并非专为数据处理设计,擅长的是自然语言处理,因此其缺乏数据分析和计算能力的精准性。相比于直接将完整的财务报表传输给文心一言,更明智的做法是利用数据处理工具对财务报表进行数据分析,再结合具体分析结果让人工智能生成更加精准的财务分析报告。
因此我定义了三个函数分别对财务报表中的收入,成本以及负债进行初步的数据分析。
def analyze_revenue_trend(data):
"""
收入趋势分析:使用指数平滑模型预测未来收入。
"""
try:
model = ExponentialSmoothing(data['Revenue'], trend='add', seasonal=None).fit()
forecast = model.forecast(3) # 预测未来3期收入
return {
'current_revenue': int(data['Revenue'].iloc[-1]),
'forecast': list(map(int, forecast))
}
except Exception as e:
return {'error': f'Revenue trend analysis failed: {str(e)}'}
def analyze_cost(data):
"""
成本优化建议:计算过去12个月的平均成本比例,提出优化建议。
"""
try:
data['Cost_Percentage'] = data['Cost'] / data['Revenue']
avg_cost_percentage = data['Cost_Percentage'].mean()
suggestion = "Reduce operational costs by 5%" if avg_cost_percentage > 0.5 else "Cost structure is optimal"
return {
'average_cost_percentage': float(avg_cost_percentage),
'suggestion': suggestion
}
except Exception as e:
return {'error': f'Cost analysis failed: {str(e)}'}
def predict_debt_risk(data):
"""
债务风险预测:根据债务与收入比例,评估风险等级。
"""
try:
debt_to_revenue_ratio = data['Debt'] / data['Revenue']
avg_ratio = debt_to_revenue_ratio.mean()
risk_level = (
"High Risk" if avg_ratio > 0.8 else
"Moderate Risk" if avg_ratio > 0.5 else
"Low Risk"
)
return {
'average_debt_to_revenue_ratio': float(avg_ratio), t
'risk_level': risk_level
}
except Exception as e:
return {'error': f'Debt risk prediction failed: {str(e)}'}
注:这三个函数只是对财务报表做了最为简单的收入预测以及风险分析,后续具体使用时可根据不同公司的具体要求对其进行修正。
调用文心一言生成财务报告
在对数据进行分析之后,就可以将分析结果传输给文心一言,由他生成一篇完整的财务报告。
def generate_report(revenue_analysis, cost_analysis, debt_analysis):
url = f"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token={get_access_token()}"
prompt = f"""
收入分析:当前收入 {revenue_analysis['current_revenue']},预测 {revenue_analysis['forecast']}。
成本分析:平均成本比例 {cost_analysis['average_cost_percentage']:.2f}。
债务分析:风险等级 {debt_analysis['risk_level']}。
请生成一份简洁的财务分析报告,包含总结和可执行建议。
"""
payload = json.dumps({"messages": [{"role": "user", "content": prompt}]})
headers = {'Content-Type': 'application/json'}
response = requests.post(url, headers=headers, data=payload)
return response.json().get('result', 'Error generating report')
对于不同的模型其对于payload, headers可能有不同的要求,仍然需要在示例代码中心查看不同模型的具体需求。对于本文使用的模型而言,要注意:message必须是奇数条,不然会报错。
/upload
路由:接收和处理财务数据文件
通过
/upload
接口接收 CSV 数据文件,调用分析函数并返回结果:
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return jsonify({'error': 'No file uploaded'}), 400
file = request.files['file']
if not file.filename.endswith('.csv'):
return jsonify({'error': 'Only CSV files are supported'}), 400
try:
# 读取 CSV 数据
data = pd.read_csv(file)
if not {'Date', 'Revenue', 'Cost', 'Debt'}.issubset(data.columns):
return jsonify({'error': 'File must contain Date, Revenue, Cost, Debt columns'}), 400
# 数据预处理
data['Date'] = pd.to_datetime(data['Date'])
data = data.sort_values('Date')
# 调用分析函数
revenue_analysis = analyze_revenue_trend(data)
cost_analysis = analyze_cost(data)
debt_analysis = predict_debt_risk(data)
# 结合文心一言生成分析报告
report = generate_report(revenue_analysis, cost_analysis, debt_analysis)
return jsonify({
'收入分析': revenue_analysis,
'成本分析': cost_analysis,
'债务分析': debt_analysis,
'财务分析报告(文心一言)': report
})
except Exception as e:
return jsonify({'error': str(e)}), 500
这个路由函数用于接收用户上传的 CSV 格式的财务数据文件。它首先检查是否有文件上传,如果没有则返回错误信息。然后检查文件扩展名是否为
.csv
,如果不是也返回错误。
在读取 CSV 文件后,它会进一步检查数据中是否包含
Date
、
Revenue
、
Cost
和
Debt
这几个必要的列。如果数据格式正确,就会对数据进行预处理,包括将日期列转换为
datetime
类型并按照日期排序。
之后,它分别调用
analyze_revenue_trend
、
analyze_cost
和
predict_debt_risk
这三个函数对收入趋势、成本和债务风险进行分析,并将结果传递给
generate_report
函数来生成最终的分析报告。最后,将所有分析结果以 JSON 格式返回给用户。
三、部署与测试
运行Flask应用
if __name__ == '__main__': app.run(debug=True, port=5000)
在本地运行该代码,该API服务即被启动。你的应用将运行在
http://127.0.0.1:5000
(这是 Flask 应用默认的本地运行地址)。
测试
可以使用cURL命令行工具测试该API。在命令行(Windows)或终端(MacOS)中运行如下代码:
curl -X POST -F "[email protected]" http://127.0.0.1:5000/upload
其中,data.csv为你想要上传的财务数据文件。
当我们执行上述
curl
命令后,会在命令行(或终端)得到 API 的响应。如果一切正常,响应将是一个 JSON 格式的数据,包含收入分析、成本分析、债务风险分析和文心一言生成的财务报告等内容。
四、示例
上传的 CSV 文件如下:
DateRevenueCostDebt2024/1/110000050000200002024/2/111000055000220002024/3/112000060000250002024/4/113000065000270002024/5/11400007000030000
最终生成的报告如下:
{
"财务报告(文心一言)": "**财务分析报告**\n\n**一、概述**\n\n本报告基于最新的财务数据,对收入、成本及债务状况进行了全面分析,旨在为管理层提供决策支持,确保公司的财务健康与持续增长。\n\n**二、收入分析**\n\n- **当前收入状况**:公司当前收入达到140,000元,显示出稳健的经营能力。\n- **未来收入预测**:根据预测数据,未来三期收入将分别增长至[149,390元, 159,016元, 168,642元],呈现逐步上升的趋势,预示着积极的市场前景和业务拓展成果。\n\n**三、成本分析**\n\n- **成本结构**:公司平均成本比例为0.50,表明成本控制得当,资源配置效率较高。\n- **建议**:成本结构已经处于最优状态,建议继续保持并监控成本变动,以确保持续的成本优势。\n\n**四、债务分析**\n\n- **债务收入比**:平均债务收入比为0.21,显示出较低的债务负担。\n- **风险等级**:经评估,公司的债务风险等级为“低风险”,表明公司具有稳健的偿债能力,财务风险可控。\n\n**五、总结**\n\n综合以上分析,公司财务状况健康,收入稳步增长,成本结构合理,债务风险低。这些积极因素为公司未来的发展奠定了坚实基础,提供了有力的财务保障。\n\n**六、可执行建议**\n\n1. **收入提升策略**:继续加强市场开拓,优化产品和服务,以维持并加速收入增长势头。\n2. **成本控制措施**:持续监控成本动态,通过技术创新和管理优化进一步降低成本,提升盈利能力。\n3. **债务管理规划**:在保持低债务风险的同时,合理利用财务杠杆,优化债务结构,以支持公司的扩张和发展战略。",
"成本分析": {
"平均成本比例": 0.5,
"建议": "成本结构最优"
},
"债务分析": {
"平均收入比例": 0.206062271062271,
"风险等级": "低风险"
},
"收入分析": {
"当前收入": 140000,
"预测": [149390, 159016, 168642]
}
}
五、下一步工作
经过上述步骤,我们的API现在有了基本的财务数据分析和财务报告生成功能。然而,我们意识到财务数据分析步骤过于简单,仅仅使用了指数平滑模型来预测收入。此外,生成的报告信息有些简陋,并且格式不太适合阅读。因此,我们需要改变输出格式,使用户更容易使用报告信息。在接下来的工作中,我们将专注于提高报告的准确性,并为API添加一个Web页面,以便用户可以更方便地使用它。
版权归原作者 qq_42641627 所有, 如有侵权,请联系我们删除。