#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