Как создать новую колонку на основе трендов? - PullRequest
3 голосов
/ 05 мая 2020

Я хочу создать новый столбец в моем фрейме данных. Мой начальный фрейм данных выглядит так:

data = [['A', '2019-10-10' ,1.6], ['A', '2019-10-11' ,.85], ['A', '2019-10-12' ,1.49],['A', '2019-10-13' ,1.12],['A', '2019-10-14' ,.85],
        ['B', '2019-10-10' ,5.6], ['B', '2019-10-11' ,.55], ['B', '2019-10-13' , 1.49],['B', '2019-10-13' ,2.12],['B', '2019-10-14' ,7.85],
        ['C', '2019-10-10' ,1.36], ['B', '2019-10-11',.45], ['B', '2019-10-12' ,1.29],['B', '2019-10-13' ,1.32],['B', '2019-10-14' ,.43]]

df = pd.DataFrame(data, columns = ['ID', 'Date','Value']) 

Out[71]: 
   ID        Date  Value
0   A  2019-10-10   1.60
1   A  2019-10-11   0.85
2   A  2019-10-12   1.49
3   A  2019-10-13   1.12
4   A  2019-10-14   0.85
5   B  2019-10-10   5.60
6   B  2019-10-11   0.55
7   B  2019-10-13   1.49
8   B  2019-10-13   2.12
9   B  2019-10-14   7.85
10  C  2019-10-10   1.36
11  B  2019-10-11   0.45
12  B  2019-10-12   1.29
13  B  2019-10-13   1.32
14  B  2019-10-14   0.43

Столбец, который я хочу создать, называется «Outlook» и будет возвращать «нет» или «да». Он вернет «да», если указанный c ID имеет значение меньше 1,5, 4 раза подряд. Например, ID A имел значение меньше 1,5 в даты 2019-10-11, 2019-10-12, 2019-10-13 и 2019-10-14, поэтому он вернет yes.

Окончательный фрейм данных должен выглядеть так:

data1 = [['A', '2019-10-10' ,1.6,'no'], ['A', '2019-10-11' ,.85,'no'], ['A', '2019-10-12' ,1.49,'no'],['A', '2019-10-13' ,1.12,'no'],['A', '2019-10-14' ,.85,'yes'],
        ['B', '2019-10-10' ,5.6,'no'], ['B', '2019-10-11' ,.55,'no'], ['B', '2019-10-13' , 1.49,'no'],['B', '2019-10-13' ,2.12,'no'],['B', '2019-10-14' ,7.85,'no'],
        ['C', '2019-10-10' ,1.36,'no'], ['C', '2019-10-11',.45,'no'], ['C', '2019-10-12' ,1.29,'no'],['C', '2019-10-13' ,1.32,'yes'],['C', '2019-10-14' ,.43,'yes']]

df1 = pd.DataFrame(data1, columns = ['ID', 'Date','Value','Outlook']) 

Out[73]: 
   ID        Date  Value Outlook
0   A  2019-10-10   1.60      no
1   A  2019-10-11   0.85      no
2   A  2019-10-12   1.49      no
3   A  2019-10-13   1.12      no
4   A  2019-10-14   0.85     yes
5   B  2019-10-10   5.60      no
6   B  2019-10-11   0.55      no
7   B  2019-10-13   1.49      no
8   B  2019-10-13   2.12      no
9   B  2019-10-14   7.85      no
10  C  2019-10-10   1.36      no
11  C  2019-10-11   0.45      no
12  C  2019-10-12   1.29      no
13  C  2019-10-13   1.32     yes
14  C  2019-10-14   0.43     yes

Я пробовал:

is_descending = lambda a: np.all(a[:-1] > 1.5)
df["Outlook"] = df.groupby("ID").Value.rolling(4).apply(is_descending).fillna(0).apply(lambda x: "yes" if x > 0 else "no").to_list()

1 Ответ

2 голосов
/ 05 мая 2020

Вы можете использовать groupby().rolling() с np.where:

df['Outlook'] = np.where(df.groupby('ID')['Value'].rolling(4).max() < 1.5, 'yes', 'no')

Вывод:

   ID        Date  Value Outlook
0   A  2019-10-10   1.60      no
1   A  2019-10-11   0.85      no
2   A  2019-10-12   1.49      no
3   A  2019-10-13   1.12      no
4   A  2019-10-14   0.85     yes
5   B  2019-10-10   5.60      no
6   B  2019-10-11   0.55      no
7   B  2019-10-13   1.49      no
8   B  2019-10-13   2.12      no
9   B  2019-10-14   7.85      no
10  C  2019-10-10   1.36      no
11  C  2019-10-11   0.45      no
12  C  2019-10-12   1.29      no
13  C  2019-10-13   1.32     yes
14  C  2019-10-14   0.43     yes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...