code: def test_multiplicative_adjustments(
      self,
      name,
      data,
      lookback,
      adjustments,
      missing_value,
      perspective_offset,
      expected,
  ):
      array = AdjustedArray(data, NOMASK, adjustments, missing_value)
      for _ in range(
          2
      ):  # Iterate 2x ensure adjusted_arrays are re-usable.
          window_iter = array.traverse(
              lookback,
              perspective_offset=perspective_offset,
          )
          for yielded, expected_yield in zip_longest(
              window_iter, expected
          ):
              check_arrays(yielded, expected_yield)
  
imports: from collections import namedtuple
  from itertools import chain, product
  from textwrap import dedent
  from unittest import TestCase
  from nose_parameterized import parameterized
  from numpy import arange, array, asarray, dtype, full, where
  from six.moves import zip_longest
  from toolz import curry
  from catalyst.errors import WindowLengthNotPositive, WindowLengthTooLong
  from catalyst.lib.adjustment import Datetime64Overwrite, Datetime641DArrayOverwrite, Float64Multiply, Float64Overwrite, Float641DArrayOverwrite, Int64Overwrite, ObjectOverwrite
  from catalyst.lib.adjusted_array import AdjustedArray, NOMASK
  from catalyst.lib.labelarray import LabelArray
  from catalyst.testing import check_arrays, parameter_space
  from catalyst.utils.compat import unicode
  from catalyst.utils.numpy_utils import coerce_to_dtype, datetime64ns_dtype, default_missing_value_for_dtype, float64_dtype, int64_dtype, object_dtype
label_desc: Use image node_id 2 for calling the AdjustedArrayTestCase obj's underlying member method code with example usage: obj.test_multiplicative_adjustments(name, data, lookback, adjustments, missing_value, perspective_offset, expected) without return types