Как пройти и создать сумму ролловера в Python?

Глядя на таблицу, я хочу воспроизвести столбец Rollover в фрейме данных Python. Ролловер смотрит на:

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

Ролловер никогда не будет меньше 0.

Пожалуйста, указывайте данные в виде текста, а не картинки

wjandrea 08.07.2024 00:56

Какую библиотеку данных вы используете, Панды? Пожалуйста, добавьте тег для него. Или, если вы открыты для чего-либо, просто скажите об этом. Обратите внимание, что сам Python не имеет фреймов данных. Кстати, если это поможет, этот вопрос касается того, как публиковать ваши данные: Как сделать хорошие воспроизводимые примеры панд

wjandrea 08.07.2024 00:57

Что вы пробовали? Если вы ищете векторизованное решение, написали ли вы хотя бы наивное решение для цикла?

wjandrea 08.07.2024 01:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете определить индекс первого раза 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 08.07.2024 01:28

@wjandrea, спасибо, что нашли это, думаю, теперь я исправил проблему

Derek O 08.07.2024 02:11

Другие вопросы по теме

Похожие вопросы

Обучение экстрактора пользовательских функций в стабильных базовых условиях3. Начиная с предварительно обученных весов?
Создайте список, накапливающий результаты многократного вызова функции для входного значения
Python: многопроцессорная обработка занимает больше времени, чем последовательная, почему?
Использование оператора присваивания внутри цикла while вызывает синтаксическую ошибку
Как я могу объединить несколько файлов CSV в один лист Excel с помощью Python?
Как отсортировать список списков списков по общему количеству элементов?
Панды читают XML-файл с назначенным типом данных
Как отформатировать ответ уценки Chatgpt в Python Frame tkinter?
Какова внутренняя реализация `copy.deepcopy()` в Python и как правильно переопределить `__deepcopy__()`?
Как я могу использовать groupby, чтобы каждая группа группировалась с предыдущей перекрывающейся группой?