首页 > 解决方案 > 如何计算斜率 b/w 2 点?

问题描述

我有一个df如下:

ContextID   EscRF_P2P_Volt_V    StepID  Time_Elapsed
7289972 12.45421    1   0
7289972 12.45421    1   0.055
7289972 12.45421    2   0.156
7289972 12.45421    2   0.487
7289972 12.45421    2   1.477
7289972 12.45421    2   2.477
7289972 13.18681    2   3.477
7289972 12.45421    2   4.487
7289972 12.45421    2   5.993
7289972 12.45421    2   6.545
7289972 12.45421    5   7.983
7289972 12.45421    5   8.993
7289972 13.18681    5   9.993
7289972 13.18681    5   10.393
7289972 12.45421    5   11.993
7289972 12.45421    5   13.093
7289972 12.45421    5   13.384
7289972 12.45421    5   14.388
7289972 12.45421    5   15.386
7289972 12.45421    5   16.386
7289972 12.45421    5   17.396
7289972 12.45421    5   18.406
7289972 12.45421    5   19.396
7289972 11.72161    5   20.396
7289972 12.45421    5   21.396
7289972 12.45421    7   22.386
7289972 12.45421    7   23.456
7289972 13.18681    7   24.404
7289972 12.45421    12  25.443
7289972 13.18681    12  26.443
7289972 11.72161    12  27.443
7289972 12.45421    12  28.453
7289972 13.18681    12  29.443
7289972 12.45421    12  30.443
7289972 12.45421    12  31.443
7289972 12.45421    15  32.472
7289972 27.10623    15  33.444
7289972 27.10623    16  34.443
7289972 22.71062    16  35.443
7289972 22.71062    17  36.443
7289972 622.7106    19  37.503
7289972 622.7106    19  38.513
7289972 622.7106    19  39.503
7289972 622.7106    19  40.503
7289972 622.7106    19  41.503
7289972 622.7106    19  42.503
7289972 622.7106    19  43.503
7289972 622.7106    19  44.503
7289972 622.7106    19  45.532
7289972 622.7106    19  46.502
7289972 622.7106    19  47.501
7289972 622.7106    19  48.501
7289972 622.7106    19  49.501
7289972 622.7106    19  50.501

我想做的是计算范围Time_Elapsed并将其拆分为 10 个部分,并计算每个部分的斜率,其中x&Time_ElapsedyEscRF_P2P_Volt_V

我知道我可以将斜率定义为:

def slope(x1, y1, x2, y2):
    m = (y2-y1)/(x2-x1)
    return m

但我无法正确实施。

关于如何完成的任何建议?

输出:

0-5 之间的第一个间隔的输出必须是这样的:

slope = (12.45421-12.45421)/(5-0)

对于 5-10 之间的第二个间隔

slope = (13.18681-12.45421)/(10-5)

等等...

如果 中 没有精确值Time_Elapsed,就像没有 一样10,那么在这种情况下,我们EscRF_P2P_Volt_V取值9.993

标签: pythonpython-3.xpandas

解决方案


您可以添加具有 10 个组 ID 的另一列,然后使用groupby并计算每个组中 EscRF_P2P_Volt_V 列的最后一个减号除以 Time_Elapsed 列的最后一个减号:

df['grpNo'] = df.Time_Elapsed // 5.0502

如果您有一个从 0 ... n-1 的正常计数索引(但您没有发布),则 grpNo 计算的更通用方法:

df['grpNo'] = df.index.values // (len(df)/10)

但请注意,它们不会导致相同的分组,因此斜率的结果也会有所不同。实现您想要使用的分组取决于您...

grpd = df.groupby('grpNo')

(grpd.EscRF_P2P_Volt_V.last() - grpd.EscRF_P2P_Volt_V.first()) / (grpd.Time_Elapsed.last() - grpd.Time_Elapsed.first())

# grpNo
# 0.0      0.000000
# 1.0      0.183150
# 2.0     -0.183379
# 3.0      0.000000
# 4.0      0.365569
# 5.0      0.183150
# 6.0      3.663005
# 7.0    147.783246
# 8.0      0.000000
# 9.0      0.000000
# dtype: float64

基于索引的分组结果

# grpNo
# 0.0      0.000000
# 1.0     -0.162583
# 2.0      0.000000
# 3.0      0.000000
# 4.0      0.146286
# 5.0      0.183150
# 6.0      3.663005
# 7.0    118.577071
# 8.0      0.000000
# 9.0      0.000000
# dtype: float64

这里不同分组的组大小比较:

   Index based  Time based
0  6            8
1  5            5
2  6            5
3  5            5
4  6            5
5  5            5
6  5            5
7  6            5
8  5            5
9  5            6

推荐阅读