微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 astroquery 读取和写入 CSV 文件以获取大型数据集的最佳方法

如何解决使用 astroquery 读取和写入 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',names=header,overwrite=True)

我正在尝试使用目录查询功能使此代码将当前在我计算机上的 CSV 文件中的 172 个星系与 astroquery.mast 模块中的星系相匹配。

astroquery.mast 中感兴趣的目录是 galEX(galaxy Evolution Explorer)。本质上,我希望代码遍历 CSV 文件中的 172 个星系,并将它们(使用 RA 和 DEC)与 astroqury.mast 中的 galEX 目录中的星系进行匹配。

匹配这些星系后,我想用来自这些星系的 galEX 数据编写一个新的 CSV 文件

我的第一个尝试是定义一个 writeCsvFile() 函数,但这无法正常写入 csv 文件

我的下一个尝试是从 astropy.io 导入 ascii 并使用 ascii.read() 和 ascii.write() 函数来读取和写入这些 CSV 文件。起初我以为我很幸运,因为 for 循环正在工作,但是在经过 for 循环之后 ascii.write() 函数无法正常工作。下面是我运行代码时得到的错误信息:

error message I get when running the code ascii version of the code

上图中的重要错误行: ValueError:参数“names”和“dtype”必须匹配列数

任何有使用 astroquery.mast 和读/写 CSV 文件经验的人都会有所帮助。

我使用 Python 3.6 和解释器 astroconda3 运行此代码

这是代码图片172_RQEs_GALEX_mast_match.py

解决方法

我想我明白你的错误是什么。当您构造 galexMatchCatalog 时,您正在创建一个行数据列表,其中包含来自 catalogData 的第一行以及您想要作为附加列附加到该行的两个坐标 [RAgal,RAdec]

然后您传递 ascii.write 一个行列数据列表。

实际上这有点违反直觉,但是如果您传递 ascii.write 一个列表,它会假定它是一个 而非 的列表,因此当然,它会爆炸,因为行数与列数不匹配。也许这里的错误信息可能更有用。

例如,您可以看到 ascii.write 文档中的第一个 Example 显示它传递了一个列列表(这是为了提高效率,因为它通常更有效地存储数据列-为了面向列的操作而明智)。

事实上,如果你传递 ascii.write 不是 astropy Table 的东西,它会尝试从第一个参数构造一个 Table(你可以在行的回溯中看到这一点上面写着table = Table(table,names=names)

同样,当 Constructing a Table 将列表解释为列列表。要将行列表传递给它,您可以执行以下操作:

>>> table = Table(rows=galexMatchCatalog,names=header)
>>> table.write(filename,format='ascii.csv')

更一般地说,我可能会这样做(尽管有很多方法)。

通过从 CSV 文件中读取的 sample,您已经拥有一个包含 TableRAgal 列的 astropy DECgal 对象。您可以制作一个只包含这些列的子表,例如:

coords = sample[['RAgal','DECgal']]

如果需要,您还可以根据最终输出中的内容重命名列:

coords.rename_columns(['RAgal','DECgal'],['sdss_ra','sdss_dec'])

现在您要遍历所有坐标对并查询目录,并根据查询结果构建一个行列表,包括用于查找它们的坐标。同样,有很多方法可以做到这一点,其中一些方法比其他方法更有效,但一种方法是使用 hstackvstack

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')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。