class_docstr: Convert evaluate result json to DataFrame for report generator,
  and analysis model robustness according to linguistic classification.
  
  Example::
  
      {
          "model_name": "BERT",
          "dataset_name": "medical data",
          "transformation": {
              "Case": {
                  "ori_precision": 0.70,
                  "trans_precision": 0.65,
                  "ori_f1": 0.63,
                  "trans_f1": 0.60,
                  "size": 5000,
              },
              "Ocr": {
                  "ori_precision": 0.72,
                  "trans_precision": 0.43,
                  "ori_f1": 0.62,
                  "trans_f1": 0.41,
                  "size": 5000,
              }
          },
          "subpopulation": {
              "LengthLengthSubPopulation-0.0-0.1": {
                  "trans_precision": 0.68,
                  "trans_f1": 0.63,
                  "size": 500
              }
          },
          "attack": {
              "Bert-Attack": {
                  "ori_precision": 0.72,
                  "trans_precision": 0.43,
                  "ori_f1": 0.62,
                  "trans_f1": 0.41,
                  "size": 400,
              }
          }
      }
docstr: Parsing evaluation result and calculate linguistic robustness scores.
  
  :param dict evaluate_json: evaluate result of specific model.
  :return: pandas.DataFrame
docstr_tok: ["Parsing","evaluation","result","and","calculate","linguistic","robustness","scores",".",":","param","dict","evaluate_json",":","evaluate","result","of","specific","model",".",":","return",":","pandas.DataFrame"]
code: def json_to_linguistic_radar(evaluate_json):
      r"""
      Parsing evaluation result and calculate linguistic robustness scores.
  
      :param dict evaluate_json: evaluate result of specific model.
      :return: pandas.DataFrame
  
      """
      if "transformation" not in evaluate_json:
          logger.info(
              (
                  "Cant find transformation in given json, "
                  "skip linguistic radar report generation!"
              )
          )
          return None
  
      transformations = evaluate_json["transformation"]
      scores = {category_type: [] for category_type in CATEGORY}
  
      for transformation in transformations:
          score = Analyzer.radar_score(transformations[transformation])
          is_record = False
          # transformation not in current category is considered as other type
          for category_type in CATEGORY:
              if transformation in CATEGORY[category_type]:
                  scores[category_type].append(score)
                  is_record = True
                  break
          if not is_record:
              scores["Other"].append(score)
  
      for score in scores:
          if scores[score]:
              scores[score] = (
                  1
                  - reduce(lambda x, y: x + y, scores[score])
                  / len(scores[score])
              ) * 5
          else:
              scores[score] = 5
  
      return pd.DataFrame(
          dict(r=list(scores.values()), theta=list(scores.keys()))
      )
  
imports: import pandas
  import numpy
  from functools import reduce
  from copy import deepcopy
  from collections import OrderedDict
  from ...common.utils import logger
label_desc: Use image node_id 5 for calling the Analyzer obj's underlying member method code with example usage: obj.json_to_linguistic_radar(evaluate_json) and returns: pd, None