Резюме: учитывая трехмерный массив, как я могу разрезать две конкретные координаты, а затем отсортировать по ЗНАЧЕНИЯм 3-го измерения, сохраняя информацию индекса
Преамбула:
Я пытаюсь сравнить стоимость покупательских корзин для клиентов, покупающих комбинацию яблок и бананов. Я знаю удельную стоимость этих фруктов у наших конкурентов, и в зависимости от того, какую цену я выберу, я могу быть дешевле или дороже. Я хотел бы иметь возможность ранжировать стоимость корзины для конкретной комбинации (например, 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) Мои конкуренты оценивают как фрейм данных, а затем трехмерный массив numpy с осью глубины, используемый для каждого конкурента.
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()))
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
ВОПРОС:
Предполагая, что эти результаты не упорядочены по возрастанию, как я могу
1) Отсортируйте их по order_costs, сохраняя информацию в «индексе» (имя поставщика, A, B или C)
2) Найдите ранг моей соответствующей стоимости заказа, например если мой заказ стоит 19, то это вернет 2.
Я пробовал использовать метод sortby()
для своего выбора, но если я передаю 'order_costs' в качестве переменной, я получаю KeyError. Сортировка по «переменной», похоже, не дает нужного эффекта, хотя и не вызывает ошибки.
Что я делаю неправильно?
Думаю, я нашел свой ответ.
1) Сделайте мой выбор одномерным
selection = selection[0]
2) Переиндексировать по переменной argsorted
selection = selection[selection.variable.argsort()]
3) Теперь выбор должен быть отсортирован, и у вас есть индикаторы для просмотра столбца supplier
.
Я взглянул на индексы, возвращаемые argsort()
, и, похоже, они не соответствовали порядку order_value, но когда я фактически использовал его, он дал мне правильный ответ.