[PYTHON] Frei von der harten Codierung von Funktionen mit SymPy

Einführung

Mit SymPy, einer mathematischen Verarbeitungsbibliothek, habe ich eine Operation an einer Spalte eines Pandas-Datenrahmens mit einer in einer externen Datei definierten Funktion ausgeführt und das Ergebnis ausgegeben.

Befehlsspezifikationen

So was. train ist die Eingabedatei, output ist die Ausgabedatei und function ist die Funktionsdefinitionsdatei.

$ 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.

So legen Sie die Funktion fest

Die Funktionsdefinitionsdatei sieht folgendermaßen aus.

exp,cos(x),NewExp
exp,exp(x),ExpExp
exp,sin(x),SinExp

Die erste Spalte ist der zu berechnende Spaltenname und der zweite Spaltenname ist der Funktionsausdruck. X bedeutet übrigens den Wert der zu berechnenden Spalte. Die dritte Spalte ist der Spaltenname, in dem das Berechnungsergebnis gespeichert ist.

Lass es uns versuchen

Die Quelle sieht so aus. Der Befehl exec wird verwendet, um den Funktionsausdruck als Python-Quelle zu erkennen.

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)

    #Daten lesen
    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()

Lauf

Eingabedatei

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

Die Funktionsdatei ist die im Beispiel der Funktionsspezifikationsdatei gezeigte Datei.

Ausgabeergebnis

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

Es scheint, dass einige Ergebnisse herauskommen.

abschließend

Sympy scheint in der Lage zu sein, kompliziertere Formeln wie die bedingte Verzweigung anzugeben, daher möchte ich noch einmal darüber schreiben.

Recommended Posts

Frei von der harten Codierung von Funktionen mit SymPy
Verwenden von C ++ - Funktionen aus Python mit pybind11
Block Heroku (freie Stufe) Schlaf mit Django
Überlagern Sie Diagramme mit Sympy
Mach dir mit Sympy keine Sorgen
Curry jede Funktion mit Python ....
[Python] Löse Gleichungen mit Sympy
Einführung in Python-Funktionen
Parallelverarbeitung mit lokalen Funktionen
Bewegungsgleichung mit Sympy
Mit psycopg2 aus pd.DataFrame einfügen
Studie aus Python Hour3: Funktionen
Mit Skype benachrichtigen Sie mit Skype von Python!
Herstellen einer Verbindung zum Cloud Firestore über Google Cloud-Funktionen mit Python-Code
Spielen Sie mit GCP Free Frame ② ~ Luftstrom (auf Compute Engine), Cloud-Funktionen ~