一、钛铁氧化物温度计
钛铁氧化物温度计(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.表头分别为两种矿物的各元素标识。。
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)