跳转到主要内容

程序访问GEOROC数据

项目描述

pygeoroc

Build Status codecov PyPI

Python库,用于访问存储在https://data.goettingen-research-online.de/dataverse/digisGEOROC数据

请按照每个预编译数据集的指定方式引用GEOROC数据,并将pygeoroc引用为

Robert Forkel. (2022). pofatu/pygeoroc: 程序访问GEOROC数据. Zenodo. http://doi.org/10.5281/zenodo.3744586

安装

运行以下命令从Python包索引安装pygeoroc

pip install pygeoroc

最好在独立的虚拟环境中运行,以保持系统的Python安装不受影响。

安装pygeoroc还将安装一个命令行程序georoc,该程序提供管理GEOROC数据的本地副本的功能。运行

georoc -h

以获取使用说明。

概述

GEOROC以数据集的形式提供其可下载的内容,这些数据集是预编译的文件。

pygeoroc提供了以下功能

  • 将此数据下载到本地目录,称为存储库
  • 从Python代码中以编程方式访问存储库中的数据,
  • 将数据从存储库加载到SQLite数据库中,以便进行可扩展且性能良好的分析。

下载GEOROC数据

运行

$ georoc --repos tmp download

将创建或更新本地存储库,即具有以下布局的目录

$ tree -L 1 .
.
├── csv
└── datasets.json

存储库中包含一个“目录”在datasets.json中。该表中每文件的校验和,在再次运行georoc download时进行检查,确保只获取新版本的文件。

可以通过运行georoc ls来检查本地存储库,例如:

$ georoc --repos tmp/ ls --samples --references --format pipe

将输出以下表格

文件 数据集 大小 最后修改时间 样本数 引用数 路径
doi:10.25625/1KRR1P/QIINIE GEOROC 编译:太古地盾 211.7KB 2022-06-20 242 8 2022-06-1KRR1P_ALDAN_SHIELD_ARCHEAN.csv
doi:10.25625/1KRR1P/9YG7VJ GEOROC 编译:太古地盾 494.3KB 2022-06-20 564 23 2022-06-1KRR1P_AMAZONIAN_CRATON.csv
doi:10.25625/1KRR1P/E7NI47 GEOROC 编译:太古地盾 3.3MB 2022-06-20 3776 66 2022-06-1KRR1P_BALTIC_SHIELD_ARCHEAN.csv
doi:10.25625/1KRR1P/FY7PXY GEOROC 编译:太古地盾 53.8KB 2022-06-20 61 5 2022-06-1KRR1P_BASTAR_CRATON_ARCHEAN.csv

...

将 GEOROC 数据加载到 SQLite 中

由于 GEOROC 包含关于数十万个样本的数据,因此将其加载到 SQLite 数据库中可以大大简化查询。

$ georoc --repos tmp/ createdb
100%|██████████████████████████████████████████████████| 5/5 [00:00<00:00, 25.32it/s]
INFO    tmp/georoc.sqlite

生成的数据库包含 4 个表

  • file:CSV 文件的信息,基本上是来自 index.csv 的数据。
  • sample:单个样本的信息。
  • reference:数据来源的信息
  • citation:关联表,将样本与引用相关联。

可以通过运行以下命令来检查模式

$ sqlite3 tmp/georoc.sqlite
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
sqlite> .schema

如下所示

