Как выбрать индекс фрейма данных через выпадающее меню в Flask?

Контекст и что я хочу сделать:

Привет, вот пример с набором данных радужной оболочки. Я импортировал свою модель машинного обучения, и идея моего веб-приложения такова:

  • что вместо того, чтобы самому вводить плавающие значения признаков в поля, чтобы выполнить оценку класса радужной оболочки,
  • Вместо этого я хочу использовать индекс фрейма данных в раскрывающемся меню.

Таким образом, мне нужно только выбрать строку тестового набора, и модель автоматически получит функции x_test, чтобы выполнить свою оценку.

Проблема :

Моя проблема в том, что выпадающее меню появляется, но я ничего не могу выбрать в нем. Я чувствую, что почти закончил с этим, но я не могу понять, в чем проблема (это мой первый проект фляги), у вас есть идеи, как это сделать, пожалуйста? большое спасибо за вашу помощь, вот мой код:

Мой код:

- app.py:

# libraries
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split 
import piskle
from flask import Flask, request, jsonify, render_template

app = Flask(__name__) # initialization
model = piskle.load('model.pskl') # model
iris = pd.read_csv('iris.csv') # dataset
X = iris[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']]
y = iris['species']
x_train,x_test,y_train,y_test = train_test_split(X,y, test_size=0.3, random_state=0)


@app.route('/') # homepage
def home():
    return render_template('index.html')

@app.route('/predict',methods=['POST']) # estimation
def predict():

    index_list = x_test.index.to_list()
    feat = [x_test.iloc[i] for i in index_list]
    final_feat = np.array(feat).reshape(1, -1) 
    prediction = model.predict(pd.DataFrame(final_feat))    

    # result
    return render_template('index.html', index_list=index_list, prediction_text='Predicted Class: {}'.format(prediction))

if __name__ == "__main__":
    app.run(debug=True)

- index.html :

<!DOCTYPE html>
<html >
<!-- Titre et fichier/police CSS -->
<head>
  <meta charset = "UTF-8">
  <title>Iris classifier web-app</title>
</head>
<body>
 <div>
    <h1>Predict Iris Class</h1>

    <form action = "{{ url_for('predict')}}"method = "post">
         
        <select name = "index_list" method = "GET" action = "/">
        {% for i in index_list %}
                <option value = "{{ i }}">{{ i }}</option>
            {% endfor %}
        </select>

   <br>
   <br>
        <button type = "submit" class = "btn btn-primary btn-block btn-large">Predict</button>
    </form>
   <br>
   <br>
   {{ prediction_text }}
 </div>
</body>
</html>

🤔 А знаете ли вы, что...
Python подходит для начинающих программистов благодаря своей простоте и читаемости кода.


33
1

Ответ:

Решено

Не знаю, как ответить на ваш вопрос. Скопируйте и вставьте этот код и сообщите мне, работает ли он так, как вы хотели.

Я предполагаю, что эти элементы не отображались, потому что вы открыли маршрут "/" вместо "/predict", или, может быть, потому, что ваш метод .index_to_list() вообще не возвращал список.


main.py:

from flask import Flask, render_template, request

app = Flask(__name__)


@app.route('/predict', methods=['GET', 'POST'])  # estimation
def predict():
    index_list = [1, 2, 3, 4]

    prediction = 0

    chosen_option = None

    if request.method == 'POST':
        default_value = 0
        chosen_option = request.form.get(
            key='select_name',
            default=default_value,
        )
        chosen_option = int(chosen_option)

    # your prediction code goes into calc_prediction
    prediction = calc_prediction(chosen_option=chosen_option)

    return render_template(
        template_name_or_list='index.html',
        index_list=index_list,
        prediction=prediction,
        chosen_option=chosen_option,
    )


def calc_prediction(chosen_option: int):
    prediction = 0
    if not chosen_option:
        return 0
    
    # Do your prediction calculatoins (I guess your prediction were somehow based on
    # options from select)

    print(type(chosen_option))
    print(chosen_option)
    prediction = chosen_option / 4

    return prediction


if __name__ == "__main__":
    app.run(debug=True)

index.html:

<!DOCTYPE html>
<html>
<!-- Titre et fichier/police CSS -->
<head>
  <meta charset = "UTF-8">
  <title>Iris classifier web-app</title>
</head>
<body>
 <div>
    <h1>Predict Iris Class</h1>

    <form action = "{{ url_for('predict')}}" method = "post">
        <select name = "select_name">
        {% for i in index_list %}
            <option value = "{{ i }}">{{ i }}</option>
        {% endfor %}
        </select>
        <br>
        <br>
        <button type = "submit">Predict</button>
    </form>
   <br>
   <p>Predicted Class: {{ prediction }}</p> 
   <p>Chosen option: {{ chosen_option }}</p> 
 </div>
</body>
</html>