Я пытаюсь интерполировать значения с постоянными значениями координат и изменяющимися значениями скорости ветра, которые у меня есть в одном текстовом файле. Используя это определение:
def bary_interpol (inter_cor_x1, inter_cor_x2, inter_cor_x3, inter_cor_y1,
inter_cor_y2, inter_cor_y3, inter_cor_px, inteR_cor_py,
inter_wind_v1, inter_wind_v2, inter_wind_v3):
W_v1 = ((inter_cor_y2-inter_cor_y3)*(inter_cor_px-inter_cor_x3)+
(inter_cor_x3-inter_cor_x2)*(inter_cor_py-inter_cor_y3))/((inter_cor_y2-inter_cor_y3)*(inter_cor_x1-inter_cor_x3)+
(inter_cor_x3-inter_cor_x2)*(inter_cor_y1-inter_cor_y3))
W_v2 = ((inter_cor_y3-inter_cor_y1)*(inter_cor_px-inter_cor_x3)+
(inter_cor_x1-inter_cor_x3)*(inter_cor_py-inter_cor_y3))/((inter_cor_y2-inter_cor_y3)*(inter_cor_x1-inter_cor_x3)+
(inter_cor_x3-inter_cor_x2)*(inter_cor_y1-inter_cor_y3))
W_v3 = 1 - W_v1 - W_v2
inter_wind_pv = (W_v1 * inter_wind_v1) + (W_v2 * inter_wind_v2) + (W_v3 * inter_wind_v3)
return inter_wind_pv
Это определение работает для меня сейчас, но только когда все переменные постоянны. А вот inter_wind_v1, inter_wind_v2 и inter_wind_v3 нужно добавить из текстового файла.
Значения в столбце (FF) я уже нашел по идентификационному номеру, который находится в той же строке, что и FF. STN_V1 на самом деле означает 235. Я использовал этот метод:
inter_wind_v1 = wind[wind['STN'] == STN_v1]
print(inter_wind_v1)
inter_wind_v2 = wind[wind['STN'] == STN_v2]
print(inter_wind_v2)
inter_wind_v3 = wind[wind['STN'] == STN_v3]
print(inter_wind_v3)
Это напечатает выбранные данные, которые мне нужны.
STN DT FF
10464 235 20210101 20
10465 235 20210101 30
10466 235 20210101 20
10467 235 20210101 20
10468 235 20210101 20
... ... ...
20923 235 20220312 40
20924 235 20220312 50
20925 235 20220312 50
20926 235 20220312 50
20927 235 20220312 60
[10464 rows x 3 columns]
STN DT FF
20928 242 20210101 80
20929 242 20210101 60
................................ etc.
Но я не могу понять, как сделать новый список или фрейм данных с определением, которое я сделал для интерполяции.
Итак, я пытаюсь создать интерполированный новый столбец FF, объединяющий три столбца FF, указанные в определении как inter_wind_v.
Я надеюсь, что кто-нибудь может помочь мне с этим.
Я считаю, что это может быть способ сделать то, что задает ваш вопрос:
import pandas as pd
def bary_interpol (inter_cor_x1, inter_cor_x2, inter_cor_x3, inter_cor_y1,
inter_cor_y2, inter_cor_y3, inter_cor_px, inter_cor_py,
inter_wind_v1, inter_wind_v2, inter_wind_v3):
W_v1 = ((inter_cor_y2-inter_cor_y3)*(inter_cor_px-inter_cor_x3)+
(inter_cor_x3-inter_cor_x2)*(inter_cor_py-inter_cor_y3))/((inter_cor_y2-inter_cor_y3)*(inter_cor_x1-inter_cor_x3)+
(inter_cor_x3-inter_cor_x2)*(inter_cor_y1-inter_cor_y3))
W_v2 = ((inter_cor_y3-inter_cor_y1)*(inter_cor_px-inter_cor_x3)+
(inter_cor_x1-inter_cor_x3)*(inter_cor_py-inter_cor_y3))/((inter_cor_y2-inter_cor_y3)*(inter_cor_x1-inter_cor_x3)+
(inter_cor_x3-inter_cor_x2)*(inter_cor_y1-inter_cor_y3))
W_v3 = 1 - W_v1 - W_v2
inter_wind_pv = (W_v1 * inter_wind_v1) + (W_v2 * inter_wind_v2) + (W_v3 * inter_wind_v3)
return inter_wind_pv
wind_records = [
{'STN':235, 'DT':20210101, 'FF':20},
{'STN':235, 'DT':20210101, 'FF':30},
{'STN':235, 'DT':20210101, 'FF':20},
{'STN':236, 'DT':20210101, 'FF':20},
{'STN':236, 'DT':20210101, 'FF':20},
{'STN':236, 'DT':20210101, 'FF':40},
{'STN':237, 'DT':20210101, 'FF':50},
{'STN':237, 'DT':20210101, 'FF':50},
{'STN':237, 'DT':20210101, 'FF':50}
]
wind = pd.DataFrame(wind_records)
STN_v1 = 235
inter_wind_v1 = wind[wind['STN'] == STN_v1].reset_index()
print(f"inter_wind_v1:\n{inter_wind_v1}")
STN_v2 = 236
inter_wind_v2 = wind[wind['STN'] == STN_v2].reset_index()
print(f"inter_wind_v2:\n{inter_wind_v2}")
STN_v3 = 237
inter_wind_v3 = wind[wind['STN'] == STN_v3].reset_index()
print(f"inter_wind_v3:\n{inter_wind_v3}")
interp = pd.DataFrame(inter_wind_v1['FF']).rename(columns = {'FF':'inter_wind_v1'})
interp['inter_wind_v2'] = inter_wind_v2['FF']
interp['inter_wind_v3'] = inter_wind_v3['FF']
print(interp)
inter_cor_x1, inter_cor_x2, inter_cor_x3 = 0.1, 0.01, -0.1
inter_cor_y1, inter_cor_y2, inter_cor_y3 = 0.2, 0.05, -0.1
inter_cor_px, inter_cor_py = 0.22, -0.22
def doInterp(inter_wind_v1, inter_wind_v2, inter_wind_v3):
return bary_interpol (inter_cor_x1, inter_cor_x2, inter_cor_x3, inter_cor_y1,
inter_cor_y2, inter_cor_y3, inter_cor_px, inter_cor_py,
inter_wind_v1, inter_wind_v2, inter_wind_v3)
interp['inter_wind_pv'] = interp.apply(lambda x: doInterp(x['inter_wind_v1'], x['inter_wind_v2'], x['inter_wind_v3']), axis=1)
print(interp)
Выход:
inter_wind_v1:
index STN DT FF
0 0 235 20210101 20
1 1 235 20210101 30
2 2 235 20210101 20
inter_wind_v2:
index STN DT FF
0 3 236 20210101 20
1 4 236 20210101 20
2 5 236 20210101 40
inter_wind_v3:
index STN DT FF
0 6 237 20210101 50
1 7 237 20210101 50
2 8 237 20210101 50
inter_wind_v1 inter_wind_v2 inter_wind_v3
0 20 20 50
1 30 20 50
2 20 40 50
inter_wind_v1 inter_wind_v2 inter_wind_v3 inter_wind_pv
0 20 20 50 -538.0
1 30 20 50 -742.0
2 20 40 50 262.0
Я сделал следующие предположения:
STN_v1
, STN_v2
и STN_v3
и содержимое фрейма данныхinter_wind_v1
, inter_wind_v2
и inter_wind_v3
bary_interpol()
являются скалярами (постоянными), и что вы хотите многократно вызывать функцию, используя одни и те же значения аргументов, за исключением inter_wind_v1
, inter_wind_v2
и inter_wind_v3
@SimonDL Это сработало для вас?