Вложенный массив numpy против мультииндекса, какая структура данных и пакет Python кажутся наиболее подходящими?

Я уже давно ломаю голову, и у меня возникли проблемы с выяснением того, какой пакет python действительно может делать то, что мне нужно, в относительно оптимизированном деле.

Я пытаюсь работать с большим количеством небольших наборов данных, и мне нужно иметь возможность обрабатывать их на различных графиках, которые включают различные комбинации этих наборов данных, а также выполнять небольшую обработку отдельных наборов данных.

Данные, можно сказать, многомерные. Тем не менее, некоторые из этих параметров по сути являются единичными значениями.

Чтобы объяснить мои данные. Это спектроскопические данные. У меня есть несколько устройств (одно измерение), я измерил количество в зависимости от длины волны. Таким образом, данные представляют собой два столбца (длина волны, количество), где каждая строка представляет собой длину волны и количество. Я могу обработать эти данные, чтобы добавить базовый уровень и разницу между базовыми данными и данными подсчета (2 измерения). Есть некоторые метаданные, которые можно игнорировать. Для каждого устройства я взял эти спектроскопические данные при разных условиях, разной мощности, разной температуре и т. д. (По крайней мере, еще одно измерение?).

Каждый спектр находится в отдельном файле. Есть сотни устройств, я могу сделать 20 конфигураций питания на каждом устройстве. Я могу сделать пару температурных конфигураций при определенных мощностях, но не на всех мощностях. Для разных устройств конфигурации питания не будут одинаковыми. Некоторые спектры не будут сниматься на спектрометре с той же центральной длиной волны, что и другие на устройствах. Здесь я хочу отметить единственное, что гарантировано, - это размеры файла спектров (1024, 2) или (1024, 4) после обработки.

Каждое имя файла содержит дополнительную информацию, относящуюся к конфигурации набора данных, которую я буду анализировать при импорте данных.

Как я могу обрабатывать данные. Моя обработка данных вращается вокруг построения графика зависимости длины волны от скорости счета для различных конфигураций (мощность, температура и т. д.). В данных есть пики, которые я обнаружу. Возможно, я захочу построить график скорости счета определенных длин волн в зависимости от конфигураций (мощность, температура) и т. д. Как правило, я хочу рисовать только одно устройство за раз, но из-за большого количества файлов, с которыми я имею дело, Я хотел бы иметь возможность принимать данные, выполнять соответствующую общую обработку и строить графики за один раз. И я не в состоянии каждый раз вручную определять структуры и данные.

Я рассмотрел попытки использовать numpy, pandas и xarray, и мне интересно, может ли какой-либо из них эффективно обрабатывать данные (по крайней мере, в текущем формате).

Я мог бы вложить массив numpy, содержащий спектроскопические данные, в другой массив numpy, который содержит информацию об устройстве, мощности и температуре. Помимо того, что это может быть немного громоздко, я в основном этим и занимался до сих пор. Таким образом, массив будет выглядеть примерно так (устройство, мощность, температура, спектры), где спектры будут другим массивом numpy (длина волны, спектры, базовая линия, разница).

Я изучал использование pandas (я не знаком с pandas), и из моего чтения кажется, что вложение (хотя возможно Панды: вложение фреймов данных) не является хорошей идеей Pandas: хранение объекта DataFrame внутри другого DataFrame, то есть вложенного DataFrame, и я должен использовать мультииндекс. Хотя, просматривая учебники https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html для pandas, я не могу сказать, что понимаю, как можно построить мультииндекс из имеющихся у меня данных. Я не уверен, что один объект может вместить все данные.

Вот кое-что, что я пытался. По сути, функция считывает список файлов csv спектров для одного устройства с разной мощностью. Добавьте дополнительную информацию о конфигурации в каждую строку, а затем объедините оба результата в один фрейм данных с помощью функции concat и преобразуйте в мультииндекс.

powers = [53,62]    
def importspectra(spectrafile):
    frames = []
    for n in range(0, len(spectrafiles)):
        data = pd.read_csv(spectrafile[n], names=["wavelength", "counts"], skiprows=37)
        data['device'] = "R2C7"
        data['power']=powers[n]
        frames.append(data)
    frames = pd.concat(frames)
    return pd.MultiIndex.from_frame(frames)

