微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python:计算曲线下的面积

如何解决Python:计算曲线下的面积

我有带有 2 列“x”、“y”的 Pandas DataFrame:

internal Dictionary<string,string> SplitTextByHtmlTags(string input)
{
    var result = new Dictionary<string,string>();

    //  Iterating through a string
    for (var i = 0; i < input.Length; i++)
    {
        //  Detecting the opening of the tag
        if (input[i] == '<')
        {
            string 
                tag = "",//  Name of the tag
                content = "";   //  Content of the tag

            //  Iterating over the tag
            for (int j = i+1; j < input.Length; j++)
            {
                /**
                    * If alphabetic characters are being iterated over,* then,most likely,this is the name of the tag.
                    */
                if (!input[j].IsLetter())
                {
                    //  As soon as any character that is not a letter occurs
                    for (int k = j; k < input.Length; k++)
                    {
                        //  Looking for the end of the tag
                        if (input[k] == '>')
                        {
                            //  Sorting through the contents of the tag
                            for (int l = k+1; l < input.Length; L++)
                            {
                                if (input[l] != '<')
                                {
                                    content += input[l];

                                    /*
                                    * We move the "cursor" of the main loop
                                    * to the place where the tag opening symbol was found.
                                    */
                                    i = l;

                                    //  We put the found values in the map
                                    result.Add(tag,content);

                                    break;
                                }
                            }
                            break;
                        }
                    }
                }
                else tag += input[j];
            }
        }
    }

    return result;
}

这是剧情:

enter image description here

我想分别获得高于 y=0 和低于 y=0 的三角形区域。

有没有简单的方法可以做到这一点?

我尝试使用集成,但似乎我做错了什么:

tmp = pd.DataFrame()
tmp['x'] = [1,2,5,9,12,14]
tmp['y'] = [0,1,-2,-1,1] 
tmp.plot(x = 'x',y = 'y')

ax = plt.gca()
ax.set_aspect('equal')
ax.grid(True,which='both')


ax.axhline(y=0,color='k')
ax.axvline(x=0,color='k')
plt.show()

这是一个更小/更简单的代码,用于显示我想要做什么。其实我的数据是相当大的。 我想我可以通过在 y = 0 处添加相应的 (x,y) 值来达到预期的结果,但我想知道是否存在可以完成类似工作的现有函数

解决方法

我希望你所说的面积是指 x 轴和曲线之间的面积,因为不可能有开放曲线的面积,所以基于这个假设,我还假设 x 始终是一个递增的数字
如果您检查 pos 和 neg 数据框,它们会变成与您想要的完全不同的形状。要计算面积,您需要分别计算x轴上下所有图形的面积,即识别所有x交点并找到交点之间的面积

我已经编写了一个通用代码,您仍然需要添加边缘情况,其中信号不是作为拦截开始或结束

tmp['change'] = tmp['y']*tmp['y'].shift(1)<0 ## points before which intercept would be found
tmp['slope']=(tmp['y']-tmp['y'].shift(1))/(tmp['x']-tmp['x'].shift(1))  ## identify slope
tmp['intersection']=-tmp['y']/tmp['slope']+tmp['x']  ## identify point of intersection
intersections=tmp[tmp['change']==True]  ## only take intersection from points where sign of 'y has changed

intersections=intersections[['intersection']]
intersections.rename(columns={"intersection":"x"},inplace=True)
intersections['y']=int(0)

tmp = tmp[['x','y']]
tmp=tmp.append(intersections)
tmp=tmp.sort_values(by='x')
tmp=tmp.reset_index(drop=True)

crossing = tmp[tmp['y']==0].index  ## points between which area is to be identified
area=0
for i in range(len(crossing)-1):
    area_tmp=integrate.trapz(tmp[crossing[i]:crossing[i+1]+1]['y'],tmp[crossing[i]:crossing[i+1]+1]['x'])
    area+=abs(area_tmp)
    # print(area_tmp)
print(area)

这给出了 10 的答案,您仍然需要为最后一个三角形添加边缘情况

P.S:无法评论问题

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。