| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- import re
- import numpy as np
- import pandas as pd
- def execute_constrains(data:pd.DataFrame,cst:str) -> np.ndarray:
-
- #######################################################################################
- # 以下函数用于execute_constrains中使用 #
- #######################################################################################
-
- def threshold_min(*data,threshold):
- # 原数据中,所有大于threshold的数的最小值
- data = np.column_stack(data)
- data_rm = np.where(data<=threshold,np.nan,data)
- data_min = np.nanmin(data_rm,axis=1)
- data_min = np.where(np.isnan(data_min),threshold,data_min)
- return data_min
-
- def max(*data):
- return np.max(data,axis=0)
- #######################################################################################
- #######################################################################################
-
- mod_vars = re.findall(r'{(\w+)}',cst)
- if len(mod_vars) > 0:
- for var in mod_vars:
- cst = cst.replace('{'+var+'}',f'data.{var}')
-
- try:
- cv = eval(cst)
- except Exception as E:
- print(f'执行该约束时有误:{cst},以下为输入的数据')
- with pd.option_context('display.max_columns', None):
- print(data)
- raise E
-
- cv = np.array(cv)
- else:
- cv = data.eval(cst).to_numpy()
-
- cv = cv.reshape(-1,1)
-
- return cv
- if __name__ == '__main__':
- res1 = execute_constrains(
- pd.DataFrame({'x':[1,2,3],'y':[4,5,6]}),
- cst='abs(x-y)'
- )
- print(res1)
|