Сортировать значения массива для определенного среза из 3d DataArray - PullRequest
0 голосов
/ 13 сентября 2018

Сводка: Учитывая трехмерный массив, как я могу нарезать на две конкретные координаты, а затем сортировать по ЗНАЧЕНИЯМ 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

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

ВОПРОС:

Предполагая, что эти результаты не упорядочены по возрастанию, как я могу

1) Сортировать их в соответствии с order_costs, покасохранение информации в «указателе» (название поставщика, A, B или C)

2) Найти ранг моего соответствияНапример, если мой заказ стоит 19, то это вернет 2.

Я попробовал метод sortby() в своем выборе, но если я передам 'order_costs' в качестве переменной, я получу KeyError.Сортировка по «переменным», похоже, не дает правильного эффекта, хотя и не вызывает ошибку.

Что я делаю не так?

1 Ответ

0 голосов
/ 14 сентября 2018

Я думаю, что нашел свой ответ.

1) Сделайте свой выбор 1-мерным

selection = selection[0]

2) Переиндексируйте с помощью аргументированной переменной

selection = selection[selection.variable.argsort()]

3) Теперь выборка должна быть отсортирована, и у вас есть признаки, чтобы посмотреть и на столбец supplier.

Я посмотрел на индексы, возвращаемые argsort()и они не выглядят так, как будто они соответствуют значению order_value, но когда я фактически использовал его, он дал мне правильный ответ.

...