Сводка: Учитывая трехмерный массив, как я могу нарезать на две конкретные координаты, а затем сортировать по ЗНАЧЕНИЯМ 3-го измерения, сохраняя информацию индекса
Преамбула:
IПытаюсь сравнить стоимость корзины покупок для покупателей, покупающих комбинацию яблок и бананов.Я знаю цену наших фруктов на эти фрукты у наших конкурентов, и в зависимости от того, какую цену я выберу, я могу быть дешевле или дороже.Я хотел бы иметь возможность ранжировать стоимость своей корзины для конкретной комбинации (например, 3 яблока и 15 бананов) среди моих конкурентов.
Я попытался включить весь соответствующий код, но реальный важный момент заключается вконец.
1) Построение функции, которая принимает цену за яблоки и бананы и возвращает сетку стоимости заказа:
apple_range = np.arange(1, 12, 1)
banana_range = np.arange(5, 30, 5)
def order_costs(no_apples, no_bananas, apple_cost=None, banana_cost=None):
return (no_apples * apple_cost) + (no_bananas * banana_cost)
fv = np.vectorize(order_costs, excluded=['apple_cost', 'banana_costs'])
2) Мои конкуренты оценивают как фрейм данныхи затем трехмерный массив с осью «глубина», используемый для каждого конкурента
fruit_prices = pd.DataFrame(
data = [[1,2], [3,4], [5,6]],
index = ['A', 'B', 'C'],
columns = ['apple_cost', 'banana_cost'],
)
order_costs_dict = {}
for idx, row in fruit_prices.iterrows():
order_costs_dict[idx] = fv(apple_range[:, np.newaxis], banana_range, **dict(row))
order_costs = np.dstack(list(order_costs_dict.values()))
![enter image description here](https://i.stack.imgur.com/8tStL.png)
3) Преобразование данных в массив данных DataArray
bvs_dataset = xr.Dataset(
{'order_costs':(['apples', 'bananas', 'supplier'], order_costs)},
coords = {'apples': (['apples'], apple_range),
'bananas': (['bananas'], banana_range),
'supplier': (['supplier'], list(order_costs_dict.keys()))}
)
bvs_array = bvs_dataset.to_array()
Теперь я делаю выбор, хочу узнать стоимость заказа 1 яблока и 5 бананов
4)
selection = bvs_array.sel(apples=1, bananas=5)
selection
![enter image description here](https://i.stack.imgur.com/6auGj.png)
ВОПРОС:
Предполагая, что эти результаты не упорядочены по возрастанию, как я могу
1) Сортировать их в соответствии с order_costs, покасохранение информации в «указателе» (название поставщика, A, B или C)
2) Найти ранг моего соответствияНапример, если мой заказ стоит 19, то это вернет 2.
Я попробовал метод sortby()
в своем выборе, но если я передам 'order_costs' в качестве переменной, я получу KeyError.Сортировка по «переменным», похоже, не дает правильного эффекта, хотя и не вызывает ошибку.
Что я делаю не так?