Строки: время хранения (из 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
Мобильная версия