CREATE TABLE file (id TEXT PRIMARY KEY, date TEXT, section TEXT);
CREATE TABLE reference (id INTEGER PRIMARY KEY, reference TEXT);
CREATE TABLE sample (
    id TEXT PRIMARY KEY,
    file_id TEXT,
    `AGE` TEXT,
`ALTERATION` TEXT,
`DRILL_DEPTHAX` TEXT,
`DRILL_DEPTH_MIN` TEXT,
`ELEVATION_MAX` TEXT,
`ELEVATION_MIN` TEXT,
`EPSILON_ND` TEXT,
`ERUPTION_DAY` TEXT,
`ERUPTION_MONTH` TEXT,
`ERUPTION_YEAR` TEXT,
`GEOL.` TEXT,
`LAND_OR_SEA` TEXT,
`LATITUDE_MAX` TEXT,
`LATITUDE_MIN` TEXT,
`LOCATION` TEXT,
`LOCATION_COMMENT` TEXT,
`LONGITUDE_MAX` TEXT,
`LONGITUDE_MIN` TEXT,
`MATERIAL` TEXT,
`MINERAL` TEXT,
`ROCK_NAME` TEXT,
`ROCK_TEXTURE` TEXT,
`ROCK_TYPE` TEXT,
`TECTONIC_SETTING` TEXT,
`AR40_K40` TEXT,
`HE3_HE4` TEXT,
`HE4_HE3` TEXT,
`HF176_HF177` TEXT,
`K40_AR40` TEXT,
`ND143_ND144` TEXT,
`ND143_ND144_INI` TEXT,
`OS184_OS188` TEXT,
`OS186_OS188` TEXT,
`OS187_OS186` TEXT,
`OS187_OS188` TEXT,
`PB206_PB204` TEXT,
`PB206_PB204_INI` TEXT,
`PB207_PB204` TEXT,
`PB207_PB204_INI` TEXT,
`PB208_PB204` TEXT,
`PB208_PB204_INI` TEXT,
`RE187_OS186` TEXT,
`RE187_OS188` TEXT,
`SR87_SR86` TEXT,
`SR87_SR86_INI` TEXT,
`AG(PPM)` TEXT,
`AL(PPM)` TEXT,
`AS(PPM)` TEXT,
`AU(PPM)` TEXT,
`B(PPM)` TEXT,
`BA(PPM)` TEXT,
`BE(PPM)` TEXT,
`BI(PPM)` TEXT,
`BR(PPM)` TEXT,
`C(PPM)` TEXT,
`CA(PPM)` TEXT,
`CAO(WT%)` TEXT,
`CD(PPM)` TEXT,
`CE(PPM)` TEXT,
`CL(PPM)` TEXT,
`CL(WT%)` TEXT,
`CO(PPM)` TEXT,
`CR(PPM)` TEXT,
`CS(PPM)` TEXT,
`CU(PPM)` TEXT,
`DY(PPM)` TEXT,
`ER(PPM)` TEXT,
`EU(PPM)` TEXT,
`F(PPM)` TEXT,
`F(WT%)` TEXT,
`FE(PPM)` TEXT,
`FEO(WT%)` TEXT,
`FEOT(WT%)` TEXT,
`GA(PPM)` TEXT,
`GD(PPM)` TEXT,
`GE(PPM)` TEXT,
`HE(CCM/G)` TEXT,
`HE(CCMSTP/G)` TEXT,
`HE(NCC/G)` TEXT,
`HF(PPM)` TEXT,
`HG(PPM)` TEXT,
`HO(PPM)` TEXT,
`I(PPM)` TEXT,
`IN(PPM)` TEXT,
`IR(PPM)` TEXT,
`K(PPM)` TEXT,
`LA(PPM)` TEXT,
`LI(PPM)` TEXT,
`LOI(WT%)` TEXT,
`LU(PPM)` TEXT,
`MAX._AGE_(YRS.)` TEXT,
`MG(PPM)` TEXT,
`MGO(WT%)` TEXT,
`MIN._AGE_(YRS.)` TEXT,
`MN(PPM)` TEXT,
`MNO(WT%)` TEXT,
`MO(PPM)` TEXT,
`NA(PPM)` TEXT,
`NB(PPM)` TEXT,
`ND(PPM)` TEXT,
`NI(PPM)` TEXT,
`NIO(WT%)` TEXT,
`O(WT%)` TEXT,
`OH(WT%)` TEXT,
`OS(PPM)` TEXT,
`OTHERS(WT%)` TEXT,
`P(PPM)` TEXT,
`PB(PPM)` TEXT,
`PD(PPM)` TEXT,
`PR(PPM)` TEXT,
`PT(PPM)` TEXT,
`RB(PPM)` TEXT,
`RE(PPM)` TEXT,
`RH(PPM)` TEXT,
`RU(PPM)` TEXT,
`S(PPM)` TEXT,
`S(WT%)` TEXT,
`SB(PPM)` TEXT,
`SC(PPM)` TEXT,
`SE(PPM)` TEXT,
`SM(PPM)` TEXT,
`SN(PPM)` TEXT,
`SR(PPM)` TEXT,
`TA(PPM)` TEXT,
`TB(PPM)` TEXT,
`TE(PPM)` TEXT,
`TH(PPM)` TEXT,
`TI(PPM)` TEXT,
`TL(PPM)` TEXT,
`TM(PPM)` TEXT,
`U(PPM)` TEXT,
`V(PPM)` TEXT,
`VOLATILES(WT%)` TEXT,
`W(PPM)` TEXT,
`Y(PPM)` TEXT,
`YB(PPM)` TEXT,
`ZN(PPM)` TEXT,
`ZR(PPM)` TEXT,
`AL2O3(WT%)` TEXT,
`B2O3(WT%)` TEXT,
`CH4(WT%)` TEXT,
`CL2(WT%)` TEXT,
`CO1(WT%)` TEXT,
`CO2(PPM)` TEXT,
`CO2(WT%)` TEXT,
`CR2O3(WT%)` TEXT,
`FE2O3(WT%)` TEXT,
`H2O(WT%)` TEXT,
`H2OM(WT%)` TEXT,
`H2OP(WT%)` TEXT,
`H2OT(WT%)` TEXT,
`HE3(AT/G)` TEXT,
`HE3(CCMSTP/G)` TEXT,
`HE3_HE4(R/R(A))` TEXT,
`HE4(AT/G)` TEXT,
`HE4(CCM/G)` TEXT,
`HE4(CCMSTP/G)` TEXT,
`HE4(MOLE/G)` TEXT,
`HE4(NCC/G)` TEXT,
`HE4_HE3(R/R(A))` TEXT,
`K2O(WT%)` TEXT,
`NA2O(WT%)` TEXT,
`P2O5(WT%)` TEXT,
`SIO2(WT%)` TEXT,
`SO2(WT%)` TEXT,
`SO3(WT%)` TEXT,
`SO4(WT%)` TEXT,
`TIO2(WT%)` TEXT,
    FOREIGN KEY (file_id) REFERENCES file(id)
);
CREATE TABLE citation (
    sample_id TEXT,
    reference_id INTEGER,
    FOREIGN KEY (sample_id) REFERENCES sample(id),
    FOREIGN KEY (reference_id) REFERENCES reference(id)
);

