Лучший способ читать и писать файлы CSV с помощью астрокапроса для получения больших наборов данных
from astroquery.mast import Catalogs
import numpy as np
from astropy.io import ascii
myfile='/Users/slaterjonesoden/Desktop/GALEX_analysis/RQE_sample_data.csv'
sample = ascii.read(myfile, format='csv', delimiter=',', guess=True)
galexMatchCatalog=[]
iteration = 1
for each_galaxy in sample:
catalogData = Catalogs.query_object(str(each_galaxy['RAgal'])+str(' ')+str(each_galaxy['DECgal']), catalog="Galex")
print(iteration)
iteration += 1
if iteration > 2:
break
if len(catalogData)!=0:
sdss_info = [each_galaxy['RAgal'], each_galaxy['DECgal']]
galexMatchCatalog.append(list(np.array(catalogData)[0])+sdss_info)
header = catalogData.colnames + ['sdss_ra', 'sdss_dec']
ascii.write(galexMatchCatalog, '/Users/slaterjonesoden/Desktop/GALEX_analysis_codes/172_RQEs_galex_mast_match.csv', format='csv', names=header, overwrite=True)
Я пытаюсь заставить этот код сопоставить 172 галактики в файле CSV, который в настоящее время находится на моем компьютере, с галактиками в модуле astroquery.mast, используя функцию запроса каталогов.
Интересующий каталог в astroquery.mast - это GALEX (Galaxy Evolution Explorer). По сути, я хочу, чтобы код проходил через 172 галактики в моем CSV-файле и сопоставлял их (с использованием RA и DEC) с галактиками, хранящимися в каталоге GALEX в astroqury.mast.
После сопоставления этих галактик я хочу написать новый файл CSV с данными из GALEX об этих галактиках.
Моей первой попыткой было определение функции writeCsvFile (), но она не работала должным образом для записи файла csv.
Следующей моей попыткой был импорт ascii из astropy.io и использование функций ascii.read () и ascii.write () для чтения и записи этих файлов CSV. Сначала я подумал, что мне повезло, так как цикл for работал, но после прохождения цикла for функция ascii.write () не работала должным образом. Ниже приведено сообщение об ошибке, которое я получаю при запуске кода:
сообщение об ошибке, которое я получаю при запуске кода ascii версии кода
Строка с важной ошибкой на рисунке выше:ValueError: аргументы «names» и «dtype» должны соответствовать количеству столбцов.
Любой, у кого есть опыт использования astroquery.mast и чтения / записи файлов CSV, будет полезным.
Я запускаю этот код, используя Python 3.6 с интерпретатором astroconda3
Вот изображение кода:172_RQEs_GALEX_mast_match.py
1 ответ
Думаю, я понимаю, в чем ваша ошибка. Когда вы строите
galexMatchCatalog
вы создаете список данных строки, содержащий первую строку из
catalogData
плюс ваши две координаты
[RAgal, RAdec]
которые вы хотите добавить в строку в качестве дополнительных столбцов.
Затем вы передаете список списков строковых данных.
На самом деле это немного противоречит интуиции, но если вы передадите список, он предполагает, что это список столбцов, а не строк , поэтому он, конечно, взрывается, поскольку количество строк не соответствует количеству столбцов. Может быть, сообщение об ошибке могло бы быть здесь более полезным.
Вы можете увидеть, например, первый пример из документации, показывающий, что он передал список столбцов (это для эффективности, поскольку обычно более эффективно хранить данные по столбцам для операций, ориентированных на столбцы).
Фактически, если вы пройдете
ascii.write
что-то кроме астропии, он попытается построить из первого аргумента (вы можете увидеть это в трассировке в строке, которая говорит
table = Table(table, names=names)
.
Аналогичным образом при построении таблицы он интерпретирует список как список столбцов. Чтобы передать ему список строк, вы можете сделать что-то вроде:
>>> table = Table(rows=galexMatchCatalog, names=header)
>>> table.write(filename, format='ascii.csv')
В более общем плане, вот как я могу это сделать (хотя есть много способов).
С
sample
вы читаете из своего файла CSV, у вас уже есть астропия
Table
объект, содержащий
RAgal
а также
DECgal
столбцы. Вы можете создать подтаблицу, содержащую только такие столбцы, как:
coords = sample[['RAgal', 'DECgal']]
Если вы хотите, вы также можете переименовать столбцы в соответствии с тем, что вы хотите в окончательном выводе:
coords.rename_columns(['RAgal', 'DECgal'], ['sdss_ra', 'sdss_dec'])
Теперь вы хотите перебрать все пары координат и запросить каталог, а также создать список строк из результатов запроса, включая координаты, которые вы использовали для их поиска. Опять же, есть много способов сделать это более эффективно, чем другие, но один из них - использовать
hstack
а также
vstack
:
from astropy.table import hstack, vstack
galex_match_catalog = []
for galaxy_coords in coords:
catalog_data = Catalogs.query_object(f'{galaxy_coords["sdss_ra"]} {galaxy_coords["sdss_dec"]}', catalog='Galex')
if catalog_data:
galex_match_catalog.append(hstack([catalog_data[0], galaxy_coords]))
# Finally, write:
galaxy_match_catalog = vstack(galaxy_match_catalog)
galaxy_match_catalog.write(filename, format='ascii.csv')