(计算网站已改版,本教程已失效)Fe-Ti oxide geothermobarometer (钛铁氧化物温度计) 批量计算温度和氧逸度

一、钛铁氧化物温度计

钛铁氧化物温度计(Fe-Ti oxide geothermobarometer )通过计算平衡共生矿物的共有成份分配函数,可以测定矿物大致的结晶温度。

二、计算软件

目前比较成熟的计算软件是由Ghiorso MS , Evans BW (2008)编写的软件,提供了Mac Os和Windows平台的应用以及网页在线版。
1.Mac Os 版 该版本所兼容的系统(OS 10.5 (Leopard) and OS10.6 (Snow Leopard) 版本早已过时。
2.Windows版 该版本为Excel编写的宏,仅支持Office 2003,现在谁还用这古老的版本!!!
3.网页在线版 该网页仅支持手动输入数据,且无法完成批量计算。

那么怎么去实现批量计算呢?

三、思路解析

首先对excel宏源码进行了分析,试图从源代码里面找到计算公式,可是大佬写的VBA代码里面根本没有计算公式,而是将excel数据以数组的形式传递给了在线服务器。放弃!!!
既然无法获取算法公式,那么只能打网页在线版的主意了。

F6A2BE3E-B3AB-49FC-820B-C0B10B778EBD.png

网页版的界面上可以直接手动输入数据进行计算,并返回单次计算结果,可是对于批量计算无能为力。
于是想到的就是用爬虫批量传递数据给服务器,然后爬取返回的结果写入excel。通过分析该网页网址传递参数到服务器计算的过程,发现该网站参数传递非常简单,仅仅是参数拼接。参数传递链接如下:
http://melts.ofm-research.org/CORBA_CTserver/OxideGeothrm/OxideGeothrmResult.php?SiO2sp=0.0&SiO2rh=0.0&TiO2sp=4.35&TiO2rh=28.73&Al2O3sp=1.94&Al2O3rh=0.35&Fe2O3sp=0.0&Fe2O3rh=0.0&V2O3sp=0.0&V2O3rh=0.0&Cr2O3sp=0.18&Cr2O3rh=0.0&FeOsp=86.34&FeOrh=65.98&MnOsp=0.44&MnOrh=0.23&MgOsp=1.2&MgOrh=1.02&CaOsp=0.0&CaOrh=0.0&ZnOsp=0.0&ZnOrh=0.0&NiOsp=0.0&NiOrh=0.0&Submit1=Calculate+T+and+fO2
所以只需将数据按照以上网址的样式进行简单的组合,即可利用爬虫实现批量计算。

四、数据准备

按如下形式整理数据为excel。


7DD9C4923C051145142B42EE9FD02EAF.png

1.表头分别为两种矿物的各元素标识。\color{red} {表头顺序可更改,内容不能改变,代码里已经写死,如改变,会报错}
2.第一列为每一个测点的编号。

五、实现过程

# -*- coding: utf-8 -*-
"""
Copyright (C) 2021, Inc. All Rights Reserved 
@Time    :2021/9/23 23:18
@Wechart :Pandas120
@Email   :137243562@qq.com
@File    :feti_geothermal.py
@Version :1.1
"""
import requests as rq
from lxml import etree
import pandas as pd
import easygui

###定义一个函数,并返回计算结果
def getresult(data):
    SiO2sp = data["aSiO2"]
    SiO2rh = data["bSiO2"]
    TiO2sp = data["aTiO2"]
    TiO2rh = data["bTiO2"]
    Al2O3sp = data["aAl2O3"]
    Al2O3rh = data["bAl2O3"]
    Fe2O3sp = data["aFe2O3"]
    Fe2O3rh = data["bFe2O3"]
    V2O3sp = data["aV2O3"]
    V2O3rh = data["bV2O3"]
    Cr2O3sp = data["aCr2O3"]
    Cr2O3rh = data["bCr2O3"]
    FeOsp = data["aFeO"]
    FeOrh = data["bFeO"]
    MnOsp = data["aMnO"]
    MnOrh = data["bMnO"]
    MgOsp = data["aMgO"]
    MgOrh = data["bMgO"]
    CaOsp = data["aCaO"]
    CaOrh = data["bCaO"]
    ZnOsp = data["aZnO"]
    ZnOrh = data["bZnO"]
    NiOsp = data["aNiO"]
    NiOrh = data["bNiO"]
    url = f"http://melts.ofm-research.org/CORBA_CTserver/OxideGeothrm/OxideGeothrmResult.php?SiO2sp={SiO2sp}&SiO2rh={SiO2rh}&TiO2sp={TiO2sp}&TiO2rh={TiO2rh}&Al2O3sp={Al2O3sp}&Al2O3rh={Al2O3rh}&Fe2O3sp={Fe2O3sp}&Fe2O3rh={Fe2O3rh}&V2O3sp={V2O3sp}&V2O3rh={V2O3rh}&Cr2O3sp={Cr2O3sp}&Cr2O3rh={Cr2O3rh}&FeOsp={FeOsp}&FeOrh={FeOrh}&MnOsp={MnOsp}&MnOrh={MnOrh}&MgOsp={MgOsp}&MgOrh={MgOrh}&CaOsp={CaOsp}&CaOrh={CaOrh}&ZnOsp={ZnOsp}&ZnOrh={ZnOrh}&NiOsp={NiOsp}&NiOrh={NiOrh}&Submit1=Calculate+T+and+fO2"
    while True:
        res = rq.get(url)
        if res.status_code == 200:
            html = etree.HTML(res.text)
            tfeti = float(html.xpath("/html/body/div/div/div/table[2]/tr[1]/td[2]/div/text()")[0])
            log10f02 = float(html.xpath("/html/body/div/div/div/table[2]/tr[2]/td[2]/div/text()")[0])
            tfemg = float(html.xpath("/html/body/div/div/div/table[2]/tr[3]/td[2]/div/text()")[0])
            ati02 = float(html.xpath("/html/body/div/div/div/table[2]/tr[4]/td[2]/div/text()")[0])
            return tfeti, log10f02, tfemg, ati02
        else:
            print("连接失败!正在重试!!")

###主函数入口
if __name__ == "__main__":
    file = easygui.fileopenbox(filetypes=["*.xls", "*.xlsx"], default="*.xlsx")
    data = pd.read_excel(file, sheet_name=0)
    tfetilist = []
    log10f02list = []
    tfemglist = []
    ati02list = []
    for i in range(data.shape[0]):
        tfeti, log10f02, tfemg, ati02=getresult(data.loc[i, :])
        tfetilist.append(tfeti)
        log10f02list.append(log10f02)
        tfemglist.append(tfemg)
        ati02list.append(ati02)
    data["tfeti"] = tfetilist
    data["log10f02"] = log10f02list
    data["tfemg"] = tfemglist
    data["ati02"] = ati02list
    data.to_excel("result.xlsx",sheet_name="res",index=False)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容