Получение статистики из группы экземпляров в python

#python #pandas #numpy #class #statistics

Вопрос:

Я провожу некоторый анализ данных с помощью python. У меня есть несколько точек данных (~300), где каждая точка имеет свои собственные глобальные свойства (значения int или float) и значения сетки (т. Е. массив с 4 столбцами). Чтобы облегчить чтение, обработку и анализ каждой точки, я создал класс следующим образом (это минимальный пример). :

 class SimulationPoint:  def __init__(self, path, scalar1, scalar2):  self.scalar1 = scalar1  self.mesh = pd.read_csv(path 'mesh.csv')   def normalize_input(self):  return func1(self.scalar1)   def spot_centers(self, nbr_spots=5):  points_mesh = self.mesh[self.mesh.value gt;= self.mesh.value.quantile(0.9)].copy()  xyz_mesh = points_mesh.drop(['value'], axis=1).to_numpy()  result = func2(xyz_mesh, n_clusters=nbr_spots)  return result  

Поэтому мой вопрос в том, есть ли какой-то простой способ получить статистику из нескольких экземпляров этого класса ? Например, постройте гистограмму или получите базовую статистику (среднее значение, стандартное отклонение, эксцесс и т. Д.).

На данный момент мое решение заключается в следующем :

 # Read data into dict. path = '../path_to_data/' full_data = {} for dp in os.listdir(path):  dp_path = os.path.join(path,dp)  full_data[dp] = SimulationPoint(dp_path) # Loop over dict values. for key in full_data.keys() :  x = full_data[key].normalize_input()  

Мне было интересно, есть ли более элегантный/эффективный/(место полезного слова) для этого ?

P.S. У меня есть больше методов/атрибутов для класса, поэтому я решил его создать. Кстати, я новичок в ООП, не стесняйтесь более широко комментировать реализацию кода.

Спасибо!

Ответ №1:

Я склонен отдавать предпочтение pathlib os.listdir и т. Д. Кроме того, иногда понимание списка или понимание словаря создает аккуратный код. Наконец, вы можете рассмотреть возможность перебора пар «ключ-значение» с использованием dict.items() .

Как и в вопросе, я на самом деле не запускал приведенный ниже код, но что-то в этом роде может сделать то же самое, что и в примере в вопросе.

 from pathlib import Path  path = Path("../path_to_data")  full_data = {file.stem: SimulationPoint(file) for file in path.iterdir()}  normed = {k: data.normalize_input() for k, data in full_data.items()}  

Комментарии:

1. Есть ли какая-то особая причина для выбора pathlib os.listdir ?

2. Я нахожу это в целом проще и интуитивно понятнее, особенно возможность использовать оператор «/» для построения путей, например Path(myStartPath) / "subfolder" / "file.txt" .