average_wavemode_measures.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import argparse
  2. import pandas as pd
  3. import numpy as np
  4. import sys
  5. from pathlib import Path
  6. sys.path.append(str(Path.cwd().parents[0] / 'plot_figures' / 'scripts'))
  7. from plotting_utils import df_dtypes, int_types, float_types
  8. def load_df(path, usecols=[]):
  9. df = pd.read_csv(path,
  10. usecols=lambda c: c in set(int_types+float_types+usecols),
  11. dtype=df_dtypes)
  12. df.drop(df.columns[df.columns.str.contains('unnamed', case=False)],
  13. axis=1, inplace=True)
  14. return df
  15. def normalize_direction(df, direction_key='direction'):
  16. direction_columns = [col.strip('_x') for col in df.columns \
  17. if (direction_key in col) \
  18. and ('_x' in col) \
  19. and not ('_std' in col)]
  20. for key in direction_columns:
  21. direction = df[f'{key}_x'] + 1j*df[f'{key}_y']
  22. direction /= np.abs(direction)
  23. df[f'{key}_x'] = np.real(direction)
  24. df[f'{key}_y'] = np.imag(direction)
  25. return df
  26. if __name__ == '__main__':
  27. CLI = argparse.ArgumentParser(description=__doc__,
  28. formatter_class=argparse.RawDescriptionHelpFormatter)
  29. CLI.add_argument("--dataframe", nargs='?', type=Path, required=True,
  30. help="path to input data in neo format")
  31. CLI.add_argument("--output", nargs='?', type=Path, required=True,
  32. help="path of output file")
  33. args, unknown = CLI.parse_known_args()
  34. groupby = ['profile', 'wavemode', 'technique', 'anesthetic', 'model_type'] #, 'disease_model']
  35. df = load_df(args.dataframe, usecols=groupby)
  36. df = normalize_direction(df)
  37. if 'channel-wise' in str(args.dataframe):
  38. groupby += ['channel_id', 'x_coords', 'y_coords']
  39. if 'disease_model' in df.columns:
  40. df.disease_model.fillna('None', inplace=True)
  41. groupby += ['disease_model']
  42. avg_df = df.groupby(groupby, as_index=False, observed=True, dropna=False).mean()
  43. if 'disease_model' in df.columns:
  44. avg_df['disease_model'].replace({'None': None}, inplace =True)
  45. avg_df.to_csv(args.output)