因此,可以通过运行 SQL 查询来获得与 georoc ls 报告类似的信息。

例如,为了确定贡献最多样本的论文,我们可以运行

SELECT
    r.reference, COUNT(c.sample_id) AS c
FROM
    reference as r, citation as c
WHERE
    r.id = c.reference_id
GROUP BY r.reference
ORDER BY c DESC
LIMIT 1;

这将得到

FONTIJN K., MCNAMARA K., TADESSE A. Z., PYLE D. M., DESSALEGN F., HUTCHISON W., MATHER T. A., YIRGU G.:    CONTRASTING STYLES OF POST-CALDERA VOLCANISM ALONG THE MAIN ETHIOPIAN RIFT: IMPLICATIONS FOR CONTEMPORARY VOLCANIC HAZARDS  J. VOLCANOL. GEOTHERM. RES. 356   [2018] 90-113    doi: 10.1016/j.jvolgeores.2018.02.001|3978

以编程方式访问 GEOROC 数据

pygeoroc 提供了一个 Python API,用于访问本地 GEOROC 数据

>>> from pygeoroc import GEOROC
>>> api = GEOROC('tmp/')
>>> for sample in api.iter_samples():
>>> for sample, file in api.iter_samples():
...     print(sample)
...     print(file)
...     break
... 
Sample(id='138180', name='s_27-261-33,CC,PC. 2 [2118]', citations=['2118'], data={'SR(PPM)': '', ... })
File(name='Ocean_Basin_Flood_Basalts_comp__ARGO_ABYSSAL_PLAIN;INDIAN_OCEAN.csv', date=datetime.date(2020, 3, 9), section='Ocean Basin Flood Basalts')

转换器

对于两种访问模式——SQLite 和 Python API——pygeoroc 提供了一种指定“转换器”的机制,即用于将 GEOROC CSV 数据中特定列的值转换为 Python 调用的可调用对象。该机制可用于修复错误——例如,地理坐标中缺少负号——或将数据转换为更适合的数据类型。

该机制在 pygeoroc.errata 中实现,其工作原理如下:如果数据存储库中包含一个名为 converters.py 的 Python 模块,则加载此模块并按名称查找两个 Python dict

  • FIELDS:将 CSV 列名映射到转换函数的 dict
  • COORDINATES:将 CSV 文件名(存储在存储库中)映射到指定 latitudelongitude 键的 dict

“转换函数”是一个具有以下签名的 Python 可调用对象

def conv(old, data, fname):
    """
    @param old: old value for the respective field in the sample data
    @param data: full `dict` of the sample data in one row in the GEOROC CSV
    @param fname: name of the GEOROC CSV file containing the row
    @return: the new value for "field" in "data"
    """

一些有用的转换函数作为 pygeoroc.errata.CONVERTERS 的属性可用。

因此,为了指定 LAND_OR_SEA 列的值必须全部大写,以及 BISMARCK_ARC_NEW_BRITAIN_ARC.csv 文件中的纬度必须为负(在您的存储库的 csv/ 目录中查找文件名或在 SQLite 数据库中运行 SELECT id FROM file;),您需要在存储库的 converters.py 中放置以下 Python 代码

from pygeoroc.errata import CONVERTERS

FIELDS = {
    'LAND_OR_SEA': CONVERTERS.upper,
}

COORDINATES = {
    "BISMARCK_ARC_NEW_BRITAIN_ARC.csv": {
        'latitude': CONVERTERS.negative,
    },
}

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源代码分发

pygeoroc-2.0.0.tar.gz (21.9 kB 查看哈希值)

上传于 源代码

构建版本

pygeoroc-2.0.0-py2.py3-none-any.whl (19.1 kB 查看哈希值)

上传于 Python 2 Python 3

由以下支持