En utilisant SymPy, qui est une bibliothèque de traitement mathématique, j'ai effectué une opération sur une colonne d'une trame de données Pandas à l'aide d'une fonction définie dans un fichier externe, et j'ai sorti le résultat.
Comme ça. train est le fichier d'entrée, output est le fichier de sortie et function est le fichier de définition de fonction.
$ python command/calculate_function.py -h
usage: calculate_function.py [-h] -train TRAIN -function FUNCTION -output
OUTPUT
optional arguments:
-h, --help show this help message and exit
-train TRAIN input function file.
-function FUNCTION input function file.
-output OUTPUT output csv file.
Le fichier de définition de fonction ressemble à ceci.
exp,cos(x),NewExp
exp,exp(x),ExpExp
exp,sin(x),SinExp
La première colonne est le nom de colonne à calculer et le deuxième nom de colonne est l'expression de fonction. Au fait, x signifie la valeur de la colonne à calculer. La troisième colonne est le nom de la colonne qui stocke le résultat du calcul.
La source ressemble à ceci. La commande exec est utilisée pour reconnaître l'expression de fonction en tant que source python.
calculate_function.py
import argparse
import csv
import pandas as pd
import numpy as np
from sympy import *
import csv
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-train", type=str, required=True, help="input function file.")
parser.add_argument("-function", type=str, required=True, help="input function file.")
parser.add_argument("-output", type=str, required=True, help="output csv file.")
args = parser.parse_args()
df = pd.read_csv(args.train, index_col=0)
#Lire les données
file = open(args.function, 'r')
data = csv.reader(file)
for row in data:
exec('x=Symbol("x")')
exec('f='+str(row[1]))
exec('func = lambdify((x), f, "numpy")')
exec('df["{0}"] = func(df["{1}"])'.format(row[2], row[0]))
file.close()
df.to_csv(args.output)
if __name__ == "__main__":
main()
Fichier d'entrée
CMPD_CHEMBLID,exp,smiles
CHEMBL596271,3.54,Cn1c(CN2CCN(CC2)c3ccc(Cl)cc3)nc4ccccc14
CHEMBL1951080,-1.18,COc1cc(OC)c(cc1NC(=O)CSCC(=O)O)S(=O)(=O)N2C(C)CCc3ccccc23
CHEMBL1771,3.69,COC(=O)[C@@H](N1CCc2sccc2C1)c3ccccc3Cl
CHEMBL234951,3.37,OC[C@H](O)CN1C(=O)C(Cc2ccccc12)NC(=O)c3cc4cc(Cl)sc4[nH]3
CHEMBL565079,3.1,Cc1cccc(C[C@H](NC(=O)c2cc(nn2C)C(C)(C)C)C(=O)NCC#N)c1
CHEMBL317462,3.14,OC1(CN2CCC1CC2)C#Cc3ccc(cc3)c4ccccc4
Le fichier de fonction est le fichier présenté dans l'exemple du fichier de spécification de fonction.
Résultat de sortie
CMPD_CHEMBLID,exp,smiles,NewExp,ExpExp,SinExp
CHEMBL596271,3.54,Cn1c(CN2CCN(CC2)c3ccc(Cl)cc3)nc4ccccc14,-0.9216800341052034,34.46691919085739,-0.3879509179417303
CHEMBL1951080,-1.18,COc1cc(OC)c(cc1NC(=O)CSCC(=O)O)S(=O)(=O)N2C(C)CCc3ccccc23,0.38092482436688185,0.30727873860113125,-0.9246060124080203
CHEMBL1771,3.69,COC(=O)[C@@H](N1CCc2sccc2C1)c3ccccc3Cl,-0.8533559001656995,40.044846957286715,-0.5213287903544065
CHEMBL234951,3.37,OC[C@H](O)CN1C(=O)C(Cc2ccccc12)NC(=O)c3cc4cc(Cl)sc4[nH]3,-0.9740282491988521,29.07852705779708,-0.22642652177388314
CHEMBL565079,3.1,Cc1cccc(C[C@H](NC(=O)c2cc(nn2C)C(C)(C)C)C(=O)NCC#N)c1,-0.9991351502732795,22.197951281441636,0.04158066243329049
CHEMBL317462,3.14,OC1(CN2CCC1CC2)C#Cc3ccc(cc3)c4ccccc4,-0.9999987317275395,23.103866858722185,0.0015926529164868282
Il semble que certains résultats sortent.
Sympy semble être en mesure de donner des formules plus compliquées telles que le branchement conditionnel, alors j'aimerais en parler à nouveau.
Recommended Posts