潘达斯数据框架。复杂的线性插值[英] Pandas DataFrame: Complex linear interpolation

本文是小编为大家收集整理的关于潘达斯数据框架。复杂的线性插值的处理方法,想解了潘达斯数据框架。复杂的线性插值的问题怎么解决?潘达斯数据框架。复杂的线性插值问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个包含 4 个部分的数据框

第 1 部分:产品详情

第 2 部分:6 基于一系列模拟的潜在产品价值

第 3 部分:模拟输入参数的上限和下限

第 4 部分:输入参数的随机生成值

<小时>

第 2 部分是通过在上限和下限之间以相等的间隔对产品进行定价而生成的.

我需要取第 4 节中的值并计算出相应的产品值.这是此数据框的可能设置:

table2 = pd.DataFrame({
        'Product Type': ['A', 'B', 'C', 'D'],
        'State_1_Value': [10, 11, 12, 13],
    'State_2_Value': [20, 21, 22, 23],
    'State_3_Value': [30, 31, 32, 33],
    'State_4_Value': [40, 41, 42, 43],
    'State_5_Value': [50, 51, 52, 53],
    'State_6_Value': [60, 61, 62, 63],
    'Lower_Bound': [-1, 1, .5, 5],
    'Upper_Bound': [1, 2, .625, 15],
    'sim_1': [0, 0, .61, 7],
    'sim_2': [1, 1.5, .7, 9],
    })

>>> table2
   Lower_Bound Product Type  State_1_Value  State_2_Value  State_3_Value  \
0         -1.0            A             10             20             30   
1          1.0            B             11             21             31   
2          0.5            C             12             22             32   
3          5.0            D             13             23             33   

   State_4_Value  State_5_Value  State_6_Value  Upper_Bound  sim_1  sim_2  
0             40             50             60        1.000    0.0    1.0  
1             41             51             61        2.000    0.0    1.5  
2             42             52             62        0.625    0.61    0.7  
3             43             53             63       15.000    7.0    9.0  

我将通过这个计算的几个例子来说明我的问题是什么.

产品 A - sim_2这里的输入是 1.0.这等于该产品的上限.因此模拟值相当于state_6的值 - 60

产品 B - sim_2这里的输入是 1.5.LB 到 UB 的范围是 (1,2),因此 6 个状态是 {1,1.2,1.4,1.6,1.8,2}.1.5正好在state_3的中间,state_3的值为31,state 4的值为41.因此模拟值为36.

产品 C - sim_1这里的输入是 0.61.LB 到 UB 的范围是 (.5,.625),因此 6 个状态是 {.5,.525,.55,.575,.6,.625}..61 介于状态 5 和 6 之间.具体而言,它将落入的桶将是 5*(.61-.5)/(.625-.5)+1 = 5.4(乘以 5,因为这是数字间隔 - 你可以用其他方式计算它并得到相同的结果).然后为了计算值,我们使用该桶对状态 5 和状态 6 的值进行加权:(62-52)*(5.4-5)+52 = 56.

产品 B - sim_1这里的输入是 0,低于 1 的下限.因此我们需要外推该值.我们使用与上面相同的公式,我们只是使用状态 1 和状态 2 的值来推断.桶将是 5*(0-1)/(2-1)+1 = -4.11和21处使用的两个值,所以取值为(21-11)*(-4-1)+11= -39

我还简化了问题以尝试将解决方案可视化,我的最终代码需要在 500 个值和 10,000 个模拟上运行,并且数据框将有大约 200 行.

以下是我用于插值的公式,尽管我并没有专门介绍它们.

桶 = N*(sim_value-LB)/(UB-LB) + 1其中 N 是区间数

那么nLower是桶正下方的状态值,nHigher是桶正上方的状态值.如果桶在 UB/LB 之外,则强制 nLower 和 nHigher 为前两个或最后两个值.

Final_value = (nHigher-nLower)*(Bucket1 - number_value_of_nLower)+nLower

总而言之,我的问题是如何根据提供的输入数据组合生成最终结果.对我来说最具挑战性的部分是如何将 Bucket 编号连接到 nLower 和 nHigher 值.

推荐答案

我在这里发布了一个没有循环的优秀解决方案:

避免熊猫数据帧循环的替代方法

df= pd.DataFrame({
            'Product Type': ['A', 'B', 'C', 'D'],
            'State_1_Value': [10, 11, 12, 13],
        'State_2_Value': [20, 21, 22, 23],
        'State_3_Value': [30, 31, 32, 33],
        'State_4_Value': [40, 41, 42, 43],
        'State_5_Value': [50, 51, 52, 53],
        'State_6_Value': [60, 61, 62, 63],
        'Lower_Bound': [-1, 1, .5, 5],
        'Upper_Bound': [1, 2, .625, 15],
        'sim_1': [0, 0, .61, 7],
        'sim_2': [1, 1.5, .7, 9],
        })


buckets = df.ix[:,-2:].sub(df['Lower_Bound'],axis=0).div(df['Upper_Bound'].sub(df['Lower_Bound'],axis=0),axis=0) * 5 + 1
low = buckets.applymap(int)
high = buckets.applymap(int) + 1
low = low.applymap(lambda x: 1 if x < 1 else x)
low = low.applymap(lambda x: 5 if x > 5 else x)
high = high.applymap(lambda x: 6 if x > 6 else x)
high = high.applymap(lambda x: 2 if x < 2 else x)
low_value = pd.DataFrame(df.filter(regex="State|Type").values[np.arange(low.shape[0])[:,None], low])
high_value = pd.DataFrame(df.filter(regex="State|Type").values[np.arange(high.shape[0])[:,None], high])
df1 = (high_value - low_value).mul((buckets - low).values) + low_value
df1['Product Type'] = df['Product Type']

本文地址:https://www.itbaoku.cn/post/1727744.html