Flask - 输出多个数据帧和图形?

时间:2017-01-12 22:08:19

标签: pandas flask

我设置了一个小网站,允许用户上传我处理并加载到数据库中的Excel文件。作为一种“确认”窗口,我快速阅读他们上传的原始数据并使用pandas进行一些聚合和格式化。它非常整洁。我试图创建几个数据帧,甚至是matplotlib图,但我无法在一个视图中将所有数据组合在一起。 (在我的return语句中,我试图返回用逗号分隔但有错误的几个项目)

def to_html(df, caption):
    html = (df.style
              .format(format_numbers)
              .set_table_styles(styles)
              .set_properties(**{'width': '100', 'margin-left': 'auto', 'margin-right': 'auto', 'margin': '0px auto', "align": "center", "text-align": "center"})
              .set_caption(caption)
              .render())
    return html


@app.route('/upload', methods=['POST'])
def upload():
    file = request.files['file']
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file.save(filename)
        df = pd.read_excel(filename, index_col=None)
        daily = pd.pivot_table(df, index=['date', 'dimension'], columns=['other'], values=['stuff'], aggfunc=[np.sum], fill_value=0)
        daily.reset_index(inplace=True)
#to_html is a function I made which uses df.style from pandas, so this outputs a rendered pandas dataframe
        return to_html(monthly, 'Your file was successfully uploaded. Here is a summary of the data:'),  to_html(daily, caption='Daily details:')
    else:
        return 'File type is not supported.'

我在pythonanywhere上的日志文件只显示,但错误是502:

2017-01-12 17:54:13,627 :OSError: write error
2017-01-12 17:54:13,628 :Error running WSGI application
2017-01-12 17:54:13,628 :GeneratorExit

用户上传文件,我用熊猫阅读它并做一些聚合/计算/图形。如何以一种快速仪表板格式最好地显示这些图形和pandas DataFrames(HTML)?

他们上传的文件是标准模板,不到1MB。数据是时间序列,因此每天,每月,每个工作日查看它可能很有意义,或许可以添加一些快速预测或期望等。

1 个答案:

答案 0 :(得分:1)

您应该在前端使用/ with /绘制数据(使用,d3,highcharts,cytoscape)。使用flask API仅返回数据。特别是,你应该将每小时数据,daily_data,weekly_data作为使用 jsonify 函数从烧瓶中返回。

>>> def somefunc(params):
>>>    #.... some logic to get generate hourly, daily and weekly
>>>    data_dict = {}
>>>    data_dict["daily_data_to_plot"] = daily_data
>>>    data_dict["weekly_data_to_plot"] = weekly_data
>>>    data_dict["hourly_data_to_plot"] = hourly_data
>>>    return jsonify(data_dict)

然后,您尝试使用ruby / js读取此数据以显示在前端。