Вычисление% увеличения / уменьшения для тренда в фрейме данных

#python #pandas #dataframe #calculation

#python #pandas #фрейм данных #вычисление

Вопрос:

очень новый для Python и pandas. У меня есть файл данных, в котором есть столбец тренда (-1 для уменьшения, 0 для нейтрального и 1 для увеличения) и столбец данных (пример ниже). Я пытаюсь вычислить% увеличения / уменьшения для каждого из сегментов тренда в этом файле. Например, в строке 1-8 он снизился на -1,21%, в строке 11-20 — на 0,40% и т.д.

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

Любая помощь будет принята с благодарностью. Спасибо

 trend,temp,,
-1,9.321,,
-1,9.305,,
-1,9.296,,
-1,9.288,,
-1,9.265,,
-1,9.241,,
-1,9.221,,
-1,9.208,,
0,9.201,,
0,9.198,,
1,9.203,,
1,9.206,,
1,9.21,,
1,9.215,,
1,9.218,,
1,9.223,,
1,9.25,,
1,9.28,,
1,9.235,,
1,9.241,,
-1,9.24,,
-1,9.237,,
-1,9.23,,
-1,9.227,,
-1,9.221,,
-1,9.217,,
-1,9.212,,
-1,9.208,,
-1,9.204,,
0,9.201,,
  

Ответ №1:

Вы можете использовать .groupby для поиска непрерывных групп, а затем преобразовать их с помощью пользовательской функции:

 df['perc'] = df.groupby((df['trend'] != df['trend'].shift(1)).cumsum())['temp'].transform(lambda x:  (x.values[-1] - x.values[0])/(x.values[0])) * (df['trend'] != 0) * 100
print(df)
  

С принтами:

     trend   temp      perc
0  -1      9.321 -1.212316
1  -1      9.305 -1.212316
2  -1      9.296 -1.212316
3  -1      9.288 -1.212316
4  -1      9.265 -1.212316
5  -1      9.241 -1.212316
6  -1      9.221 -1.212316
7  -1      9.208 -1.212316
8   0      9.201 -0.000000
9   0      9.198 -0.000000
10  1      9.203  0.412909
11  1      9.206  0.412909
12  1      9.210  0.412909
13  1      9.215  0.412909
14  1      9.218  0.412909
15  1      9.223  0.412909
16  1      9.250  0.412909
17  1      9.280  0.412909
18  1      9.235  0.412909
19  1      9.241  0.412909
20 -1      9.240 -0.389610
21 -1      9.237 -0.389610
22 -1      9.230 -0.389610
23 -1      9.227 -0.389610
24 -1      9.221 -0.389610
25 -1      9.217 -0.389610
26 -1      9.212 -0.389610
27 -1      9.208 -0.389610
28 -1      9.204 -0.389610
29  0      9.201  0.000000
  

Затем вы можете дополнительно сгруппировать:

 print( df.groupby((df['trend'] != df['trend'].shift(1)).cumsum())['perc'].first() )
  

С принтами:

 trend
1   -1.212316
2   -0.000000
3    0.412909
4   -0.389610
5    0.000000
Name: perc, dtype: float64