code: def test_string_isnull(self, mv):
      class C(Classifier):
          dtype = categorical_dtype
          missing_value = mv
          inputs = ()
          window_length = 0
  
      c = C()
  
      # There's no significance to the values here other than that they
      # contain a mix of missing and non-missing values.
      raw = np.asarray(
          [
              ["", "a", "ab", "ba"],
              ["z", "ab", "a", "ab"],
              ["aa", "ab", "", "ab"],
              ["aa", "a", "ba", "ba"],
          ],
          dtype=categorical_dtype,
      )
      data = LabelArray(raw, missing_value=mv)
  
      self.check_terms(
          terms={"isnull": c.isnull(), "notnull": c.notnull()},
          expected={
              "isnull": np.equal(raw, mv),
              "notnull": np.not_equal(raw, mv),
          },
          initial_workspace={c: data},
          mask=self.build_mask(self.ones_mask(shape=data.shape)),
      )
  
imports: from functools import reduce
  import operator
  import numpy
  import pandas
  from zipline.lib.labelarray import LabelArray
  from zipline.pipeline import Classifier
  from zipline.pipeline.data.testing import TestingDataSet
  from zipline.pipeline.expression import methods_to_ops
  from zipline.testing import parameter_space
  from zipline.testing.fixtures import ZiplineTestCase
  from zipline.testing.predicates import assert_equal
  from zipline.utils.numpy_utils import categorical_dtype, int64_dtype
  from .base import BaseUSEquityPipelineTestCase
label_desc: Use image node_id 2 for calling the ClassifierTestCase obj's underlying member method code with example usage: obj.test_string_isnull(mv) without return types