Преобразование из библиотеки даш Python в Node.js - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь преобразовать код, который был сделан в черте Python, в Node.js + express. У меня есть встроенный пользовательский интерфейс, но теперь мне нужно включить функции, написанные на Python для создания обновлений пользовательского интерфейса.

Например, эта функция в Python:

    # The Map generator    
@app.callback(Output('plot1', 'figure'),[Input('button', 'n_clicks')],
    [State('text1', 'value'),State('text2', 'value'),State('text3', 'value'),State('text4', 'value')])


def text_callback(building_address, year_end='2017',year_start='2016', mapping_variable = 'Median Household Income'):
    print("Using this function now")

    addresses = building_address.split(';')
    print("ADDRESSESsssssssssssssssssssss:", addresses)
    data_slider = []
    layers_slider = []
    if mapping_variable == 'Predicted Growth Rank':
        colormap = 'Blues_r'
    else:
        colormap = 'Blues'
    gdf =  get_gdf(addresses, all_data, year_end,year_start)[0]
    Building_lat,Building_lon,Building_name = get_building_info(addresses)
    cmin=gdf[mapping_variable].min()
    cmax=gdf[mapping_variable].max()
    sm= scalarmappable(colormap, cmin, cmax)
    colorscale_new = get_colorscale(sm, df=gdf[mapping_variable], cmin=gdf[mapping_variable].min(), cmax=gdf[mapping_variable].max())
    pl_colorscale = colorscale_new
    gdf_year =  gdf[gdf['Year']==year_end]
    gdf_year['Predicted Growth Rank'] = gdf_year['Predicted Growth Rank'].rank(ascending=False)
    gdf_year= gdf_year.reset_index()
    index_list = list(gdf_year.index)
    centers,layers = get_mapbox_choropleth_data(gdf_year, index_list, col_vals=mapping_variable, colorscale=colorscale_new, val_name=mapping_variable)

    data_slider.append(centers)
    layers_slider.append(layers)    
    data2 = go.Scattermapbox(
        lat=Building_lat, lon=Building_lon, mode='markers', marker=go.scattermapbox.Marker(size=9,color='rgb(231, 41, 74)'),
        showlegend=False,
        text=Building_name) 
    data_slider.append(data2)
    layoutmbx = dict(font=dict(family='Balto', size=16), autosize=False, height=740, width=1200,
                     hovermode='closest',
        mapbox=dict(accesstoken=mapbox_access_token,layers=layers,
                bearing=0,
                center=dict(lat=centers['lat'][0], lon=centers['lon'][0]),
                pitch=0,
                zoom=9,style = 'streets'),margin = dict(l = 0, r = 0, t = 0, b = 0),
                     plot_bgcolor= '#202d56',
                paper_bgcolor='#202d56')    
    return {'data': data_slider, 'layout': layoutmbx}

the @app.callback сопоставляет различные элементы внешнего интерфейса и идентифицирует их в том порядке, в котором функция должна их использовать.

Так как .. Button = n_clicks, text1 = адрес здания, text2 = конец года, text3 = year_start, text4 = переменная отображения.

Как я могу преобразовать Python's Dash в Node.JS +Экспресс?

ОБНОВЛЕНИЕ:

Чтобы быть более конкретным, у меня теперь есть пользовательский интерфейс с 4 переменными: address, year_end, year_start и mapping_variable. Приведенная выше функция для одного конкретного адреса будет возвращать это:

[{'type': 'scattermapbox', 'mode': 'markers', 'text': ['Census Tract:304.01<br>Median Household Income:52212<br> Year: 2017 '], 'marker': {'size': 1, 'color': ['rgba(247, 251, 255, 255)'], 'colorscale': [[0.0, 'rgba(247, 251, 255, 255)'], [0.05263157894736842, 'rgba(236, 244, 251, 255)'], [0.10526315789473684, 'rgba(226, 237, 248, 255)'], [0.15789473684210525, 'rgba(215, 230, 244, 255)'], [0.21052631578947367, 'rgba(206, 224, 241, 255)'], [0.2631578947368421, 'rgba(193, 217, 237, 255)'], [0.3157894736842105, 'rgba(177, 210, 231, 255)'], [0.3684210526315789, 'rgba(160, 202, 225, 255)'], [0.42105263157894735, 'rgba(139, 192, 221, 255)'], [0.47368421052631576, 'rgba(117, 179, 216, 255)'], [0.5263157894736842, 'rgba(98, 168, 210, 255)'], [0.5789473684210527, 'rgba(80, 155, 203, 255)'], [0.631578947368421, 'rgba(64, 144, 197, 255)'], [0.6842105263157894, 'rgba(49, 129, 189, 255)'], [0.7368421052631579, 'rgba(36, 116, 182, 255)'], [0.7894736842105263, 'rgba(24, 102, 172, 255)'], [0.8421052631578947, 'rgba(14, 89, 162, 255)'], [0.894736842105263, 'rgba(8, 74, 146, 255)'], [0.9473684210526315, 'rgba(8, 61, 126, 255)'], [1.0, 'rgba(8, 48, 107, 255)']], 'opacity': 0, 'cmin': 52212, 'cmax': 52212, 'showscale': False}, 'showlegend': False, 'lon': [-122.77720976814757], 'lat': [45.47996783203806], 'hoverinfo': 'text'}, Scattermapbox({
    'lat': [45.48553],
    'lon': [-122.77518],
    'marker': {'color': 'rgb(231, 41, 74)', 'size': 9},
    'mode': 'markers',
    'showlegend': False,
    'text': [9555 SW DUNCAN LN]
})]

То, что эта функция делает в python с API-панелью тире, накладывает эти цвета на карту. Я должен сделать то же самое с Node.JS.

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Существует несколько способов вызова Python из JS. Это не рекомендуемый способ, и его не предпочитают тратить время на конвертацию. Пожалуйста, смотрите мои рекомендации ниже на основе моего предыдущего ответа.

  • Первый способ - сделать npm install python-shell

, а вот код

var PythonShell = require('python-shell');
//you can use error handling to see if there are any errors
PythonShell.run('my_script.py', options, function (err, results) { 
//your code

, который вы можете отправить в оболочку Python с помощью pyshell.send('hello');

здесь вы можете найти ссылку на API- https://github.com/extrabacon/python-shell

  • второй путь - другой пакет, на который вы можете ссылаться, это узел python, вам нужно сделать npm install node-python

  • третий способ - вы можете найти пример использования дочернего процесса - использование другого ответа ниже . Еще несколько ссылок - https://www.npmjs.com/package/python

, если вы хотите использовать сервис-ориентированную архитектуру - http://ianhinsdale.com/code/2013/12/08/communicating-between-nodejs-and-python/

Здесь - ссылка на мой старый ответ

1 голос
/ 21 октября 2019

TLDR;

вместо перевода py в js, возможно, вы могли бы вызвать дочерний процесс для вызова py ??

ссылка: https://www.geeksforgeeks.org/run-python-script-node-js-using-child-process-spawn-method/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...