【问题标题】:Upload a CSV-file with complex numbers and read it in Bokeh web app上传包含复数的 CSV 文件并在 Bokeh 网络应用程序中读取
【发布时间】:2019-10-27 03:59:34
【问题描述】:

我想将带有复数的 csv 文件上传到散景网络应用程序中。 DuCorey 的解决方案非常适用于整数和浮点数,请参阅:Upload a CSV file and read it in Bokeh Web app 但是,当我在 models.py 中将 values_type 从 Int 更改为 Complex 并将复数插入 csv 文件时,它不再起作用。我不想像 DuCorey 那样绘制导入的数组(并且在他的示例中不起作用)。只需导入值和 f.e.打印出来。

我更改了以下三个文件:

models.py

from bokeh.core.properties import List, String, Dict, Int, Complex, Float
from bokeh.models import LayoutDOM

class FileInput(LayoutDOM):
    __implementation__ = 'static/js/extensions_file_input.coffee'
    __javascript__ = './input_widget/static/js/papaparse.js'

    value = String(help="""
    Selected input file.
    """)

    file_name = String(help="""
    Name of the input file.
    """)

    accept = String(help="""
    Character string of accepted file types for the input. This should be
    written like normal html.
    """)

    data = List(Dict(keys_type=String, values_type=Complex))

csv 文件

x,y
1,2
3,3
3,5+1j
10,25

和 main.py

from bokeh.core.properties import List, String, Dict, Int
from bokeh.models import LayoutDOM

from bokeh.layouts import column
from bokeh.models import Button, ColumnDataSource
from bokeh.io import curdoc
from bokeh.plotting import Figure

import pandas as pd

from models import FileInput

button_input = FileInput(id="fileSelect",
                         accept=".csv")

def change_plot_data(attr, old, new):
    new_df = pd.DataFrame(new)
    print(new_df)

button_input.on_change('data', change_plot_data)

layout = column(button_input)
curdoc().add_root(layout)

我收到以下错误消息: DeserializationError('Complex 预期 Complex,得到 5+1j').

感谢所有建议!

【问题讨论】:

    标签: javascript python file-upload bokeh


    【解决方案1】:

    另一个示例中使用的方法使用 JavaScript 库来解析文件并将其发送回。 AFAIK 这在这种情况下不起作用,原因有两个:

    • papaparse JS 库本身对解析复数一无所知
    • 我实际上不确定将复杂值从 JS 发送回 Python 是否可行。 AFAIK 你是自 2013 年以来第一个想尝试它的人

    我认为让这项工作成为最佳选择是简单地将原始文件的全部内容发送回 Bokeh 服务器(作为一个大的String),然后使用 Pandas 从字符串中解析文件。

    【讨论】:

    • 谢谢!您是否有或知道如何将文件的全部内容作为字符串获取到 Bokeh 服务器的示例?我真的很陌生...
    • 在您的自定义扩展中,您可以添加 raw_data = String(...) 属性。当你在 JS 中设置它时,它会自动发送到 Python 端,你可以有一个回调 my_model.on_change('raw_data',...) 接受值并将其传递给 pandas。我不知道如何读取本地文件,但显然您链接的示例中使用的Papaparse 库可以,因此您可以研究它的源代码。
    • 研究 papaparse 的代码是个好主意!在这种情况下,阅读文档就足够了。只需在 models.py 中设置 papaparse 选项 dynamicTyping: false 并更改 values_type=String 即可。瓦卢
    猜你喜欢
    • 2017-04-09
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    相关资源
    最近更新 更多