Как создать DataFrame из данных ГХ-МС со временем удерживания, значениями массы и интенсивности в Python с правильным выPython

Программы на Python
Ответить
Anonymous
 Как создать DataFrame из данных ГХ-МС со временем удерживания, значениями массы и интенсивности в Python с правильным вы

Сообщение Anonymous »

Я обрабатываю данные газовой хроматографии и масс-спектроскопии (ГХ-МС), хранящиеся в файле NetCDF на Python, и у меня возникли проблемы с правильным выравниванием данных для создания структурированного DataFrame. Моя цель — построить матрицу, в которой:
Строки: время хранения (из scan_acquisition_time).
Столбцы: округленные значения массы (из Mass_values).
Ячейки: интенсивность. значения (из интенсивности_значений), соответствующие времени удерживания и массе.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что хоть убей, я не могу понять, почему некоторые значения интенсивности не выровнено/расположено в правильном порядке в кадре данных. Я знаю, что они расположены неправильно, поскольку у меня есть ссылка на тот же кадр данных (выходные данные другого программного обеспечения, правильность которых была проверена).
Размещение значений интенсивности в dataframe очень важен для того, что я пытаюсь сделать; и я пробовал разные способы, например, создание сводной таблицы или разделение значений интенсивности в соответствии с размером значений массы, но пока все методы не дали результата.
  • Как я могу гарантировать, что интенсивности правильно согласованы со временем удерживания и округленными значениями массы?
  • Есть ли лучшие способы структурировать или обрабатывать эти данные в Python, чтобы избежать этих проблем с выравниванием?
вот как я извлек необработанные данные:
` импортировать xarray как xr
импортировать панды как pd
импортировать numpy как np

Код: Выделить всё

 # Extract necessary data
retention_time = data['scan_acquisition_time'].values.squeeze()
intensity_values = data['intensity_values'].values.squeeze()
mass_values = data['mass_values'].values.squeeze()
scan_index = data['scan_index'].values.squeeze()
rounded_mass = np.round(mass_values).astype(int)  # Round mass values to integers
mass_min = np.round(min(mass_values)).astype(int)
mass_max = np.round(max(mass_values)).astype(int)
ideal_mass_values = list(range(mass_min, mass_max + 1))
`
ниже приведен пример моей структуры данных:
scan_acquisition_time (shape (4825, )): Время хранения для каждого сканирования.
scan_index (shape (4825,)): Начальные индексы для данных каждого сканирования в Mass_values ​​и Intensity_values.
mass_values ​​(shape (2903174,)): Масса-к- коэффициенты заряда для всех сканирований.
intensity_values ​​(shape (2903174,)): значения интенсивности, соответствующие каждому значению массы.
а затем, чтобы построить фрейм данных, я сделал это:` # Убедитесь, что 'point_count' существует для сопоставления сканирований с данными интенсивности
if 'point_count' в data.variables:
point_count = data['point_count'].values.squeeze()
else:
raise ValueError("В наборе данных нет переменной point_count, необходимой для сопоставления сканирований с данными интенсивности")

Код: Выделить всё

 # Repeat retention times for each point in each scan
retention_time_repeated = np.repeat(retention_time, point_count)

# Ensure lengths match
assert len(retention_time_repeated) == len(intensity_values), "Mismatch in  retention_time and intensity_values length"

# Get unique retention times and define matrix dimensions
unique_retention_times, inverse_indices = np.unique(retention_time_repeated, return_inverse=True)
unique_masses = ideal_mass_values

# Initialize a zero-filled intensity matrix
intensity_matrix = np.zeros((len(unique_retention_times), len(unique_masses)))

# Create mass index mapping
mass_to_index = {mass: j for j, mass in enumerate(unique_masses)}

# Get indices for the intensity matrix
mass_indices = np.array([mass_to_index[mass] for mass in rounded_mass])

# Populate the intensity matrix in a vectorized manner
intensity_matrix[inverse_indices, mass_indices] += intensity_values

# Convert the matrix to a DataFrame for easier inspection
matrix_df = pd.DataFrame(
intensity_matrix,
index=unique_retention_times,
columns=unique_masses
)

# Display part of the matrix for verification
print(matrix_df.head())
`
Мои вопросы:

[*]Как я могу гарантировать, что интенсивность правильно ли сопоставлены со временем удерживания и округленными значениями массы?
[*]Должен ли я включить scan_index, чтобы облегчить выравнивание? Если да, то как мне к этому подойти?
[*]Существуют ли альтернативные, более эффективные способы структурировать или обрабатывать эти данные в Python, чтобы избежать проблем с выравниванием?

Могу ли я еще что-нибудь сделать? Пожалуйста, помогите. Спасибо :')
Для справки, вот что я пытаюсь получить:
Матрица интенсивности для образца.CDF:
Изображение

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

Подробнее здесь: https://stackoverflow.com/questions/791 ... values-and
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»