code: def serialize(df, measurement, tag_columns=None, **extra_tags) -> bytes:
      if measurement is None:
          raise ValueError("Missing 'measurement'")
      if not isinstance(df.index, pd.DatetimeIndex):
          raise ValueError('DataFrame index is not DatetimeIndex')
      tag_columns = set(tag_columns or [])
      isnull = df.isnull().any(axis=1)
      tags = []
      fields = []
      for k, v in extra_tags.items():
          tags.append(f"{k}={escape(v, key_escape)}")
      for i, (k, v) in enumerate(df.dtypes.items()):
          k = k.translate(key_escape)
          if k in tag_columns:
              tags.append(f"{k}={{p[{i+1}]}}")
          elif issubclass(v.type, np.integer):
              fields.append(f"{k}={{p[{i+1}]}}i")
          elif issubclass(v.type, (np.float, np.bool_)):
              fields.append(f"{k}={{p[{i+1}]}}")
          else:
              fields.append(f"{k}=\"{{p[{i+1}]}}\"")
      fmt = (f'{measurement}', f'{"," if tags else ""}', ','.join(tags),
             ' ', ','.join(fields), ' {p[0].value}')
      f = eval("lambda p: f'{}'".format(''.join(fmt)))
      if isnull.any():
          lp = map(f, _itertuples(df[~isnull]))
          rep = _replace(df)
          lp_nan = (reduce(lambda a, b: re.sub(*b, a), rep, f(p))
                    for p in _itertuples(df[isnull]))
          return '\n'.join(chain(lp, lp_nan)).encode('utf-8')
      else:
          return '\n'.join(map(f, _itertuples(df))).encode('utf-8')