Строки: время хранения (из scan_acquisition_time).
Столбцы: округленные значения массы (из Mass_values).
Ячейки: интенсивность. значения (из интенсивности_значений), соответствующие времени удерживания и массе.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что хоть убей, я не могу понять, почему некоторые значения интенсивности не выровнено/расположено в правильном порядке в кадре данных. Я знаю, что они расположены неправильно, поскольку у меня есть ссылка на тот же кадр данных (выходные данные другого программного обеспечения, правильность которых была проверена).
Размещение значений интенсивности в dataframe очень важен для того, что я пытаюсь сделать; и я пробовал разные способы, например, создание сводной таблицы или разделение значений интенсивности в соответствии с размером значений массы, но пока все методы не дали результатов.
вот как Я извлек необработанные данные:
` импортировать xarray как xr
импортировать pandas как 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: (4825,)
#Начальные индексы для данных сканирования
scan_index: (4825,)
#Отношение массы к заряду
mass_values: (2903174,)
#Интенсивности, соответствующие каждой массе
intensity_values: (2903174,)
пример данных
scan_acquisition_time = np.array([ 5.903 6.546 7,188 7,83 8,472 9,115 9,757 10,399 11,041 11,684 12,326 12,968 13,61 14,253 4,895 15,537 16,18 16,822 17,464 18,106 18,749 19,391 20,033 20,675 1,318 21,96 22,602 23,244 23,887 24,529 25,171 25,813 26,456 27,098 27,74 28,383 29,025 29,667 30,309 30,952 31,594 32,236 32,878 33,521 4,163 34,805 35,447 36,09 36,732 37,374])
scan_index = np.array([ 0 624) 1249 1878 2492 3127 3742 4366 4982 5618 6246 6863 7469 8098 8715 9320 9936 10565 11191 11821 12449 13061 13680 14316 14931 15573 16208 16824 17448 18055 18680 19301 19928 20551 21186 21794 22419 23051 23674 24295 24919 25543 26164 26786 27414 28041 28664 29285 29904 30517])
mass_values = np.array([19.79999924 20.29999924 20.89999962 1.60000038 22.29999924 22.79999924 23.20000076 24.20000076 24.89999962 26. 27.20000076 28.10000038 29. 29.79999924 31.20000076 32.09999847 32.90000153 33.29999924
34.09999847 35. 35.40000153 36. 36.79999924 37.79999924 38.79999924 40.09999847 41.20000076 41.90000153
43. 44. 45.29999924 46.09999847 47.09999847 47.90000153 48.79999924 50. 50.29999924 51. 52.20000076 52.90000153 53.90000153 54.29999924 55. 56.09999847 56.79999924 57.09999847 58.09999847 59.09999847
60.20000076 60.79999924])
intensity_values = np.array([ 506. 574. 465. 411. 412. 562. 590. 598. 541. 1480. 762. 63016. 726. 576. 799 . 23904. 98. 246. 471. 216. 291. 220. 222. 674. 887. 2035. 1982. 631. 501. 8382. 712. 469. 520. 743. 290. 585. 568. 1137. 907. 763. 236. 191. 811. 556. 340. 348. 425. 354. 327. 430.])
а затем, чтобы построить фрейм данных, я сделал это:
Код: Выделить всё
if 'point_count' in data.variables:
point_count = data['point_count'].values.squeeze()
else:
raise ValueError("The dataset does not have the 'point_count' variable, necessary to map scans to intensity data")
# 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
Мобильная версия