[PYTHON] Libre de codage en dur des fonctions avec SymPy

introduction

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.

Spécifications de commande

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.

Comment spécifier la fonction

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.

essayons

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

Courir

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.

en conclusion

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

Libre de codage en dur des fonctions avec SymPy
Utilisation des fonctions C ++ de python avec pybind11
Bloquer le sommeil Heroku (niveau gratuit) avec Django
Superposer des graphiques avec sympy
Avec Sympy, ne t'inquiète pas
Curry n'importe quelle fonction avec Python ...
[Python] Résoudre des équations avec sympy
Introduction aux fonctions Python
Traitement parallèle avec des fonctions locales
Equation de mouvement avec sympy
Insérer à partir de pd.DataFrame avec psycopg2
Étude de Python Hour3: Fonctions
Avec skype, notifiez avec skype de python!
Comment se connecter à Cloud Firestore à partir de Google Cloud Functions avec du code Python
Jouez avec le cadre gratuit GCP ② ~ Airflow (sur Compute Engine), Cloud Functions ~