Обзвон (), потолок (), этаж (), мин (), макс () в pandas eval - PullRequest
3 голосов
/ 19 марта 2020

Как видно из заголовка, есть ли способ поддержать функции круглого, потолочного, минимального, максимального и нижнего этажей в pandas eval.

DataFrame:

import pandas as pd
import numexpr as ne
op_d = {'ID': [1, 2,3],'V':['F','G','H'],'AAA':[0,1,1],'E':[102014,112019,122017] ,'D':['2019/02/04','2019/02/01','2019/01/01'],'DD':['2019-12-01','2016-05-31','2015-02-15'],'CurrentRate':[7.5,2,2],'NoteRate':[2,3,3],'BBB':[0,00,4],'Q1':[2,8,00],'Q2':[3,5,7],'Q3':[5,6,8]}
df = pd.DataFrame(data=op_d)

Функции abs () и sqrt () работают с pandas eval. т.е.

df.eval('TT = abs(sqrt(Q1+Q2)-Q2)',inplace=True)
df

Кто-нибудь может подсказать, как получить доступ к остальным функциям в eval? Я также попробовал local_dict в eval, чтобы посмотреть, смогу ли я определить пользовательские функции и вызвать их, но это не сработало.

Примечание:

  1. Arithmeti c необходимы операции внутри этих функций (т.е. сумма, умножение, деление двух столбцов).
  2. Мне известны проблемы, связанные с использованием функций 'eval' и проведением необходимых измерений.

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

С помощью библиотеки py_expression_eval я смог выполнить арифметические операции c внутри пользовательских функций.

from py_expression_eval import Parser
parser = Parser()

dct = {'Q1':df['Q1'],'Q2':df['Q2'],'max':max1,'round':getround}
df['check']=parser.parse('round(Q1/Q2)').evaluate(dct)

источник библиотеки: https://github.com/Axiacore/py-expression-eval

Надеюсь, это поможет другим.

0 голосов
/ 19 марта 2020

Вы не можете

DataFrame.eval только поддерживает ограниченный набор математических операций

Арифметические c операции, за исключением левого сдвига ( <<) и операторы смещения вправо (>>), например, df + 2 * pi / s ** 4 % 42 - the_golden_ratio

Математические функции: sin, cos, exp, log, expm1, log1p, sqrt, sinh, co sh, tanh, arcsin , arccos, arctan, arcco sh, arcsinh, arctanh, abs, arctan2 и log10.

Если его нет в этом списке, его нельзя вызвать из-за "" 1015 * Вызовы функций, кроме математические функции [недопустимый синтаксис] "


При этом может быть возможным для реализации некоторых из этих функций в терминах более простых c операций. , Здесь я реализовал eval эквивалент np.sign. Но IMO, который слишком запутывает операцию и не очень полезен, так что на самом деле вам нужно отойти от eval

...