如何在Flask中优化Apriori算法结果DataFrame的Rule列显示
问题与解决方案
问题描述
我使用Apriori算法生成推荐结果,将结果存储在名为result的DataFrame中,该DataFrame包含Rule、Support、Confidence三列。在Flask中展示该结果时,Rule列显示带有['']的格式(例如['教师'] -> ['程序员']),但我希望显示为无括号和引号的样式(例如教师 -> 程序员)。相关代码如下:
DataFrame构建代码
Result=pd.DataFrame(columns=['Rule','Support','Confidence']) for idx, elem in enumerate(association_results): thiselem = elem nextelem = association_results[(idx + 1) % len(association_results)] Result=Result.append({ 'Rule':str([str(x) for x in thiselem[0]])+ " -> " +str([str(x) for x in nextelem[0]]), 'Support':str(round(elem[1] *100, 2))+'%', 'Confidence':str(round(elem[2][0][2] *100, 2))+'%' },ignore_index=True)
Flask路由代码
@app.route('/rekomendasi', methods=['POST']) def rekomendasi(): sup = request.form.get('support') conf = request.form.get('confidence') # Model store_data = pd.read_csv('dataPekerjaan.csv', sep=',', header=None, error_bad_lines=False) records = [] # memisahkan data menjadi list for i in range(store_data.shape[0]): records.append([str(store_data.values[i, j]).split(',') for j in range(store_data.shape[1])]) # hanya ambil data nama pekerjaan dataKerja = [[] for dataKerja in range(len(records))] for i in range(len(records)): for j in records[i][1]: dataKerja[i].append(j) min_sup = float('0.00' + str(sup)) min_conf = float('0.00' + str(conf)) association_rules = apriori(dataKerja, min_support=min_sup, min_confidence=min_conf, min_length=2) association_results = list(association_rules) # menampilkan hasil asosiasi pd.set_option('max_colwidth', 200) result = pd.DataFrame(columns=['Rule', 'Support', 'Confidence']) for item in association_results: pair = item[2] for i in pair: result = result.append({ 'Rule': str([x for x in i[0]]) + " -> " + str([x for x in i[1]]), 'Support': str(round(item[1] * 100, 2)) + '%', 'Confidence': str(round(i[2] * 100, 2)) + '%' }, ignore_index=True) return render_template('rekomendasi.html', name='made', sup = sup, conf = conf, len= len(result)-1, query = result)
HTML模板代码
{%for i in range(len) %} <tr> <th>{{i+1}}</th> <td>{{query['Rule'][i]}}</td> <td>{{query['Support'][i]}}</td> <td>{{query['Confidence'][i]}}</td> </tr> {%endfor%}
解决方案
问题出在生成Rule列时,直接用str()转换列表会保留Python列表的默认格式(方括号、引号)。只需修改生成Rule的代码,用', '.join()方法将列表元素拼接为纯文本即可:
修改Flask路由中的代码
for item in association_results: pair = item[2] for i in pair: result = result.append({ # 用join拼接列表元素,去掉括号和引号 'Rule': ', '.join(i[0]) + " -> " + ', '.join(i[1]), 'Support': str(round(item[1] * 100, 2)) + '%', 'Confidence': str(round(i[2] * 100, 2)) + '%' }, ignore_index=True)
修改旧DataFrame构建代码(若仍需使用)
Result=Result.append({ 'Rule':', '.join(str(x) for x in thiselem[0])+ " -> " +', '.join(str(x) for x in nextelem[0]), 'Support':str(round(elem[1] *100, 2))+'%', 'Confidence':str(round(elem[2][0][2] *100, 2))+'%' },ignore_index=True)
原理说明
', '.join(列表)会遍历列表中的每个元素,用逗号加空格连接成一个字符串。如果列表只有单个元素,就直接返回该元素的纯文本,不会出现括号和引号,完全符合展示需求。
内容的提问来源于stack exchange,提问作者A fish
相关产品推荐
相关产品推荐

