Для калибровки системы мне нужно сравнить эталонные («ref») и тестовые («test») переменные. df выглядит так (раздел из df с> 3000 переменных):
df=pd.read_csv(file)
df
Time ref test
sec Q Q
1 nan nan
2 nan nan
3 5,00 4,89
4 5,08 5,00
5 4,93 4,97
6 nan nan
7 nan nan
8 14,83 14,96
9 14,87 15,13
10 14,72 14,83
11 nan nan
12 nan nan
13 nan nan
14 nan nan
15 24,37 24,35
16 24,29 24,39
17 24,28 24,50
18 24,26 24,41
19 nan nan
Для сравнения переменных «ref» и «test» мне нужно извлечь равнины с гистерезисом. Мог бы сделать это вручную:
grades = []
for row in df['ref']:
if row < 5,5:
grades.append('A')
elif row < 15,5:
grades.append('B')
elif row < 26:
grades.append('C')
else:
grades.append('Failed')
df['Result_Ref'] = grades
df.dropna(inplace=True)
Но функция должна оценивать «ref» и «test» по гистерезису (+-3%) и автоматически назначать A, B, C,.... Результат должен выглядеть так:
df
Time ref test Result_Ref
sec Q Q
3 5,00 4,89 A
4 5,08 5,00 A
5 4,93 4,97 A
8 14,83 14,96 B
9 14,87 15,13 B
10 14,72 14,83 B
15 24,37 24,35 C
16 24,29 24,39 C
17 24,28 24,50 C
18 24,26 24,41 C
поскольку время и шаги/равнины (A, B, C, .... Z) не ограничены (до 20), функция, которую я ищу, должна искать в df ('ref', 'test') для следующего (большой шаг. Что-то типа
when x(i+1)>x(i)), than append('A:Z')
и назначьте текущую переменную (1,2,3,.. или A, B, C,..) в столбец «Result_Rev».
Вот полный график к этому моменту полная калибровка с извлеченными равнинами Поскольку я новичок в python, я понятия не имею о такой функции;) Спасибо заранее
означает также написать, как я добрался до первого df (шаги программы между ними)? просто хотел уменьшить длину сообщения, потому что я решаю большинство функций с помощью математических операций. но спасибо за комментарий
Рассмотрите возможность использования разница качения:
df.dropna(inplace=True)
df['diff'] = df['ref'].diff()
Вы можете предпочесть дискретную производную. Просто разделите на разницу во времени.
Имея это в виду, как бы вы назначили текущую переменную, показывающую номер шага?
Пожалуйста, измените свой вопрос, чтобы отразить код, с которым вы сейчас работаете, или, в идеале, опубликуйте ответ на свой вопрос. (Да ТАК поощряет вам отвечать на вопросы, даже на вопрос, который вы задали!)
моим первым намерением было: def delta(i,x): for i in range(i+x, len(df)-x): if 0.97*df.loc[i+x,'ref']<=df.loc[i,'ref']<=1.03*df.loc[i+x,'ref']: df.loc[i, 'diff']=1 else: df.loc[i,'diff']=0 return
но df['diff'] = df['ref'].diff()
выглядит лучше.
Добро пожаловать в СО. Вы получите гораздо больше помощи, если попробуете сами, а затем, если у вас возникнут трудности, разместите вопрос о конкретной проблеме. ТАК пользователи не пишут код для вас.