Как написать цикл for в pandas для создания условия для предыдущих строк - PullRequest
0 голосов
/ 11 сентября 2018

Так что мне приходится проходить через каждый квартал и определять, когда начинается и заканчивается рецессия.

Я разработал следующие бизнес-правила

  1. если ВВП за этот квартал меньше, чем предыдущий, а предыдущий был меньше, чем предыдущий, у которого не было флага рецессии, тогда флаг начала рецессии.

  2. Если в этом квартале ВВП> предыдущий и предыдущий имеет флаг рецессии или начнется возврат, отметьте этот флаг рецессии

  3. Если в этом квартале ВВП> предыдущий и предыдущий> предыдущий, но предыдущий 2-й имел флаг рецессии, пометьте эти 2 как конец рецессии

  4. Иной флаг ноль для отсутствия рецессии

То, что я не знаю, как это сделать, это циклически проходить по каждой строке и создавать if, которая будет генерировать новый столбец, чтобы пометить, является ли столбец началом рецессии, рецессией, концом рецессии или нет рецессии

Как мне сделать для каждой строки Если предыдущая строка равна x, а предыдущая строка на один столбец справа - Y Также, если строка перед предыдущей строкой - x, а предыдущая предыдущая строка и 1 столбец справа - Y?

 Output: 
 Quarter GDP  Recession Flag
 1947q1  100  0
 1947q2  110  0
 1947q3  120  1

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Не за моим столом, но это может сработать?

df = myDataFrame
prev = None
for index, row in df.iterrows():
    if prev:
        #Check if in a recession currently
        if row[2] = 2:
             if prev[1] > row[1]:
                 row[2]  = 3
        #Check for more conditions
     prev = row
     continue

Я нахожусь в своей камере, так что это действительно сложно напечатать, но с этого стоит начать.Как вы можете видеть, iterrows приведет вас туда, куда вы хотите.

0 голосов
/ 11 сентября 2018

Пусть df будет вашим фреймом данных, содержащим квартал, ВВП, спад и флаг. .shift() метод должен работать здесь:

df.columns = ['Quarter', 'GDP', 'Recession', 'Flag']

df['GDP_lag1'] = df['GDP'].shift(1)
df['GDP_lag2'] = df['GDP'].shift(2)
df['flag_lag1'] = df['Recession'].shift(1)
df['flag_lag2'] = df['Recession'].shift(2)

Итак, теперь ваши столбцы:

df.columns = ['Quarter', 'GDP', 'Recession', 'Flag', 'GDP_lag1', 'GDP_lag2', 'flag_lag1', 'flag_lag2']

def rec_flag(row):
    gdp = row[1]
    flag = row[2]
    p_gdp = row[4]
    pp_gdp = row[5]
    p_flag = row[6]
    pp_flag = row[7]


    if (gdp < p_gdp) & (p_gdp < pp_gdp) & (p_flag == 0):
       return 1
    elif (gdp > p_gdp) & (p_flag == 1):
       return 1
    elif (gdp > p_gdp) & (p_gdp > pp_gdp) & (pp_flag == 1):
       return 0
    else:
       return 0

df['Flag'] = df.apply(rec_flag) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...