docs: def load_feather(protein_feather, length_filter_pid=None, copynum_scale=False, copynum_df=None):
      """Load a feather of amino acid counts for a protein.
  
      Args:
          protein_feather (str): path to feather file
          copynum_scale (bool): if counts should be multiplied by protein copy number
          copynum_df (DataFrame): DataFrame of copy numbers
  
      Returns:
          DataFrame: of counts with some aggregated together
  
      """
      protein_df = pd.read_feather(protein_feather).set_index('index')
  
      # Combine counts for residue groups
      from ssbio.protein.sequence.properties.residues import _aa_property_dict_one, EXTENDED_AA_PROPERTY_DICT_ONE
      aggregators = {
          'aa_count_bulk'    : {'residues': EXTENDED_AA_PROPERTY_DICT_ONE['Bulky'],
                                'subseqs' : ['metal_2_5D', 'metal_3D']},
          'aa_count_carb'    : {'residues': EXTENDED_AA_PROPERTY_DICT_ONE['Carbonylation susceptible'],
                                'subseqs' : ['metal_2_5D', 'metal_3D', 'acc_2D', 'acc_3D', 'surface_3D']},
          'aa_count_chrg'    : {'residues': _aa_property_dict_one['Charged'],
                                'subseqs' : ['metal_2_5D', 'metal_3D', 'csa_2_5D', 'sites_2_5D', 'acc_2D', 'acc_3D',
                                             'surface_3D']},
          'aa_count_poschrg' : {'residues': _aa_property_dict_one['Basic'],
                                'subseqs' : ['metal_2_5D', 'metal_3D', 'acc_2D', 'acc_3D', 'surface_3D']},
          'aa_count_negchrg' : {'residues': _aa_property_dict_one['Acidic'],
                                'subseqs' : ['metal_2_5D', 'metal_3D', 'acc_2D', 'acc_3D', 'surface_3D']},
          'aa_count_tmstab'  : {'residues': EXTENDED_AA_PROPERTY_DICT_ONE['TM stabilizing'],
                                'subseqs' : ['tm_2D', 'tm_3D']},
          'aa_count_tmunstab': {'residues': EXTENDED_AA_PROPERTY_DICT_ONE['TM to Thr stabilizing'],
                                'subseqs' : ['tm_2D', 'tm_3D']},
          'aa_count_dis'     : {'residues': EXTENDED_AA_PROPERTY_DICT_ONE['Disorder promoting'],
                                'subseqs' : ['disorder_2D', 'ss_disorder_2D', 'disorder_3D', 'ss_disorder_3D',
                                             'dna_2_5D']},
          'aa_count_ord'     : {'residues': EXTENDED_AA_PROPERTY_DICT_ONE['Order promoting'],
                                'subseqs' : ['disorder_2D', 'ss_disorder_2D', 'disorder_3D', 'ss_disorder_3D',
                                             'dna_2_5D']}}
  
      # Do combination counts for all types of subsequences
      for suffix, info in aggregators.items():
          agg_residues = info['residues']
          for prefix in info['subseqs']:
              to_add_idxes = []
              for agg_res in agg_residues:
                  to_add_idx = prefix + '_aa_count_' + agg_res
                  if to_add_idx in protein_df.index:
                      to_add_idxes.append(to_add_idx)
              subseq_agged_col = protein_df.loc[to_add_idxes, :].sum()  # Add each residue series
              protein_df.loc[prefix + '_' + suffix] = subseq_agged_col  # Append to df
  
      ## REMOVE OTHER STRAINS WITH DELETIONS (use float -- length_filter_pid=0.8 to get only strains with >80% length
      ## alternative to atlas2.calculate_residue_counts_perstrain wt_pid_cutoff param -- works a little differently just considering length
      if length_filter_pid:
          keep_cols = protein_df.loc['aa_count_total'][protein_df.loc['aa_count_total'] > protein_df.at['aa_count_total', 'K12'] * length_filter_pid].index
          protein_df = protein_df[keep_cols]
  
      # Multiply by proteomics copy number?
      if copynum_scale:
          if not isinstance(copynum_df, pd.DataFrame):
              raise ValueError('Please supply copy numbers')
          protein_id = op.basename(protein_feather).split('_protein')[0]
          if protein_id in copynum_df.index:
              copynum = copynum_df.at[protein_id, 'copynum']
              if copynum > 0:  # TODO: currently keeping one copy of proteins with 0, is that ok?
                  protein_df = protein_df * copynum
  
      return protein_df