0

The code is designed to generate a dataframe using a background task. Once the background task is completed, the results from the dataframe is emitted to an html script using flask-socketio. A user can click a button to toggle the text.

Python script:

from flask import Flask, render_template, request
import pandas as pd
from flask_executor import Executor
from flask_socketio import SocketIO, emit
import json

app = Flask(__name__)
socketio = SocketIO(app)


@socketio.on("response")
def background_task_func():
    data = {'Name': ['Tom', 'Joseph', 'Krish', 'John'], 'Age': [20, 21, 19, 18]}  

    desired_output={"objects":[
        {"Name":"Tom","Age":20},
        {"Name":"Joseph","Age":21},
        {"Name":"krish","Age":19},
        {"Name":"John","Age":18},
        
       ]}
    data_2= pd.DataFrame(data)
    
    df_json=data_2.to_json(orient='records')
    results = {"objects":df_json}
    socketio.emit('response_output',desired_output, broadcast=True)
    
@app.route('/', methods=['GET'])
def index():

    executor.submit(background_task_func)   
    return render_template('views/index_img_soc4.html')



if __name__ == "__main__":  
    executor = Executor(app)
    socketio.run(app)

Variable desired_output is a test dict, which successfully displays in the html script below.

The html script is following:

<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js"></script>
<style>
    #bargraph ={display:none;}
</style>

<button id="button_demo" class="w3-button w3-white w3-small w3-border w3-border-green w3-round-large" onclick="myFunctionChart()">View Chart</button>
<div id="testmesg"><span id="myText"></span></div>
<div id="myData"></div>
<div class="chart" id="bargraph">
    <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=" crossorigin="anonymous"></script>
        <script type="text/javascript" charset="utf-8">
            
            var socket = io().connect('http://127.0.0.1:5000');
            socket.emit('response')
            var str_;
            socket.on('response_output', function(obj) {
            str_ ="Hello";
            var html = "";
            for (var i=0; i < obj.objects.length; i++) {

                html += "<p>" + obj.objects[i].Name + obj.objects[i].Age  + "</p>";
        
                }
        
            document.getElementById("myData").innerHTML = html;
            
                });
 
        </script>
</div>



<script>
    function myFunctionChart() {
      var x = document.getElementById("testmesg");
      if (x.style.display === "none") {
        x.style.display = "block";
        document.getElementById("myText").innerHTML=str_;
      } else {
        x.style.display = "none";
      }
    }
</script>

I would like to convert the dataframe data_2 to same structure as variable desired_output.

Below is a snippet of the code which can be used to view the outputs of the dataframe and to view the expected outputs' structure (i.e. variable desired_output). The input is called data which is a dict. This is converted to a dataframe called data_2. The output of df_json is a string and not a dictionary. Therefore my final output is called results which is a dict of string {"objects":'[ {"Name":"Tom","Age":20}, {"Name":"Joseph","Age":21}, {"Name":"krish","Age":19}, {"Name":"John","Age":18} ]'} .

How can I rectify this to output {"objects":[ {"Name":"Tom","Age":20}, {"Name":"Joseph","Age":21}, {"Name":"krish","Age":19}, {"Name":"John","Age":18} ]}?

import pandas as pd
import json

data = {'Name': ['Tom', 'Joseph', 'Krish', 'John'], 'Age': [20, 21, 19, 18]} 

desired_output = {"objects":[
        {"Name":"Tom","Age":20},
        {"Name":"Joseph","Age":21},
        {"Name":"krish","Age":19},
        {"Name":"John","Age":18},
        
       ]}
data_2= pd.DataFrame(data)
df_json=data_2.to_json(orient='records')
result = {"objects":df_json}
4
  • I have attempted it. I have I got it to a form {"objects":'[ {"Name":"Tom","Age":20}, {"Name":"Joseph","Age":21}, {"Name":"krish","Age":19}, {"Name":"John","Age":18}, ]'} but it is still a dict of string. Commented Jul 16, 2021 at 15:30
  • You just need to load the json object string (see my answer). Commented Jul 16, 2021 at 15:37
  • 1
    Try {'objects': data_2.to_dict(orient='records')} #output: {'objects': [{'Name': 'Tom', 'Age': 20}, {'Name': 'Joseph', 'Age': 21}, {'Name': 'Krish', 'Age': 19}, {'Name': 'John', 'Age': 18}]} Commented Jul 16, 2021 at 15:37
  • 1
    @Sade does my answer help you? Commented Jul 16, 2021 at 15:39

1 Answer 1

1

You need to parse the json string to an object

result = {"objects": json.loads(df_json)}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.