Глядя на таблицу, я хочу воспроизвести столбец Rollover в фрейме данных Python. Ролловер смотрит на:
Ролловер создается, когда производство превышает максимальную мощность. Следующая дата будет соответствовать предыдущему дню и либо добавит разницу между производительностью и максимальной мощностью, либо вычтет разницу между максимальной мощностью и производительностью.
Ролловер никогда не будет меньше 0.
Какую библиотеку данных вы используете, Панды? Пожалуйста, добавьте тег для него. Или, если вы открыты для чего-либо, просто скажите об этом. Обратите внимание, что сам Python не имеет фреймов данных. Кстати, если это поможет, этот вопрос касается того, как публиковать ваши данные: Как сделать хорошие воспроизводимые примеры панд
Что вы пробовали? Если вы ищете векторизованное решение, написали ли вы хотя бы наивное решение для цикла?
Вы можете определить индекс первого раза production > max_capacity
, установить все предыдущие записи равными 0, а затем выполнить накопление суммы (округляя любые отрицательные значения до 0, см. этот ответ). Вот воспроизводимый пример и результат:
import numpy as np
import pandas as pd
df = pd.DataFrame({'DATE': pd.date_range('2024-01-01','2024-01-13'),'PRODUCTION': [10,8,8,15,15,12,10,9,14,16,2,2,2],'MAX_CAPACITY':[11]*13})
df['EXTRA'] = df['PRODUCTION'] - df['MAX_CAPACITY']
first_pos_idx = df['EXTRA'].gt(0).idxmax()
df.loc[:first_pos_idx-1, "EXTRA"] = 0
## cumulative sum where negative results are rounded up to 0
sumlm = np.frompyfunc(lambda a,b: 0 if a+b < 0 else a+b,2,1)
df['ROLLOVER'] = sumlm.accumulate(df['EXTRA'].values, dtype=np.object_)
Результат:
DATE PRODUCTION MAX_CAPACITY EXTRA ROLLOVER
0 2024-01-01 10 11 0 0
1 2024-01-02 8 11 0 0
2 2024-01-03 8 11 0 0
3 2024-01-04 15 11 4 4
4 2024-01-05 15 11 4 8
5 2024-01-06 12 11 1 9
6 2024-01-07 10 11 -1 8
7 2024-01-08 9 11 -2 6
8 2024-01-09 14 11 3 9
9 2024-01-10 16 11 5 14
10 2024-01-11 2 11 -9 5
11 2024-01-12 2 11 -9 0
12 2024-01-13 2 11 -9 0
ОП сказал: «Перенос никогда не будет меньше 0», но если вы добавили больше строк с производительностью меньше мощности, этот код сделает его отрицательным. Например, я опробовал это с еще двумя днями производства = 2, что означает перенос -4 и -13.
@wjandrea, спасибо, что нашли это, думаю, теперь я исправил проблему
Пожалуйста, указывайте данные в виде текста, а не картинки