Сохранение операторов Statement, Groupby и IF в SAS для Python - PullRequest
1 голос
/ 03 мая 2019

Чтобы дать суть, я пытаюсь пометить переменную "RUN", которая удовлетворяет условиям GROUPBY и IF.Ниже приведен код, который я конвертирую в SAS-код в Python, и применил следующую логику SAS:

data data_v1;
retain run;
set data;
by plant material;
if first.material then do;
    if sales_quantity = 0 then run = 1; else run = 0;
end;
*keep plant material sales_quantity run;
else do;
    if run > 0 then do;
        if sales_quantity = 0 or (sales_quantity < 0.01 * Annual_Sales and sales_quantity <= 9)
        then run = run + 1; else run = 0;
    end;
    else do;
        if sales_quantity = 0 then run = 1; else run = 0;
    end;
end;

run;

Я создал образец кадра данных в Python и реализовал логику, ноя не могу добиться правильного выхода.

Как применить GROUPBY для цикла FOR?Также предложите, если есть какой-либо лучший подход.

import pandas as pd
import numpy as np
df=pd.DataFrame()
df['plant']=['a','a','a','a','b','b','b','b','b','b','b','c','c','c','c','c','c','c','d','d','d','d','d','d']
df['mater']=['x','x','x','y','x','x','x','y','y','y','y','x','x','x','x','y','y','y','y','y','x','x','x','x']
df['salqty']=[0,0,0,10,11,12,13,0,0,13,0,13,0,0,1,0,0,0,1,2,3,0,0,0] 
df['plantmaterial'] = df["plant"].map(str) + df["mater"]
df['annual_sales']=0.01

df['flag'] = ((df.plantmaterial != df.plantmaterial.shift()) ).astype(int)
df['run']=0

for i in range(0, len(df)):
        if df.loc[i,'flag'].any() == 1:
            if df.loc[i,'sales_quantity'].any() == 0: 
                df.loc[i,'run'] = 1
            else:
                df.loc[i,'run'] = 0
        else:
            if df.loc[i-1,'run'].any() > 0:
                if ((df.loc[i,'sales_quantity'].any() == 0) or ((df.loc[i,'sales_quantity'].any() < 0.01 * df.loc[i,'annual_sales']) and (df.loc[i,'sales_quantity'].any() <= 9))):
                    df.loc[i,'run'] = df.loc[i-1,'run'] + 1
                else:
                    df.loc[i,'run'] = 0
            else:
                if df.loc[i,'sales_quantity'].any() == 0:
                    df.loc[i,'run'] = 1
                else:
                    df.loc[i,'run'] = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...