Косвенная билинейная интерполяция из таблицы

Справочная таблица Я хочу интерполировать значения двух сигналов напряжения, используя эту таблицу, и преобразовать их в соответствующие значения температуры. Я не хочу выполнять прямую билинейную интерполяцию.

например: T1: 1,721 В T2: 4,025 В

Шаг 1. Интерполируйте T1 по внутренней температуре. В Ch1 I получается 134,375 ° C.

Шаг 2: Из T2 определите возможную строку ожидаемого значения (от 250 до 300 ° C) в разделе Referenz, а T1 находится между 125 ° C и 140 ° C) в столбцах. Это дает мне следующую сетку: 3,608 3,616 4,462 4,468 Теперь я хотел бы вычислить соответствующие напряжения путем интерполяции (макс. И мин.). Я получаю 3,613 В и 4,46575 В.

Шаг 3: Используя два значения напряжения, рассчитанные на шаге 2, выполните интерполяцию по строкам. то есть между 250-300 ° C и 3,613 В -4,46575 В, чтобы найти температуру в ° C, соответствующую T2 = 4,025 В.

Есть ли способ сделать это, напрямую прочитав такую ​​таблицу как фрейм данных?

Я смог сделать это в Excel, используя индекс и сопоставление, и более длинный способ сделать это - последовательное чтение из таблицы. Например, такой код для достижения Шага 1:

internal=ref_table.loc[['Internal Temp. (Ch1)'],:].squeeze()
y=[20,85,100,125,140,150,160,170,180]
tit_p1=[]
for i in raw_data['T1 Intern']:
    j=np.interp(i,internal,y)
    tit_p1.append(j)
print(tit_p1)

Однако у меня есть много таблиц, с которыми нужно иметь дело, и было бы намного проще, если бы я мог каким-то образом преобразовать значения напряжения в температуру, используя таблицу в качестве сетки.

Любая помощь будет оценена по достоинству! Спасибо!


person hegdep    schedule 09.01.2018    source источник
comment
Не могли бы вы немного лучше объяснить эту процедуру? Как T1 и T2 связаны друг с другом и как именно вы используете результат шага 1 в остальных вычислениях? Значения напряжения в одной строке таблицы не являются однообразными, поэтому может быть сложно найти правильный столбец с помощью интерполяции.   -  person Thomas Kühn    schedule 09.01.2018
comment
@ ThomasKühn Это подробный расчет для двух точек выборки, которые у меня есть в качестве примера. Шаг 1: Tit = (Tit_max-Tit_min) / (Vch1_max-Vch1_min) * (T1-Vch1_max) + Tit_max = (140-125) / (1,817-1,561) * (1,721-1,817) + 140 = 134,375. Шаг 2: Vr_min = (Vch_max-Vch_min) / (Tit_max-Tit_min) * (Tit-Tit_max) + Vch_max = (3,616-3,608) / (140-125) * (134,375-140) + 3,616 = 3,613; аналогично для Vr_max. Шаг 3: T_ch = (Tr_max-Tr_min) / (Vr_max-Vr_min) * (T2-Vr_max) + Tr_max = (300-250) / (4.46575-3.613) * (4.025-4.46575) + 300 = 274,16   -  person hegdep    schedule 09.01.2018
comment
@ ThomasKühn Обычно на шаге 2 я располагаюсь между двумя столбцами в зависимости от значения T1. Затем, используя T2, я пытаюсь определить соответствующую температуру по меткам строк. T1 находится между 125 и 140 в метках столбцов, а T2 - между 250 и 300 в соответствии с метками строк. Итак, я интерполирую между 3,608 (125 ° C) и 3,616 (140 ° C), чтобы найти Vr_min, и между 4,402 (125 ° C) и 4,468 (140 ° C), чтобы найти Vr_max, чтобы найти входные данные для интерполяции по меткам строк в шаг 3.   -  person hegdep    schedule 09.01.2018


Ответы (1)


Это сработало для меня! Я отправляю ответ всем, кто пытается сделать что-то подобное.

import numpy as np
import pandas as pd
ref_table=pd.read_csv('Voltage Temp conversion_1.csv',encoding='ISO-8859-1',sep=';',index_col='Referenz')
ref_table=ref_table.dropna(how='all',axis=1)
ref_table=ref_table.dropna(how='all',axis=0)
print(ref_table)

T1=value
T2=value_2

ref_1=[]
for i in ref_table.iloc[2,:]:
    ref_1.append(i)
ref_1[:] = [value - x for x in ref_1]
idx=ref_1.index(min(i for i in ref_1 if i > 0))
T_it=np.interp(value,ref_table.iloc[2,idx:idx+2],ref_table.columns[idx:idx+2].astype(int))
ref_choose=ref_table.iloc[3:,idx:idx+2]
ref_2=[]
for i in ref_choose.iloc[:,0]:
     ref_2.append(i)
ref_2[:] = [value_2 - x for x in ref_2]
idx_2=ref_2.index(min(i for i in ref_2 if i > 0))
ref_fgrid=ref_choose.iloc[idx_2:idx_2+2,:]
Vr_min=np.interp(T_it,ref_fgrid.columns.astype(int),ref_fgrid.iloc[0,:])
Vr_max=np.interp(T_it,ref_fgrid.columns.astype(int),ref_fgrid.iloc[1,:])
T_ch=np.interp(value_2,[Vr_min,Vr_max],ref_choose.index.astype(int)[idx_2:idx_2+2])
    

Ваше здоровье!

person hegdep    schedule 18.01.2018