Теперь я подумал, что смогу отсортировать или выбрать подмножество данных, например df ['R2C7'].

data
Out[4]: 
MultiIndex([(900.45203,   2, 'R2C7', 53),
            (900.52997,   6, 'R2C7', 53),
            (900.60785,   5, 'R2C7', 53),
            (900.68579,   5, 'R2C7', 53),
            (900.76367,   4, 'R2C7', 53),
            (900.84161,   2, 'R2C7', 53),
            (900.91949,   5, 'R2C7', 53),
            (900.99738,  16, 'R2C7', 53),
            (901.07532,  18, 'R2C7', 53),
            ( 901.1532,  14, 'R2C7', 53),
            ...
            (978.35303, 119, 'R2C7', 62),
            (978.42871, 127, 'R2C7', 62),
            (978.50433, 125, 'R2C7', 62),
            (978.57996, 102, 'R2C7', 62),
            (978.65552, 102, 'R2C7', 62),
            (978.73114, 121, 'R2C7', 62),
            (978.80676, 124, 'R2C7', 62),
            (978.88239, 145, 'R2C7', 62),
            (978.95801, 188, 'R2C7', 62),
            (979.03363, 123, 'R2C7', 62)],
           names=['wavelength', 'counts', 'device', 'power'], length=2048)
data["R2C7"]
Traceback (most recent call last):
  File "C:\Users\corih\.conda\envs\py39\lib\site-packages\IPython\core\interactiveshell.py", line 3437, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-5-4342b05204a9>", line 1, in <module>
    data["R2C7"]
  File "C:\Users\corih\.conda\envs\py39\lib\site-packages\pandas\core\indexes\multi.py", line 2028, in __getitem__
    if level_codes[key] == -1:
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

Но ясно, что это не работает ..

Кроме того, я посмотрел на использование xarray (опять же, я не знаком), и у меня есть проблемы, похожие на pandas. Я не уверен, как создать объект xarray из имеющихся у меня данных.

Есть лучший способ это сделать? Или я трачу свое время на массивы более высокой размерности

Любые предложения будут высоко ценится.

Существует два основных формата данных: многомерный числовой тип ndarray и списки ссылок на объекты. Массивы object dtype и серии / фреймы pandas похожи на списки (с точки зрения использования памяти и скорости). Существует также структурированный массив, который чаще всего создается genfromtxt из csv.

hpaulj 30.03.2021 00:49
pandas хранит свои данные (и индексы) в массивах numpy. Сколько будет зависеть от dtypes столбцов и, возможно, индексации. Простой фрейм данных с однородным dtype может хранить все значения в одном 2d-массиве. Когда я смотрел фреймы с разными типами dtypes, оказалось, что столбцы сгруппированы по dtype. Я не знаю, как он обрабатывает многоиндексирование.
hpaulj 30.03.2021 02:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
27
1

Ответы 1

Не уверен, правильно ли я понимаю проблему, но data["R2C7"] не будет работать, потому что вы назвали столбец «устройство». Если вы хотите получить все строки, в которых использовалось устройство «R2C7», вам необходимо написать следующее:

print(data.loc[data['device'] == 'R2C7'])

Вот ссылка на другой пост, где это подробно объясняется.

Я думаю, что панды помогут вам. Просто продолжай пытаться. Становится легче.

Поэтому, когда я пытаюсь это сделать, я получаю AttributeError: 'MultiIndex' object has no attribute 'loc', что странно, потому что он предлагает здесь pandas.pydata.org/pandas-docs/stable/user_guide/advanced.htm‌ l, что .loc должен работать так, как вы предлагали ...

Stealthbird97 30.03.2021 01:49

может быть, проверьте версию pandas, которую вы используете?

mingaflo 30.03.2021 11:38

У меня pandas 1.2.3 py39hf11a4ad_0

Stealthbird97 31.03.2021 00:20

Другие вопросы по теме