#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"
.