python计算折线与坐标轴的面积(正负抵消)

计算下图中折线与y轴围成的面积,蓝色为负,黄色为正,正负抵消后的和。

  • 采用梯形面积和累加,
  • 由于业务需要,本例以130为边界,分别求50-130之间的面积,以及130-210之间的面积>

本例只给 ( 50 , x 1 ) , ( 70 , x 2 ) , ( 90 , x 3 ) , ( 130 , x 4 ) , ( 190 , x 5 ) , ( 230 , x 6 ) (50, x_1),(70, x_2),(90, x_3),(130, x_4),(190, x_5),(230, x_6)(50,x1)(70,x2)(90,x3)(130,x4)(190,x5)(230,x6),这 6 个点, 其中x 1 = 0 x_1=0x1=0

在这里插入图片描述

  • 区域1面积: 是一个三角形,为 底*高/2 即为:x 2 × ( 70 − 50 ) ÷ 2 x_2\times{(70-50)\div{2}}x2×(7050)÷2
  • 区域2面积:梯形面积,上底+下底*高/2,即为:( x 1 + x 2 ) × ( 90 − 70 ) ÷ 2 (x_1+x_2)\times{(90-70)\div{2}}(x1+x2)×(9070)÷2
  • 区域3面积:可以直接上底+下底*高/2,(已经过验证),分析过程,蓝色三角形和黄色三角形是相似三角形,。$$
    • 首先判断a = ∣ x 2 ∣ − ∣ x 3 ∣ a=\mid x_2 \mid-\mid{x_3}\mida=∣x2x3的大小,若a > 0 a>0a>0,而且1和2面积正负抵消,剩余就是求3的面积,即梯形3的面积则面积为( x 2 + ∣ x 3 ∣ ) × (x_2+\mid x_3\mid)\times{}(x2+x3)×
      在这里插入图片描述
  • 区域4,类似1区域3
  • 区域5,类似于区域3

复杂写法:

aera['down'] = df_10min_down.apply(lambda x: sum( \
    [0.5*(abs(i[0][0])/(abs(i[0][0])+abs(i[0][1])))*i[1]*i[0][0]*(1-(i[0][1]/i[0][0])**2) if i[0][0]*i[0][1] < 0 else 0.5*(i[0][0]+i[0][1])*i[1] \
     for i in zip(zip(x[:-1], x[1:]), height[:6])]), axis=1)
aera['up'] = df_10min_up.apply(lambda x: sum( \
    [0.5*(abs(i[0][0])/(abs(i[0][0])+abs(i[0][1])))*i[1]*i[0][0]*(1-(i[0][1]/i[0][0])**2) if i[0][0]*i[0][1] < 0 else 0.5*(i[0][0]+i[0][1])*i[1] \
     for i in zip(zip(x[:-1], x[1:]), height[6:])]), axis=1)

简化写法(推荐)

aera['down'] = df_10min_down.apply(lambda x: sum([0.5*(i[0][0]+i[0][1])*i[1] for i in zip(zip(x[:-1], x[1:]), height[:6])]), axis=1)
aera['up'] = df_10min_up.apply(lambda x: sum([0.5*(i[0][0]+i[0][1])*i[1] for i in zip(zip(x[:-1], x[1:]), height[6:])]), axis=1)

版权声明:本文为weixin_46713695原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。