Строка оператора строки для математической операции [Python]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Строка оператора строки для математической операции [Python]

Сообщение Anonymous »

Я работаю над решением, позволяющим преобразовать математическую инструкцию, указанную в строковом операторе, в математическую формулу. При таком подходе один столбец будет содержать заданные строковые инструкции, а второй столбец будет содержать математическую формулу.
например:div(mul(mstr,mul(div(baseline_year,transaction_yr),spnd_val)), 1000) -->((mstr*((baseline_year*transaction_yr)/spnd_val))/1000)
Для достижения вышеуказанного результата я используя приведенный ниже код Python.

Код: Выделить всё

import re
import pandas as pd

def get_operations(calculation):
# Use regular expression to find all occurrences of add, mul, div, sub
operations = re.findall(r'\b(add|mul|div|sub)\b', calculation)
return operations

def sort_operations(operations):
priority = {'mul': 1, 'div': 2, 'add': 3, 'sub': 4}
return sorted(operations, key=lambda op: priority[op])
# function to generate the column expression and update the new column name
def replace_operations(expression):
# Required mathematical operations and theirs corresponding regex
patterns = {
'mul': re.compile(r'mul\(([^,]+),([^)]+)\)'),
'div': re.compile(r'div\(([^,]+),([^)]+)\)'),
'add': re.compile(r'add\(([^,]+),([^)]+)\)'),
'sub': re.compile(r'sub\(([^,]+),([^)]+)\)')
}

# replace function will help to replace the matched expression with the corresponding mathematical operation
def replace(match):
op = match.group(0)
if 'mul' in op:
return f"({match.group(1)}*{match.group(2)})"
elif 'div' in op:
return f"({match.group(1)}/{match.group(2)})"
elif 'add' in op:
return f"({match.group(1)}+{match.group(2)})"
elif 'sub' in op:
return f"({match.group(1)}-{match.group(2)})"

# Apply patterns in BODMAS order
priority = {'mul': 1, 'div': 2, 'add': 3, 'sub': 4}
while any(pattern.search(expression) for pattern in patterns.values()):
print("pattern", any(pattern.search(expression) for pattern in patterns.values()))
math_oprtrs = sort_operations(get_operations(expression))
print("math_operator",math_oprtrs)
for key in math_oprtrs:
print(expression,"pattern_for",patterns[key]) # Change the order here
expression = patterns[key].sub(replace, expression)

return expression

# Create a sample DataFrame
data = {'expression': ['div(mul(mul(div(baseline_year,transaction_year),mstr),spnd_val),1000)']}
df = pd.DataFrame(data)

# Apply the replace_operations function to the 'expression' column
df['updated_expression'] = df['expression'].apply(replace_operations)

display(df)
Проблемы
Хотя я собираюсь обобщить это более чем для одного, я получаю неправильный результат, а также иногда он не соответствует правилу BODMASS .
Не могли бы вы это проверить?
Меня пытались написать код на Python, и он работает нормально, если мы проходим два аргумента в строковой инструкции, и когда мне передаются более двух аргумент, то я получаю неправильный вывод.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ion-python
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»