Как создать и создать большой фрейм данных с помощью Python Dash? - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь создать приложение Dash, которое должно:

  1. Чтение файла CSV и преобразование его в фрейм данных
  2. Подмножество этого кадра данных в соответствии с выбором пользователя (переключатели, ...)
  3. Генерирует вложенный фрейм данных в 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 столбца.

Не слишком ли велик мой фрейм данных? Если да, что мне делать?

Спасибо!

...