#python #pandas #plotly-dash
#python #pandas #plotly-dash
Вопрос:
Я пытаюсь создать приложение для расчета цикла охлаждения. Мне удалось просто отобразить свои результаты, но у меня возникли проблемы с интеграцией пользовательских данных.
На данный момент все, чего я хочу добиться, это следующее:
- Пользовательский ввод: число
- Число из входных данных используется при вычислении цикла
- Создается фрейм данных
- Фрейм данных отображается как dash_table.DataTable (и, надеюсь, будет отформатирован позже)
Я застрял на ошибке
dash.exceptions.InvalidCallbackReturnValue: The callback for `<Output `output_df.data`>`
returned a value having type `DataFrame`
which is not JSON serializable.
Вот мой код на данный момент:
from CoolProp.CoolProp import PropsSI
import numpy as np
import pandas as pd
import dash
import dash_core_components as dcc
import dash_table
import dash_html_components as html
from dash.dependencies import Input, Output
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
colors = {
'background':'#283747',
'text':'#7FDBFF'}
###App layout starts here###
app.layout = html.Div(style={'backgroundColor':colors['background']},
children=[
html.H1(
children='R744 cycle',
style={
'textAlign':'center',
'color':colors['text']}
),
html.H2(
children='A Dash sandbox',
style={'textAlign':'center',
'color':'#e74c3c'}
),
#Here INPUT DATA
html.Div(["Input: ",
dcc.Input(id='input_data', value='25', type='number')],
style={'color':colors['text']}
),
dash_table.DataTable(id='output_df',
style_as_list_view=True,
),
##Maybe later: Add a fancy Slider as input
##dcc.Slider(
##min=0,
## max=8,
## step=None,
## marks={
## 0: '20 °C',
## 2: '22 °C',
## 4: '24 °C',
## 6: '26 °C',
## 8: '28 °C'
## },
## value=5)
])
###App layout ends here###
###Callbacks to set calculation value for cycle###
@app.callback(
Output(component_id='output_df', component_property='data'),
[Input(component_id='input_data', component_property='value')]
)
def update_output_div(input_value):
#Kältekreislauf Basic
T_0=-10 273.15
T_C= float(input_value) 273.15 ##input value has to be float for caluclation!
eta_is = 0.7
fluid = 'R744'
delta_T_sh = 5
p_0 = PropsSI('P','T',T_0,'Q',0,fluid)
p_C = PropsSI('P','T',T_C,'Q',0,fluid)
states=4
p=np.zeros(states)
T=np.zeros(states)
h=np.zeros(states)
s=np.zeros(states)
#State 1 suction line
p[0]=p_0
T[0]=T_0 delta_T_sh
h[0]=PropsSI('H','T',T[0],'P',p[0],fluid)
s[0]=PropsSI('S','T',T[0],'P',p[0],fluid)
#State 2 Discharge line
p[1]=p_C
h_is_1 = PropsSI('H','S',s[0],'P',p[1],fluid)
h[1]=(h_is_1-h[0])/eta_is h[0]
T[1]=PropsSI('T','H',h[1],'P',p[1],fluid)
#State 3 After Condenser @ Bubble line
p[2]=p_C
h[2]=PropsSI('H','P',p[2],'Q',0,fluid)
T[2]=PropsSI('T','P',p[2],'Q',0,fluid)
#State 4 After expansion
p[3]=p_0
h[3]=h[2]
T[3]=PropsSI('T','P',p[3],'H',h[2],fluid)
df = pd.DataFrame (
{
'Pressure in bar': p*10**(-5),
'Temperature in K':T,
'Specific Enthalphy in kJ/kg':h/1000,
},
index=['State 1','State 2','State 3','State 4']
)
df_rounded=df.round(3)
return df_rounded #Result of function is a pandas dataframe!
if __name__ == '__main__':
app.run_server(debug=True)
Ответ №1:
Вы должны изменить свой вывод с обратного вызова на df.to_dict(orient='records')
. Вы не можете передать df
непосредственно в таблицу данных Dash, о чем вам сообщает ошибка. Однако он будет работать как dict
объект. Вы также можете установить значение по умолчанию для data
реквизита, который вы выводите, потому что Dash иногда может привередничать с отключенными свойствами.