У меня есть датафрейм pandas, похожий на приведенный ниже:
Total Yr_to_Use First_Year_Del Del_rate 2019 2020 2021 2022 2023 etc
ref1 100 2020 5 10 0 0 0 0 0
ref2 20 2028 2 5 0 0 0 0 0
ref3 30 2021 7 16 0 0 0 0 0
ref4 40 2025 9 18 0 0 0 0 0
ref5 10 2022 4 30 0 0 0 0 0
В столбце «Итого» показано, сколько продукта необходимо доставить. «First_yr_Del» говорит вам, сколько будет доставлено в первый год. После этого скорость доставки возвращается к «Del_rate» - фиксированная ставка, которая может применяться каждый год, пока не будут доставлены все продукты. В столбце «Год использования» указывается столбец первого года, с которого должна начинаться доставка.
ПРИМЕР: Ref1 имеет 100 для доставки. Он начнет поставлять в 2020 году и будет поставлять 5 в первый год, и 10 каждый год после этого, пока не будут учтены все 100.
Есть идеи, как это сделать?
Я думалЯ мог бы использовать что-то вроде ниже, чтобы ссылаться на какие столбцы по очереди, но я даже не уверен, полезно ли это или нет, поскольку это будет зависеть от решения (в правильной версии base_date.year определен как первый столбецв таблице - 2019):
start_index_for_slice = df.columns.get_loc(base_date.year)
end_index_for_slice = start_index_for_slice+no_yrs_to_project
df.columns[start_index_for_slice:end_index_for_slice]
Я довольно плохо знаком с Python и не уверен, что немного забегаю вперед ...
То, как яЯ думаю, что пойти на это будет использовать цикл for, или что-то с использованием iterrows, но другие сообщения, кажется, говорят, что это плохая идея, и я должен использовать векторизацию, cython или lambdas. Из этих трех я до сих пор управлял только очень простой лямбдой. Другие являются для меня загадкой, поскольку решение, по-видимому, предлагает выполнять одно действие за другим до завершения.
Любая и вся помощь оценена!
Спасибо
РЕДАКТИРОВАТЬ: Пример ожидаемого результата ниже (я отредактировал некоторые даты, чтобы вы могли лучше увидеть логику):
Total Yr_to_Use First_Year_Del Del_rate 2019 2020 2021 2022 2023etc
ref1 100 2020 5 10 0 5 10 10 10
ref2 20 2021 2 5 0 0 2 5 5
ref3 30 2021 7 16 0 0 7 16 7
ref4 40 2019 9 18 9 18 13 0 0
ref5 10 2020 4 30 0 4 6 0 0