Python: Как перебирать строки и вычислять значение на основе предыдущей строки

#python #pandas

#python #pandas

Вопрос:

У меня есть данные о продажах до июля 2020 года, и я хочу спрогнозировать следующие 3 месяца, используя скорость восстановления. Это фрейм данных:

 test = pd.DataFrame({'Country':['USA','USA','USA','USA','USA'],
             'Month':[6,7,8,9,10],
              'Sales':[100,200,0,0,0],
              'Recovery':[0,1,1.5,2.5,3]
             })
  

Вот как это выглядит:

введите описание изображения здесь

Теперь я хочу добавить «прогнозируемый» столбец, полученный в этом фрейме данных:

введите описание изображения здесь

Первое значение 300 в строке 3, в основном (200 * 1.5/1) . В дальнейшем это будет наше базовое значение, поэтому следующее значение, т. е. 500, в основном (300 * 2.5/1.5) и так далее. Как мне выполнить итерацию по каждой строке, начиная со строки 3 и далее? Я пытался использовать shift (), но не смог выполнить итерацию по строкам.

Комментарии:

1. голос за копирование примера вставки!

2. показывать код с помощью shift() , потому что это моя первая идея. Но проблема в том, что вам нужно не только предыдущее значение из Sales и Recovery , но также из Predicted , и это может создать проблему.

Ответ №1:

Вы могли бы сделать это следующим образом:

 import pandas as pd
test = pd.DataFrame({'Country':['USA','USA','USA','USA','USA'],
             'Month':[6,7,8,9,10],
              'Sales':[100,200,0,0,0],
              'Recovery':[0,1,1.5,2.5,3]
             })

test['Prediction'] = test['Sales']
for i in range(1, len(test)):
    #prevent division by zero
    if test.loc[i-1, 'Recovery'] != 0:
        test.loc[i, 'Prediction'] = test.loc[i-1, 'Prediction'] * test.loc[i, 'Recovery'] / test.loc[i-1, 'Recovery']
  

Ответ №2:

Последовательность, которая у вас есть, прямо сводится к восстановлению * базовый уровень (Продажи = 200)

Вы можете вычислить эту последовательность следующим образом:

 valid_sales = test.Sales > 0
prediction = (test.Recovery * test.Sales[valid_sales].iloc[-1]).rename("Predicted")
  

А затем объединять по индексу, вставлять столбец или объединять:

 pd.concat([test, prediction], axis=1)