Я работаю над решением, позволяющим преобразовать математическую инструкцию, указанную в строковом операторе, в математическую формулу. При таком подходе один столбец будет содержать заданные строковые инструкции, а второй столбец будет содержать математическую формулу.
например: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, и он работает нормально, если мы проходим два аргумента в строковой инструкции, и когда мне передаются более двух аргумент, то я получаю неправильный вывод.
Я работаю над решением, позволяющим преобразовать математическую инструкцию, указанную в строковом операторе, в математическую формулу. При таком подходе один столбец будет содержать заданные строковые инструкции, а второй столбец будет содержать математическую формулу. например:[b]div(mul(mstr,mul(div(baseline_year,transaction_yr),spnd_val)), 1000) -->((mstr*((baseline_year*transaction_yr)/spnd_val))/1000)[/b] Для достижения вышеуказанного результата я используя приведенный ниже код Python. [code]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) [/code] Проблемы Хотя я собираюсь обобщить это более чем для одного, я получаю неправильный результат, а также иногда он не соответствует правилу BODMASS . Не могли бы вы это проверить? Меня пытались написать код на Python, и он работает нормально, если мы проходим два аргумента в строковой инструкции, и когда мне передаются более двух аргумент, то я получаю неправильный вывод.
Problem
I am trying to get any mathematical string to split into a list by operators (i.e. + , - , / , * ), while keeping anything in a matching number of brackets together as one list element.
Examples and desired outputs
Here are some very random...
Я новичок в программировании на Python.
Я написал программу с помощью Chatgpt, которую не до конца понимаю, но знаю, что хочу сделать еще много операторов if-else, не усложняя их вложением .
Что я могу сделать, кроме помещения строк после if-else в...