code: def process(self, raw_obs):
      obs = raw_obs.to_dict()
  
      loads = []
      for key in obs["loads"]:
          loads.append(obs["loads"][key])
      loads = np.concatenate(loads)
  
      prods = []
      for key in obs["prods"]:
          prods.append(obs["prods"][key])
      prods = np.concatenate(prods)
  
      lines_or = []
      for key in obs["lines_or"]:
          lines_or.append(obs["lines_or"][key])
      lines_or = np.concatenate(lines_or)
  
      lines_ex = []
      for key in obs["lines_ex"]:
          lines_ex.append(obs["lines_ex"][key])
      lines_ex = np.concatenate(lines_ex)
  
      features = np.concatenate([loads, prods, lines_or, lines_ex])
      features = np.array(
          [
              features[i]
              for i in range(len(features))
              if i not in self.zero_std
          ]
      )
      norm_features = (features - self.mean) / self.std
  
      rho = obs["rho"] - 1.0
  
      other_features = rho
      return np.concatenate([norm_features, other_features]).tolist()
  
file_path: PARL/benchmark/torch/NeurIPS2020-Learning-to-Run-a-Power-Network-Challenge/track1/utils.py
imports: import numpy
label_desc: Use image node_id 2 for calling the FeatureProcessor obj's underlying member method code with example usage: obj.process(raw_obs) and returns: np