У меня есть работающее приложение Flask (соответствующие части ниже), которое считывает файл .csv и выводит на экран заголовок фрейма данных. Кроме того, он жестко кодирует среднее значение по столбцу в сообщении на экране.
from flask import Flask, render_template, request
import numpy as np
from scipy.stats import binom
from scipy.optimize import minimize
from scipy.stats import norm
from scipy import optimize
from pyodbc import connect
import pandas as pd
app = Flask(__name__)
@app.route('/dataTools', methods=['GET', 'POST'])
def data_tools_upload():
if request.method == 'POST':
orig_df = pd.read_csv(request.files.get('file'))
vars = list(orig_df.columns)
mean = orig_df[vars[4]].mean()
dims = orig_df.shape
message = 'You have data! There are %s rows and %s columns and the variable %s has mean %s' % (dims[0],dims[1],vars[4],round(mean,3))
table = orig_df.head(10).to_html(classes='data', header = "true")
return render_template('upload.html', tables = [table], message = message, vars = vars)
return render_template('upload.html')
if __name__ == '__main__':
app.run(debug=True)
# or just app.run()
Внутри моего HTML находится следующая часть
<form method=post enctype=multipart/form-data>
<input type=file name=file class = "btn btn-outline-secondary">
<input type=submit value=Upload class = "btn btn-outline-secondary">
</form>
<select name= vars method="GET" action="/">
{% for vars in vars %}
<option value= "{{vars}}" SELECTED>{{vars}}</option>"
{% endfor %}
</select>
</select>
Все это «работает» в том смысле, что отображает контент, на который я надеюсь. Однако я специально работаю над раскрывающимся меню, которое в настоящее время автоматически заполняется именами столбцов во фрейме данных. Я хочу, чтобы пользователь выбрал вариант в этом раскрывающемся списке, а затем он перешел бы к части mean = orig_df[vars[4]].mean()
, чтобы было напечатано среднее значение выбранной им переменной.
Спасибо за любые предложения .
ОБНОВЛЕНИЕ
Я понимаю, что если я хочу отправить информацию с HTML обратно на сервер, мне нужно внести несколько изменений. Я пробую следующее
@app.route('/dataTools', methods=['GET', 'POST'])
def data_tools_upload():
if request.method == 'POST':
orig_df = pd.read_csv(request.files.get('file'))
vars = list(orig_df.columns)
#mean = orig_df[vars[4]].mean()
var2use = request.option.get("vars")
mean = orig_df[var2use].mean()
dims = orig_df.shape
message = 'You have data! There are %s rows and %s columns and the variable %s has mean %s' % (dims[0],dims[1],vars[4],round(mean,3))
table = orig_df.head(10).to_html(classes='data', header = "true")
return render_template('upload.html', tables = [table], message = message, vars = vars)
return render_template('upload.html')
, где я добавил часть var2use = request.option.get("vars")
, а затем в HTML я сделал следующие обновления, поэтому есть также метод POST, и действие возвращается к функции в приложение flask.
<select name= vars method="GET|POST" action="{{url_for('data_tools_upload')}}">
{% for var in vars %}
<option value= "{{var}}" SELECTED>{{var}}</option>"
{% endfor %}
</select>
</select>
Я получаю следующую ошибку AttributeError: 'Request' object has no attribute 'option'
.
Надеюсь, что это обновление поможет, а также надеюсь на предлагаемое решение.