code: def test_to_dictionary_groupby_trans(es):
      primitive = Negate()
      id_feat = Feature(es["log"].ww["product_id"])
      groupby_feature = Feature(
          es["log"].ww["value"],
          primitive=primitive,
          groupby=id_feat,
      )
  
      expected = {
          "type": "GroupByTransformFeature",
          "dependencies": ["log: value", "log: product_id"],
          "arguments": {
              "name": "-(value) by product_id",
              "base_features": ["log: value"],
              "primitive": primitive,
              "groupby": "log: product_id",
          },
      }
  
      assert expected == groupby_feature.to_dictionary()
  
imports: import os.path
  import re
  import pytest
  from pympler.asizeof import asizeof
  from woodwork.column_schema import ColumnSchema
  from woodwork.logical_types import Datetime, Integer
  from featuretools import Feature, config, feature_base
  from featuretools.feature_base import IdentityFeature
  from featuretools.primitives import Count, Diff, Last, Mode, Negate, NMostCommon, NumUnique, Sum, TransformPrimitive
  from featuretools.synthesis.deep_feature_synthesis import can_stack_primitive_on_inputs
  from featuretools.tests.testing_utils import check_rename
label_desc: Use image node_id 17 for calling a global function with example usage: test_to_dictionary_groupby_trans(es) without return types