Pandas алгоритм сопоставления с самим собой - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь создать соответствующий al go в pandas, который выполняет следующие действия с данной таблицей:

Таблица содержит покупки и продажи продуктов по дате, номенклатуре, количеству (+ для покупок и - для продаж) и цена.

Условия:

  • Создайте алгоритм, который сопоставляет покупки и продажи на единицу и соответствующую среднюю прибыль для каждого элемента в общей сложности.
  • Совпадения могут проводиться только в одну и ту же дату, в противном случае они вообще не совпадают.
  • Оставшиеся положительные или отрицательные запасы в день игнорируются
  • Допускаются отрицательные запасы.

Пример с одним продуктом:

date   product    quantity    price
1      X          +2          1
1      X          -1          2
1      X          -2          4
2      X          +1          1
2      X          +1          2
3      X          -1          4

Ответ: В результате получается, что только в 1-й день совпали 3 сделки с прибылью -2 + 2 + 4 = 4 , Потому что инвентарь +2, -1, а затем снова -1. Оставшийся инвентарь -1 игнорируется. День 2 и 3 не имеют совпадений, потому что сделки не закрываются в один и тот же день.

Правильный вывод:

product   Profit 
X         +4

Есть ли какой-нибудь элегантный способ получить этот результат без необходимости oop по таблице несколько раз с помощью iterrow?

1 Ответ

0 голосов
/ 13 апреля 2020

Для воспроизведения df:

df = pd.DataFrame({'date':[1,1,1,2,2,3],'product': ['X']*6,'quantity':[2,-1,-2,1,1,-1],'price':[1,2,4,1,2,4]})

Процесс, который вы описываете, может использовать groupby и aggregate, что-то вроде этого:

df.groupby('date').sum()

Но я не совсем понимаю ваши правила для сопоставления. Таким образом, в первый день я получил другую общую прибыль. Цена * количество равно (+ 2 * 1) + (- 1 * 2) + (- 2 * 4) = - 8, поэтому прибыль кажется равной 8.

Использование iterrow () - довольно плохая практика , Мало того, что вы пишете избыточный код, но и, вероятно, он намного медленнее (проверьте сравнение здесь) .

Большинство задач такого типа можно выполнить, комбинируя groupby (), aggregate () и применить (). Посмотрите этот замечательный учебник .

Надеюсь, это поможет вам или будущим ответам:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...