scipy.optimize 在 pandas 数据帧上
scipy.optimize on pandas dataframe
我试图搜索它,但结果很差。
有人可以向我解释如何在 Pandas DataFrame 上执行 optimize.minimize 如此最小化是 DataFrame 中的类别和结果列之间的错误
考虑这个例子:
import pandas as pd
df = pd.DataFrame({'prod': ['prod1', 'prod2', 'prod3', 'prod4', 'prod5', 'prod6'],
'cat': ['cat1', 'cat1', 'cat2', 'cat2', 'cat3', 'cat1'],
'dog': ['dog1', 'dog2', 'dog1', 'dog2', 'dog2', 'dog3'],
'result': [20, 10, 30, 50, 45, 120]})
对于每个 cat1、cat2、cat3、dog1、dog2 和 dog3,我想找到最小化此等式的值:
import numpy as np
np.average(np.abs(df['result'] - ('min for values in cat column * min for values in dog column'))) / np.average(df['result'])
我可以使用 Solver
在 Excel 中复制它
prod cat dog result cat*dog abs
prod1 cat1 dog1 20 17.38 2.61
prod2 cat1 dog2 10 27.34 17.35
prod3 cat2 dog1 30 26.91 3.09
prod4 cat2 dog2 50 42.32 7.67
prod5 cat3 dog2 45 45.00 0.00
prod6 cat1 dog3 120 20.64 99.36
所以我要查找的最终分数是:
平均腹肌 22 / 平均结果 45.83 = 0.47
这些是规划求解为动物返回的值:
cat1 3.59194254
cat2 5.559980313
cat3 5.91078751
dog1 4.840109868
dog2 7.613201994
dog3 5.746396256
如何在 Python 中复制它?
您需要定义一个 optimize.minimize
可以 运行 的函数(以便它知道它试图最小化什么)。
import pandas as pd
import numpy as np
from scipy import optimize
df = pd.DataFrame({'prod': ['prod1', 'prod2', 'prod3', 'prod4', 'prod5', 'prod6'],
'cat': ['cat1', 'cat1', 'cat2', 'cat2', 'cat3', 'cat1'],
'dog': ['dog1', 'dog2', 'dog1', 'dog2', 'dog2', 'dog3'],
'result': [20, 10, 30, 50, 45, 120]})
因此,让我们按照您的描述定义 animal_error 函数 - 第一个参数是具有一定数量值的一维数组(根据优化要求)。第二个参数是这些数组值的对应字符串,第三个参数是您的数据框。此代码的大部分只是将您的数据帧字符串转换为可以计算的值。
def animal_error(val, animal, df):
assert len(val) == len(animal)
lookup = dict()
for i in range(len(val)):
lookup[animal[i]] = val[i]
df = df.replace(lookup)
error = np.abs(df['result'] - np.multiply(df['cat'], df['dog']))
return np.mean(error) / np.mean(df['result'])
现在,您可以将字符串组成一个数组:
animals = np.concatenate([df['dog'].unique(), df['cat'].unique()])
为求解器设置一个合理的初始值:
initial = np.repeat(np.sqrt(df['result'].mean()), animals.size)
和运行最小化器:
res = optimize.minimize(animal_error, args=(animals, df), x0=initial, method = 'Nelder-Mead', options={'maxiter':10000})
res_df = pd.DataFrame({'animal': animals, 'min_val':res.x})
最终结果如下:
>>> res.fun
0.08676411624175694
animal min_val
0 dog1 3.754194
1 dog2 5.296533
2 dog3 22.526566
3 cat1 5.327044
4 cat2 9.307979
5 cat3 8.496109
我认为你的成本函数描述可能有点偏差,所以你可能需要调整它。
我试图搜索它,但结果很差。
有人可以向我解释如何在 Pandas DataFrame 上执行 optimize.minimize 如此最小化是 DataFrame 中的类别和结果列之间的错误
考虑这个例子:
import pandas as pd
df = pd.DataFrame({'prod': ['prod1', 'prod2', 'prod3', 'prod4', 'prod5', 'prod6'],
'cat': ['cat1', 'cat1', 'cat2', 'cat2', 'cat3', 'cat1'],
'dog': ['dog1', 'dog2', 'dog1', 'dog2', 'dog2', 'dog3'],
'result': [20, 10, 30, 50, 45, 120]})
对于每个 cat1、cat2、cat3、dog1、dog2 和 dog3,我想找到最小化此等式的值:
import numpy as np
np.average(np.abs(df['result'] - ('min for values in cat column * min for values in dog column'))) / np.average(df['result'])
我可以使用 Solver
在 Excel 中复制它prod cat dog result cat*dog abs
prod1 cat1 dog1 20 17.38 2.61
prod2 cat1 dog2 10 27.34 17.35
prod3 cat2 dog1 30 26.91 3.09
prod4 cat2 dog2 50 42.32 7.67
prod5 cat3 dog2 45 45.00 0.00
prod6 cat1 dog3 120 20.64 99.36
所以我要查找的最终分数是:
平均腹肌 22 / 平均结果 45.83 = 0.47
这些是规划求解为动物返回的值:
cat1 3.59194254
cat2 5.559980313
cat3 5.91078751
dog1 4.840109868
dog2 7.613201994
dog3 5.746396256
如何在 Python 中复制它?
您需要定义一个 optimize.minimize
可以 运行 的函数(以便它知道它试图最小化什么)。
import pandas as pd
import numpy as np
from scipy import optimize
df = pd.DataFrame({'prod': ['prod1', 'prod2', 'prod3', 'prod4', 'prod5', 'prod6'],
'cat': ['cat1', 'cat1', 'cat2', 'cat2', 'cat3', 'cat1'],
'dog': ['dog1', 'dog2', 'dog1', 'dog2', 'dog2', 'dog3'],
'result': [20, 10, 30, 50, 45, 120]})
因此,让我们按照您的描述定义 animal_error 函数 - 第一个参数是具有一定数量值的一维数组(根据优化要求)。第二个参数是这些数组值的对应字符串,第三个参数是您的数据框。此代码的大部分只是将您的数据帧字符串转换为可以计算的值。
def animal_error(val, animal, df):
assert len(val) == len(animal)
lookup = dict()
for i in range(len(val)):
lookup[animal[i]] = val[i]
df = df.replace(lookup)
error = np.abs(df['result'] - np.multiply(df['cat'], df['dog']))
return np.mean(error) / np.mean(df['result'])
现在,您可以将字符串组成一个数组:
animals = np.concatenate([df['dog'].unique(), df['cat'].unique()])
为求解器设置一个合理的初始值:
initial = np.repeat(np.sqrt(df['result'].mean()), animals.size)
和运行最小化器:
res = optimize.minimize(animal_error, args=(animals, df), x0=initial, method = 'Nelder-Mead', options={'maxiter':10000})
res_df = pd.DataFrame({'animal': animals, 'min_val':res.x})
最终结果如下:
>>> res.fun
0.08676411624175694
animal min_val
0 dog1 3.754194
1 dog2 5.296533
2 dog3 22.526566
3 cat1 5.327044
4 cat2 9.307979
5 cat3 8.496109
我认为你的成本函数描述可能有点偏差,所以你可能需要调整它。