def removeLabels(self, start=None, end=None, labelFilter=None):
    """
    Remove labels from each record with record ROWID in range from
    start to end, noninclusive of end. Removes all records if labelFilter is
    None, otherwise only removes the labels eqaul to labelFilter.

    This will recalculate all points from end to the last record stored in the
    internal cache of this classifier.
    """

    if len(self.saved_states) == 0:
      raise CLAModelInvalidRangeError("Invalid supplied range for "
        "'removeLabels'. Model has no saved records.")

    startID = self.saved_states[0].ROWID

    clippedStart = 0 if start is None else max(0, start - startID)
    clippedEnd = len(self.saved_states) if end is None else \
      max(0, min( len( self.saved_states) , end - startID))

    if clippedEnd <= clippedStart:
      raise CLAModelInvalidRangeError("Invalid supplied range for "
        "'removeLabels'.", debugInfo={
          'requestRange': {
            'startRecordID': start,
            'endRecordID': end
          },
          'clippedRequestRange': {
            'startRecordID': clippedStart,
            'endRecordID': clippedEnd
          },
          'validRange': {
            'startRecordID': startID,
            'endRecordID': self.saved_states[len(self.saved_states)-1].ROWID
          },
          'numRecordsStored': len(self.saved_states)
        })

    # Remove records within the cache
    recordsToDelete = []
    for state in self.saved_states[clippedStart:clippedEnd]:
      if labelFilter is not None:
        if labelFilter in state.anomalyLabel:
          state.anomalyLabel.remove(labelFilter)
      else:
        state.anomalyLabel = []
      state.setByUser = False
      recordsToDelete.append(state)
    self._deleteRecordsFromKNN(recordsToDelete)

    # Remove records not in cache
    self._deleteRangeFromKNN(start, end)

    # Recompute [clippedEnd, ...)
    for state in self.saved_states[clippedEnd:]:
      self._updateState(state)

    return {'status': 'success'}
Esempio n. 2
0
  def addLabel(self, start, end, labelName):
    """
    Add the label labelName to each record with record ROWID in range from
    start to end, noninclusive of end.

    This will recalculate all points from end to the last record stored in the
    internal cache of this classifier.
    """
    if len(self._recordsCache) == 0:
      raise CLAModelInvalidRangeError("Invalid supplied range for 'addLabel'. "
        "Model has no saved records.")

    try:
      start = int(start)
    except Exception:
      start = 0

    try:
      end = int(end)
    except Exception:
      end = int(self._recordsCache[-1].ROWID)

    startID = self._recordsCache[0].ROWID

    clippedStart = max(0, start - startID)
    clippedEnd = max(0, min( len( self._recordsCache) , end - startID))

    if clippedEnd <= clippedStart:
      raise CLAModelInvalidRangeError("Invalid supplied range for 'addLabel'.",
        debugInfo={
          'requestRange': {
            'startRecordID': start,
            'endRecordID': end
          },
          'clippedRequestRange': {
            'startRecordID': clippedStart,
            'endRecordID': clippedEnd
          },
          'validRange': {
            'startRecordID': startID,
            'endRecordID': self._recordsCache[len(self._recordsCache)-1].ROWID
          },
          'numRecordsStored': len(self._recordsCache)
        })

    # Add label to range [clippedStart, clippedEnd)
    for state in self._recordsCache[clippedStart:clippedEnd]:
      if labelName not in state.anomalyLabel:
        state.anomalyLabel.append(labelName)
        state.setByUser = True
        self._addRecordToKNN(state)

    assert len(self.saved_categories) > 0

    # Recompute [end, ...)
    for state in self._recordsCache[clippedEnd:]:
      self.classifyState(state)
Esempio n. 3
0
    def getLabels(self, start=None, end=None):
        """
    Get the labels on classified points within range start to end. Not inclusive
    of end.

    reval - dict of format:

      {
        'isProcessing': boolean,
        'recordLabels': list of results
      }

      isProcessing - currently always false as recalculation blocks; used if
        reprocessing of records is still being performed;

      Each item in recordLabels is of format:
      {
        'ROWID': id of the row,
        'labels': list of strings
      }

    """
        if len(self._recordsCache) == 0:
            return {'isProcessing': False, 'recordLabels': []}
        try:
            start = int(start)
        except Exception:
            start = 0

        try:
            end = int(end)
        except Exception:
            end = self._recordsCache[-1].ROWID

        if end <= start:
            raise CLAModelInvalidRangeError(
                "Invalid supplied range for 'getLabels'.",
                debugInfo={
                    'requestRange': {
                        'startRecordID': start,
                        'endRecordID': end
                    },
                    'numRecordsStored': len(self._recordsCache)
                })

        results = {'isProcessing': False, 'recordLabels': []}

        ROWIDX = numpy.array(
            self._knnclassifier.getParameter('categoryRecencyList'))
        validIdx = numpy.where((ROWIDX >= start) & (ROWIDX < end))[0].tolist()
        categories = self._knnclassifier.getCategoryList()
        for idx in validIdx:
            row = dict(ROWID=int(ROWIDX[idx]),
                       labels=self._categoryToLabelList(categories[idx]))
            results['recordLabels'].append(row)

        return results
  def getLabels(self, start=None, end=None):
    if len(self.saved_states) == 0:
      return {
        'isProcessing': False,
        'recordLabels': []
      }

    if start is None:
      start = 0

    if end is None:
      end = self.saved_states[-1].ROWID

    if end <= start:
      raise CLAModelInvalidRangeError("Invalid supplied range for 'getLabels'.",
        debugInfo={
          'requestRange': {
            'startRecordID': start,
            'endRecordID': end
          },
          'numRecordsStored': len(self.saved_states)
        })

    results = {
      'isProcessing': False,
      'recordLabels': []
    }

    classifier = self.clamodel._getAnomalyClassifier()
    knn = classifier.getSelf()._knn

    ROWIDX = numpy.array(
      classifier.getSelf().getParameter('categoryRecencyList'))
    validIdx = numpy.where((ROWIDX >= start) & (ROWIDX < end))[0].tolist()
    categories = knn._categoryList
    for idx in validIdx:
      row = dict(
        ROWID=int(ROWIDX[idx]),
        labels=self._categoryToLabelList(categories[idx]))
      results['recordLabels'].append(row)

    return results