Я уже давно ломаю голову, и у меня возникли проблемы с выяснением того, какой пакет 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 из имеющихся у меня данных.
Есть лучший способ это сделать? Или я трачу свое время на массивы более высокой размерности
Любые предложения будут высоко ценится.
pandas хранит свои данные (и индексы) в массивах numpy. Сколько будет зависеть от dtypes столбцов и, возможно, индексации. Простой фрейм данных с однородным dtype может хранить все значения в одном 2d-массиве. Когда я смотрел фреймы с разными типами dtypes, оказалось, что столбцы сгруппированы по dtype. Я не знаю, как он обрабатывает многоиндексирование.






Не уверен, правильно ли я понимаю проблему, но 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 должен работать так, как вы предлагали ...
может быть, проверьте версию pandas, которую вы используете?
У меня pandas 1.2.3 py39hf11a4ad_0
Существует два основных формата данных: многомерный числовой тип
ndarrayи списки ссылок на объекты. Массивыobjectdtype и серии / фреймыpandasпохожи на списки (с точки зрения использования памяти и скорости). Существует также структурированный массив, который чаще всего создаетсяgenfromtxtизcsv.