docs: def dqdv_cycles(cycles, **kwargs):
      """Convenience functions for creating dq-dv data from given capacity and
      voltage cycles.
  
      Returns a DataFrame with a 'voltage' and a 'incremental_capacity'
      column.
  
          Args:
              cycles (pandas.DataFrame): the cycle data ('cycle', 'voltage',
                   'capacity', 'direction' (1 or -1)).
  
          Returns:
              pandas.DataFrame with columns 'cycle', 'voltage', 'dq'.
  
          Example:
              >>> cycles_df = my_data.get_cap(
              >>> ...   categorical_column=True,
              >>> ...   method = "forth-and-forth",
              >>> ...   label_cycle_number=True,
              >>> ... )
              >>> ica_df = ica.dqdv_cycles(cycles_df)
  
      """
  
      # TODO: should add option for normalising based on first cycle capacity
      # this is e.g. done by first finding the first cycle capacity (nom_cap)
      # (or use nominal capacity given as input) and then propagating this to
      # Converter using the key-word arguments
      #   normalize=True, normalization_factor=1.0, normalization_roof=nom_cap
  
      ica_dfs = list()
      cycle_group = cycles.groupby("cycle")
      for cycle_number, cycle in cycle_group:
  
          v, dq = dqdv_cycle(cycle, splitter=True, **kwargs)
          _ica_df = pd.DataFrame(
              {
                  "voltage": v,
                  "dq": dq,
              }
          )
          _ica_df["cycle"] = cycle_number
          _ica_df = _ica_df[['cycle', 'voltage', 'dq']]
          ica_dfs.append(_ica_df)
  
      ica_df = pd.concat(ica_dfs)
      return ica_df