对数据框中单列中的 3 个选定部分和 8 个固定值应用定义

发布于 2025-01-15 16:25:31 字数 1997 浏览 3 评论 0原文

我正在尝试使用恒定坐标值和变化的风速值来插入值,这些值在一个文本文件中。使用这个定义:

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,将定义中引用为 inter_wind_v 的三个 FF 列组合起来。

我希望任何人都可以帮助我解决这个问题。

I am trying to interpolate values with constant coordinate values and changing wind speed values which I have in one text-file. With using this definition:

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

This definition works for me now but only when all variables are constant. But the inter_wind_v1, inter_wind_v2 and inter_wind_v3 need to be added from the text-file.

The values in column (FF) I have already found by the identification number which is in the same row as the FF. STN_V1 actually stands for 235. I used this method:

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)

This will print the selected data I needed.

          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.

But I can not figure out how to make a new list or data frame with the definition I made to interpolate.

So I am trying to make a interpolated new column FF of combining the three FF's column referenced as inter_wind_v in the definition.

I hope anybody can help me with this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烂人 2025-01-22 16:25:31

我相信这可能是满足您问题要求的一种方法:

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_v1STN_v2STN_v3< 的示例值/code> 且数据帧内容
  • 假定 inter_wind_v1inter_wind_v2inter_wind_v3 的项目数量相同
  • 假设 bary_interpol() 函数的其他参数是标量(常量),并且您希望使用相同的参数值重复调用该函数(inter_wind_v1 除外),<代码>inter_wind_v2和inter_wind_v3

I believe this may be a way to do what your question asks:

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)

Output:

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

I have made the following assumptions:

  • used sample values for STN_v1, STN_v2 and STN_v3 and the dataframe content
  • assumed that the number of items is the same for inter_wind_v1, inter_wind_v2 and inter_wind_v3
  • assumed that the other arguments of the bary_interpol() function are scalars (constant), and that you want to call the function repeatedly using the same argument values except for inter_wind_v1, inter_wind_v2 and inter_wind_v3
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文