Я пытаюсь создать приложение Dash, которое должно:
- Чтение файла CSV и преобразование его в фрейм данных
- Подмножество этого кадра данных в соответствии с выбором пользователя (переключатели, ...)
- Генерирует вложенный фрейм данных в CSV-файле
Проблема в том, что я не могу установить подкадр данных так, как мне бы хотелось.
Давайте представим, что у меня есть фрейм данных gas3
с переменной Flag
. Вот часть моего кода:
import dash
import dash_core_components as dcc # Graphs
import dash_html_components as html # Tags
from dash.dependencies import Input, Output, Event, State
from pandas_datareader import DataReader
import time
import pandas as pd
import plotly
import plotly.graph_objs as go
from collections import deque
import random
import os
import pandas as pd
import glob
import numpy as np
import statistics
from datetime import *
from pytz import *
import dash_table_experiments as dte
import io
from flask import send_file
import flask
import urllib.parse
# Import df
gas3 = pd.read_csv("D:/Path/gas3.csv", sep=';')
gas3['Date_Local_Time'] = pd.to_datetime(gas3['Date_Local_Time'], format='%Y/%m/%d %H:%M') # Conversion de la variable en type "date heure"
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets) # Starting application
app.layout = html.Div(children=[
# Radio buttons
html.Div([
html.Label("Sélectionnez la valeur du Flag que vous souhaitez :",
htmlFor='radioflag',
),
html.Br(),
html.Br(),
dcc.RadioItems(
id='radioflag',
options=[
{'label': 'Flag 0', 'value': 'Flag0'},
{'label': 'Flag 1', 'value': 'Flag1'},
{'label': 'Flag 3', 'value': 'Flag3'},
{'label': 'Chambre à flux', 'value': 'CAF'}
]
),
html.Br(),
]),
# Download button
html.Div(id='table'),
html.A(
'Download Data',
id='download-link',
download="rawdata.csv",
href="",
target="_blank"
)
])
### Subset function
def filter_data(flag):
gas_genere = gas3.copy()
if flag == 'Flag0':
gas_genere = gas_genere[gas_genere['Flag']==0]
return gas_genere
else:
return gas_genere[0:4]
# Callback
@app.callback(
Output('download-link', 'href'),
[Input('radioflag', 'value')])
def update_download_link(flag):
gas_genere = filter_data(flag)
csv_string = gas_genere.to_csv(index=False, encoding='utf-8', sep=';')
csv_string = "data:text/csv;charset=utf-8,%EF%BB%BF" + urllib.parse.quote(csv_string)
return csv_string
if __name__ == '__main__':
app.run_server(debug=True)
Я обнаружил проблему, но не знаю, как ее исправить. Если я изменю свою функцию filter_data
на (я только добавил [0:2]
к первой return gas_genere
):
def filter_data(flag):
gas_genere = gas3.copy()
if flag == 'Flag0':
gas_genere = gas_genere[gas_genere['Flag']==0]
return gas_genere[0:2]
else:
return gas_genere[0:4]
Приложение работает хорошо! Если я отмечу «Флаг 0», будет сгенерировано gas_genere[0:2]
. В противном случае будет сгенерировано gas_genere[0:4]
.
Но если я сохраню его, как в своем исходном коде, я могу отметить «Флаг 1», «Флаг 3», «Шамбре» или не проверять любую кнопку, это сработает и сгенерирует gas_genere[0:4]
. Но если я выберу «Флаг 0», вместо того, чтобы возвращать gas_genere
, я не получу CSV-файл, но получу ошибку: «téléchargement Echec - Erreur réseau». который на английском языке должен быть "Download Failed - Network Error".
Я попытался сгенерировать мой фрейм данных gas_genere = gas3[gas3['Flag']==0]
в Python, и он получил 14299 строк и 43 столбца.
Не слишком ли велик мой фрейм данных? Если да, что мне делать?
Спасибо!