Применение определения к 3 выбранным частям в одном столбце в фрейме данных и 8 фиксированным значениям

Я пытаюсь интерполировать значения с постоянными значениями координат и изменяющимися значениями скорости ветра, которые у меня есть в одном текстовом файле. Используя это определение:

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.

Я надеюсь, что кто-нибудь может помочь мне с этим.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что это может быть способ сделать то, что задает ваш вопрос:

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 Это сработало для вас?

constantstranger 19.03.2022 19:13

Другие вопросы по теме