3 Replies Latest reply on Nov 8, 2019 10:06 AM by Nathan Mannheimer

    TabPy, Python returning Json, "Error Parsing Number"

    jonathan.rajbahadursingh

      I am trying to use Tableau calculated field to use my python script, which gets JSON data. My ultimate goal is to get this data into tableau in a tabular format.

      I have read JSON is easier to get into tableau opposed to dataframe object.

       

      I currently use it in Spyder program. and execute this to get my data.

      print (get1D ("2019-02-02", "2019-02-05", "Tableau", "Limits"))

       

       

       

      In my calculated field I get the error: "Error Parsing Number"  on

      .format(status_code))
      

       

      Not sure what I am doing wrong here.

      Any help would be appreciated on getting this data into tableau. Here is my full script.

      SCRIPT_INT(
      
      import time
      import requests
      import json
      import pandas as pd
      import re
      import urllib3
      import math
      
      from io import StringIO
      
      from datetime import datetime, date,timedelta
      from pandas.tseries.offsets import BDay
      from urllib.parse import urlencode
      from flask import json
      
      
      def call_api(url, request_dict, post):   
      
      
          if post:
              header = {'content-type':'application/json'}
              
              resp = requests.post(url, data=json.dumps(request_dict), auth=('user', 'pass'), headers = header, verify=False)
          else:
              url = url + urlencode(request_dict)
      
      
              resp = requests.get(url, auth=('user', 'pass'), verify=False)
      
      
      
      
          status_code = resp.status_code
          
          if status_code == 401:
              raise ValueError("There is an error with the connection.\nLogin failed. \nNot authorized. Please check your credentials and try again.\nStatus code {}".format(status_code))
          elif status_code == 404:
              raise ValueError("There is an error with the connection.\nCould not connect to the server.\nStatus code {}".format(status_code))
          elif status_code == 200:
              pass
          else:
              raise ValueError("There is an error with the connection.\nStatus code {}".format(status_code))
          
          return resp
         
      
      def getData (startDate, endDate, nodeName, Type, Id):
      
      
          
          request_dict = [{
              "hierarchy": "Tableau",
              "nodeName": nodeName,
              "FilterId": Type,
              "Id": Id ,
          }]
         
      
          url = "https://sampleurl/startDate={0}&endDate={1}" 
          
      
      
          startDate = datetime.strptime(startDate, '%Y-%m-%d')
          startDate = startDate.strftime ('%Y%m%d')
          
          endDate = datetime.strptime(endDate, '%Y-%m-%d')
          endDate = endDate.strftime ('%Y%m%d')
          
          
          url = url.format(startDate, endDate)
          
      
          resp = call_api(url, request_dict, True) 
                  
          return resp.json ()
      
      def get1D(startDate, endDate, nodeName, Type):
          return getData (startDate, endDate, nodeName, Type, 1)
      )
      
        • 1. Re: TabPy, Python returning Json, "Error Parsing Number"
          Nathan Mannheimer

          Hi Jonathan,

           

          It looks like your script is returning JSON as a datatype which won't work with the SCRIPT_INT calc you are using. Tableau Script calcs are designed to pull data from a visualization and return a single column at the same level of detail as that visualization. If you are returning a JSON document, you can run this script outside of Tableau and then connect to the JSON using our JSON connector.

           

          You might also look at the web data connector, which can connect to JSON and pull it into Tableau as an extract. The Extract API can also be used to pull JSON into a Tableau extract.

          • 2. Re: TabPy, Python returning Json, "Error Parsing Number"
            gaston rodriguez

            Hi Nathan, I'm currently working in some dashboard mixing Tableau and Python, I'm using NLTK to do some sentiment analysis over comments in a survey.

             

            The thing is that whatever I can get from the script as a result Tableau says

            Error processing script

            AttributeError : 'NoneType' object has no attribute 'encode'

            This is my script:

            SCRIPT_STR("

            #wordcloud

            from nltk import word_tokenize, FreqDist

            comments = _arg1

            [x.encode('utf-8') for x in comments]

            stop_words = [')','(',',','.','0','1','2','3','4','5','6','7','8','9','_','a','actualmente','acuerdo','adelante','ademas','además','adrede','afirmó','agregó','ahi','ahora','ahí','al','algo','alguna','algunas','alguno','algunos','algún','alli','allí','alrededor','ambos','ampleamos','antano','antaño','ante','anterior','antes','apenas','aproximadamente','aquel','aquella','aquellas','aquello','aquellos','aqui','aquél','aquélla','aquéllas','aquéllos','aquí','arriba','arribaabajo','aseguró','asi','así','atras','aun','aunque','ayer','añadió','aún','b','bajo','bastante','bien','breve','buen','buena','buenas','bueno','buenos','c','cada','casi','cerca','cierta','ciertas','cierto','ciertos','cinco','claro','comentó','como','con','conmigo','conocer','conseguimos','conseguir','considera','consideró','consigo','consigue','consiguen','consigues','contigo','contra','cosas','creo','cual','cuales','cualquier','cuando','cuanta','cuantas','cuanto','cuantos','cuatro','cuenta','cuál','cuáles','cuándo','cuánta','cuántas','cuánto','cuántos','cómo','d','da','dado','dan','dar','de','debajo','debe','deben','debido','decir','dejó','del','delante','demasiado','demás','dentro','deprisa','desde','despacio','despues','después','detras','detrás','dia','dias','dice','dicen','dicho','dieron','diferente','diferentes','dijeron','dijo','dio','donde','dos','durante','día','días','dónde','e','ejemplo','el','ella','ellas','ello','ellos','embargo','empleais','emplean','emplear','empleas','empleo','en','encima','encuentra','enfrente','enseguida','entonces','entre','era','erais','eramos','eran','eras','eres','es','esa','esas','ese','eso','esos','esta','estaba','estabais','estaban','estabas','estad','estada','estadas','estado','estados','estais','estamos','estan','estando','estar','estaremos','estará','estarán','estarás','estaré','estaréis','estaría','estaríais','estaríamos','estarían','estarías','estas','este','estemos','esto','estos','estoy','estuve','estuviera','estuvierais','estuvieran','estuvieras','estuvieron','estuviese','estuvieseis','estuviesen','estuvieses','estuvimos','estuviste','estuvisteis','estuviéramos','estuviésemos','estuvo','está','estábamos','estáis','están','estás','esté','estéis','estén','estés','ex','excepto','existe','existen','explicó','expresó','f','fin','final','fue','fuera','fuerais','fueran','fueras','fueron','fuese','fueseis','fuesen','fueses','fui','fuimos','fuiste','fuisteis','fuéramos','fuésemos','g','general','gran','grandes','gueno','h','ha','haber','habia','habida','habidas','habido','habidos','habiendo','habla','hablan','habremos','habrá','habrán','habrás','habré','habréis','habría','habríais','habríamos','habrían','habrías','habéis','había','habíais','habíamos','habían','habías','hace','haceis','hacemos','hacen','hacer','hacerlo','haces','hacia','haciendo','hago','han','has','hasta','hay','haya','hayamos','hayan','hayas','hayáis','he','hecho','hemos','hicieron','hizo','horas','hoy','hube','hubiera','hubierais','hubieran','hubieras','hubieron','hubiese','hubieseis','hubiesen','hubieses','hubimos','hubiste','hubisteis','hubiéramos','hubiésemos','hubo','i','igual','incluso','indicó','informo','informó','intenta','intentais','intentamos','intentan','intentar','intentas','intento','ir','j','junto','k','l','la','lado','largo','las','le','lejos','les','llegó','lleva','llevar','lo','los','luego','lugar','m','mal','manera','manifestó','mas','mayor','me','mediante','medio','mejor','mencionó','menos','menudo','mi','mia','mias','mientras','mio','mios','mis','misma','mismas','mismo','mismos','modo','momento','mucha','muchas','mucho','muchos','muy','más','mí','mía','mías','mío','míos','n','nada','nadie','ni','ninguna','ningunas','ninguno','ningunos','ningún','no','nos','nosotras','nosotros','nuestra','nuestras','nuestro','nuestros','nueva','nuevas','nuevo','nuevos','nunca','o','ocho','os','otra','otras','otro','otros','p','pais','para','parece','parte','partir','pasada','pasado','paìs','peor','pero','pesar','poca','pocas','poco','pocos','podeis','podemos','poder','podria','podriais','podriamos','podrian','podrias','podrá','podrán','podría','podrían','poner','por','por qué','porque','posible','primer','primera','primero','primeros','principalmente','pronto','propia','propias','propio','propios','proximo','próximo','próximos','pudo','pueda','puede','pueden','puedo','pues','q','qeu','que','quedó','queremos','quien','quienes','quiere','quiza','quizas','quizá','quizás','quién','quiénes','qué','r','raras','realizado','realizar','realizó','repente','respecto','s','sabe','sabeis','sabemos','saben','saber','sabes','sal','salvo','se','sea','seamos','sean','seas','segun','segunda','segundo','según','seis','ser','sera','seremos','será','serán','serás','seré','seréis','sería','seríais','seríamos','serían','serías','seáis','señaló','si','sido','siempre','siendo','siete','sigue','siguiente','sin','sino','sobre','sois','sola','solamente','solas','solo','solos','somos','son','soy','soyos','su','supuesto','sus','suya','suyas','suyo','suyos','sé','sí','sólo','t','tal','tambien','también','tampoco','tan','tanto','tarde','te','temprano','tendremos','tendrá','tendrán','tendrás','tendré','tendréis','tendría','tendríais','tendríamos','tendrían','tendrías','tened','teneis','tenemos','tener','tenga','tengamos','tengan','tengas','tengo','tengáis','tenida','tenidas','tenido','tenidos','teniendo','tenéis','tenía','teníais','teníamos','tenían','tenías','tercera','ti','tiempo','tiene','tienen','tienes','toda','todas','todavia','todavía','todo','todos','total','trabaja','trabajais','trabajamos','trabajan','trabajar','trabajas','trabajo','tras','trata','través','tres','tu','tus','tuve','tuviera','tuvierais','tuvieran','tuvieras','tuvieron','tuviese','tuvieseis','tuviesen','tuvieses','tuvimos','tuviste','tuvisteis','tuviéramos','tuviésemos','tuvo','tuya','tuyas','tuyo','tuyos','tú','u','ultimo','un','una','unas','uno','unos','usa','usais','usamos','usan','usar','usas','uso','usted','ustedes','v','va','vais','valor','vamos','van','varias','varios','vaya','veces','ver','verdad','verdadera','verdadero','vez','vosotras','vosotros','voy','vuestra','vuestras','vuestro','vuestros','w','x','y','ya','yo','z','él','éramos','ésa','ésas','ése','ésos','ésta','éstas','éste','éstos','última','últimas','último','últimos']

            text = []

            for comment in comments:

                frases = word_tokenize(comment)

                for word in sentences:

                    if word.lower() not in stop_words:

                        text.append(word.lower())

                        [y.encode('utf-8') for y in sentences]

                        return word.lower()

            ",

            ATTR([Comments]))

             

            I'm looking forward to your help

             

            Best regards

            • 3. Re: TabPy, Python returning Json, "Error Parsing Number"
              Nathan Mannheimer

              Hi Gaston,

               

              This error usually comes from the variables not being passed correctly or attempting to apply a method to an empty variable.

               

              In this case it looks like y is empty when you try and encode it. Just glancing at this code I'm not seeing the variable sentences get created which may lead to the problem. you will also need to have each comment on your view in Tableau so that ATTR(Comments) returns the text of the comment. If the row level comments aren't in the view, and there are multiple comments per mark, ATTR will return an * instead of the text of the comment, because text doesn't aggregate.

               

              Sincerely,

              Nathan