Flask生成的购物篮分析结果无法在HTML页面显示问题排查
市场篮子分析Flask结果不显示问题解决
问题描述
开展市场篮子分析项目时,Flask后端生成的关联规则分析结果无法在results.html页面展示,页面仅显示表头,无任何数据行。
相关代码
HTML文件(results.html)
<!DOCTYPE html> <html> <head> <title>Market basket analysis</title> <link rel="stylesheet" type="text/css" href="styles.css" /> </head> <body> <h1>Market Basket Analysis</h1> <table> <thead> <tr> <th>Left Hand Side</th> <th>Right Hand Side</th> <th>Support</th> <th>Confidences</th> <th>Lifts</th> </tr> </thead> <tbody> {% for result in results %} <tr> <td>{{ result[0] }}</td> <td>{{ result[1] }}</td> <td>{{ result[2] }}</td> <td>{{ result[3] }}</td> <td>{{ result[4] }}</td> </tr> {% endfor %} </tbody> </table> </body> </html>
Python文件(app.py)
from flask import Flask, render_template import pandas as pd from apyori import apriori app = Flask(__name__) @app.route('/') def index(): df = pd.read_csv('Groceries_data.csv') df['date'] = pd.to_datetime(df['Date']) cust_level = df[["Member_number","itemDescription"]].sort_values(by="Member_number", ascending= False) cust_level["itemDescription"] = cust_level["itemDescription"].str.strip() transactions = [a[1]['itemDescription'].tolist() for a in list(cust_level.groupby(["Member_number"]))] rules = apriori(transactions = transactions, min_support = 0.002, min_confidence=0.05, min_lift=3, min_length=2) results = list(rules) def inspect(results): lhs = [tuple(result[2][0][0])[0] for result in results] rhs = [tuple(result[2][0][1])[0] for result in results] supports = [result[1] for result in results] confidences = [result[2][0][2] for result in results] lifts = [result[2][0][3] for result in results] return list(zip(lhs,rhs,supports,confidences,lifts)) resultsindataframe = pd.DataFrame(inspect(results),columns=['Left Hand Side','Right Hand Side','Support','Confidences','Lifts']) results = resultsindataframe.to_html(index=False) return render_template('results.html', results=results) if __name__ == '__main__': app.run(debug=True)
文件结构
MBA/ ├── app.py ├── templates/ │ └── result.html └── Groceries_data.csv
输出情况
页面仅显示标题和表格表头,无任何分析数据行。
错误分析与解决方案
1. 模板文件名不匹配
问题:文件结构中模板文件名为result.html,但Flask代码中render_template调用的是results.html(多了一个s),导致无法匹配正确的模板文件。
解决:
- 要么将
templates目录下的result.html重命名为results.html; - 要么修改
app.py中的代码,将return render_template('results.html', results=results)改为return render_template('result.html', results=results),保持文件名一致。
2. 数据传递格式错误
问题:代码中将DataFrame转换为HTML字符串(resultsindataframe.to_html(index=False))传给前端,但前端模板是通过循环遍历列表/元组的方式渲染数据,格式不匹配导致无法解析。
解决:
将数据转换为列表格式传递,修改app.py中的代码:
# 替换原来的results = resultsindataframe.to_html(index=False) results = resultsindataframe.values.tolist() return render_template('results.html', results=results)
修改后前端的{% for result in results %}就能正确遍历每一行数据。
3. 关联规则生成异常
问题:如果上述修改后仍无数据,需检查apriori是否生成了有效规则。可能是设置的min_support、min_confidence、min_lift等参数过高,导致没有符合条件的规则生成。
解决:
- 在
app.py中添加打印语句,查看规则数量:results = list(rules) print(f"生成的规则数量:{len(results)}") # 打印规则数量确认是否为空 - 如果规则数量为0,调整
apriori的参数,比如降低min_confidence到0.01、min_lift到1,或降低min_support,确保能生成足够的规则。
内容的提问来源于stack exchange,提问作者Riya Poonia
相关产品推荐
相关产品推荐

