code: def load_finger_tapping_cloudupdrs_data(filename, convert_times=1000.0):
      
      data_m = np.genfromtxt(filename, delimiter=',', invalid_raise=False, skip_footer=1)
      date_times = pd.to_datetime((data_m[:, 0] - data_m[0, 0]))
      time_difference = (data_m[:, 0] - data_m[0, 0]) / convert_times
      data = {'td': time_difference, 'action_type': data_m[:, 2],'x': data_m[:, 3], 'y': data_m[:, 4],
              'x_target': data_m[:, 7], 'y_target': data_m[:, 8]}
      data_frame = pd.DataFrame(data, index=date_times, columns=['td', 'action_type','x', 'y', 'x_target', 'y_target'])
      return data_frame
docs: This method loads data in the cloudupdrs format for the finger tapping processor
  
          Usually the data will be saved in a csv file and it should look like this:
  
          .. code-block:: json
  
           timestamp_0, . , action_type_0, x_0, y_0, . , . , x_target_0, y_target_0
           timestamp_1, . , action_type_1, x_1, y_1, . , . , x_target_1, y_target_1
           timestamp_2, . , action_type_2, x_2, y_2, . , . , x_target_2, y_target_2
           .
           .
           .
           timestamp_n, . , action_type_n, x_n, y_n, . , . , x_target_n, y_target_n
  
          where data_frame.x, data_frame.y: components of tapping position. data_frame.x_target,
          data_frame.y_target their target.
  
          :param filename: The path to load data from
          :type filename: string
          :param convert_times: Convert times. The default is from from milliseconds to seconds.
          :type convert_times: float