利用Python和Sprak求曲线与X轴上方的面积

news2025/7/21 5:11:40

有n组标本(1, 2, 3, 4), 每组由m个( , , ...)元素( , )组成(m值不定), . 各组样本的分布 曲线如下图所示. 通过程序近似实现各曲线与oc, cd直线围成的⾯积.

在这里插入图片描述

思路

  1. 可以将图像分成若干个梯形,每个梯形的底边长为(Xn+1 - Xn-1),面积为矩形的一半,其面积 = (底边长 X 高)/2,即S = (Xn+1 - Xn-1) * (Yn+1 + Yn+2),对于整个图形,面积为所有梯形面积之和。
    [图片]
  2. 求曲线与其下方x轴的面积,本质上是一个求积分的过程。可以对所有点进行积分,可以调用np.tapz(x, y)来求

代码

"""Calculate the area between the coordinates and the X-axis
"""

import typing
from pandas import read_parquet

def calc_area(file_name: str) -> typing.Any:
    """⾯积计算.
    Args:
    file_name: parquet⽂件路径, eg: data.parquet
    Returns:
    计算后的结果
    """

    res = []

    # Load data from .parquet
    initial_data = read_parquet(file_name)

    # Get number of groups
    group_numbers = initial_data["gid"].drop_duplicates().unique()

    # Loop through the results for each group
    for i in group_numbers:
        data = initial_data[initial_data["gid"] == i]
        data = data.reset_index(drop=True)

        # Extract the list of x\y
        x_coordinates = data["x"]
        y_coordinates = data["y"]

        # Calculate area between (x[i], y[i]) and (x[i+1], y[i+1])
        rect_areas = [
            (x_coordinates[i + 1] - x_coordinates[i])
            * (y_coordinates[i + 1] + y_coordinates[i])
            / 2
            for i in range(len(x_coordinates) - 1)
        ]

        # Sum the total area
        result = sum(rect_areas)
        res.append(result)

        # Also we can use np for convenience
        # import numpy as np
        # result_np = np.trapz(y_coordinates, x_coordinates)
    return res

calc_area("./data.parquet")

或者使用pyspark

"""Calculate the area between the coordinates and the X-axis
"""

import typing
from pyspark.sql import Window
from pyspark.sql.functions import lead, lit
from pyspark.sql import SparkSession

def calc_area(file_name: str) -> typing.Any:
    """⾯积计算.
    Args:
    file_name: parquet⽂件路径, eg: data.parquet
    Returns:
    计算后的结果
    """

    res = []

    # Create a session with spark
    spark = SparkSession.builder.appName("Area Calculation").getOrCreate()

    # Load data from .parquet
    initial_data = spark.read.parquet(file_name, header=True)

    # Get number of groups
    df_unique = initial_data.dropDuplicates(subset=["gid"]).select("gid")
    group_numbers = df_unique.collect()

    # Loop through the results for each group
    for row in group_numbers:
        # Select a set of data
        data = initial_data.filter(initial_data["gid"] == row[0])

        # Adds a column of delta_x to the data frame representing difference
        # from the x value of an adjacent data point
        window = Window.orderBy(data["x"])
        data = data.withColumn("delta_x", lead("x").over(window) - data["x"])

        # Calculated trapezoidal area
        data = data.withColumn(
            "trap",
            (
                data["delta_x"]
                * (data["y"] + lit(0.5) * (lead("y").over(window) - data["y"]))
            ),
        )

        result = data.agg({"trap": "sum"}).collect()[0][0]

        res.append(result)
    return res

calc_area("./data.parquet")

提高计算的效率

  • 可以使用更高效的算法,如自适应辛普森方法或者其他更快的积分方法
  • 可以在数据上进行并行化处理,对pd DataFrame\spark DataFrame进行分区并使用分布式计算
  • 在使用spark的时候可以为window操作制定分区来提高性能
  • 以下为与本例无关的笼统的提高效率的方法:
  1. 并行计算:使用多核CPU或分布式计算系统,将任务分解成多个子任务并行处理。
  2. 数据压缩:压缩大数据以减少存储空间和带宽,加快读写速度。
  3. 数据分块:对大数据进行分块处理,可以减小内存需求并加快处理速度。
  4. 缓存优化:优化缓存策略,减少磁盘访问和读取,提高计算效率。
  5. 算法优化:使用高效率的算法,比如基于树的算法和矩阵算法,可以提高计算效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/368603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

原创壁纸小程序独立后台(1.3.5版本介绍)

1、新版本开发目的 历经前两次版本迭代,本人发现在整个系统的架构方面存在一定的缺陷,这种缺陷就是前后端不分离,导致在后期的维护方面遇到了很多问题。 那么这次版本更新并没有带来很多新的功能,而是重构了系统并优化UI&#x…

【PyQt5图形界面编程(2)】:创建工程

创建工程 一、创建工程二、开始开发1、运行Qt5Designer,创建QT窗口2、运行pyUIC,转换xx.ui成xx.py3、main.py中引用xx.py中的类4、打包main.py成main.exe来发布5、执行终端报警处理方法三、其他(如果涉及)1、配置环境变量一、创建工程 采用虚拟环境来创建工程 相关的paka…

STM32FreeRTOS - 按键实现任务挂起和恢复

STM32f103C8T6 FreeRTOS - 按键实现任务挂起和恢复,按键按下时,LED任务执行,led闪烁,当led任务挂起,Led停止闪烁。1.STM32CubeMX 创建任务1.1配置GPIO按键配置外部中断触发GPIO绿灯,红灯配置输出模式1.2配置…

Android中级——色彩处理和图像处理

色彩处理 通过色彩矩阵处理 色彩矩阵介绍 图像的RGBA可拆分为一个4行5列的矩阵和5行1列矩阵相乘 其中4行5列矩阵即为ColorMatrix,可通过调整ColorMatrix间接调整RGBA 第一行 abcde 决定新的 R第二行 fghij 决定新的 G第三行 klmno 决定新的 G第四行 pqrst 决定新…

Ubuntu64位下安装Anaconda3的详细过程

Ubuntu下安装Anaconda的详细过程 下载 Anaconda:首先,您需要在 Anaconda 的官网上下载适合您的 Linux 版本的安装包。您可以使用以下命令下载最新版本: wget https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh下载完毕后…

春季 3 月 · CSM 认证周末班【提前报名特惠】“全球金牌课程”CST 导师亲授

为什么“模块化分时段”单元教学 ☆ 有脑科学研究资料揭示: 成人学习者持续 3.5 小时已经达到极限,新模式教学,给学习者留有一些时间和空间去消化吸收,反思回顾(Reflection),讲师布置一些小作业,让学员课后去练习&…

React Draggable 实现图片拖拽

React Draggable 实现拖拽 React Draggable 是 react 生态中,最好用的拖拽实现库之一。如果你的应用中需要实现拖拽功能,可以尝试用 react-draggable,它可以满足多数情况下的拖拽需求,比如一个弹出设置浮窗,可以相互遮…

2月更新!EasyOps又迎来新升级,解锁9大新特性

又到了每月产品盘点时刻,9大新功能上线和升级优化,涉及Hyperlnsight超融合持续观测平台、CMDB立体化资源管理平台、DevOps持续交付平台、AutoOps自动化运维平台、EasyHub资源共享平台,在不断的技术创新过程中,进一步加速IT运维效率…

Android framework socketpair

简述 在Linux中,socketpair函数可以用于创建一对相互连接的、通信域为AF_UNIX的套接字,其中一个套接字可用于读取,另一个套接字可用于写入。可以使用这对套接字在同一进程内进行进程间通信(IPC)。 以下是使用socketp…

python 学习

1.转义字符 字符串前加r,使转义字符不起作用 print(r"hello\t world") 2.数据类型 python数据类型分为int,float,bool,str 整数类型的形式: print("二进制0b开头", 0b10111001) print("八进制0o开头", 0o1257436) print("…

Unable to connect to Redis无法连接到Redis

文章目录项目场景:问题描述原因分析:解决方案:项目场景: 提示:这里简述项目相关背景: 在某个项目中的提交按钮不好用 org.springframework.data.redis.RedisConnectionFailureException: Unable to con…

【线程基础篇】

进程 进程本质是一个正在执行的程序。程序运行时,系统会创建进程,并给进程分配独立的内存空间。 CPU时间片切换 CPU时间片切换时,进程需要从切换之前运行的位置开始执行,所以进程还包括程序计数器、堆栈指针。 单核CPU时&…

如何拼接字符串-探究“+号拼接”/“StringBuilder”在不同场景下的效率问题

拼接字符串,在程序开发中很常见也很常用,大家都会:号拼接String.concat(String str)StringBuffer / StringBuilder但这里今天主要探究“号拼接”,“StringBuilder”在不同场景下的效率问题。不都说 StringBuilder 在处理字符串拼接…

保持超低温环境新方法:功耗降至十分之一!

(图片来源:网络)量子比特是量子计算机的主要构建部分,然而热量会导致量子比特容易出错,因此量子系统通常保存在超低温稀释制冷机内,可以将温度保持在绝对零度(−273.15℃)以上。但是…

消费复苏迎“春”暖,服装行业如何开启“狂飙”模式?

2023年开年前2个月,全国多地消费市场的“热度”一直在持续上涨,商场、餐馆、娱乐场所等消费市场人气旺盛,消费复苏的“暖”意十足,一幕幕“忙”起来、“热”起来的场景,让各行各业的商家都对未来充满了期待与信心。在消…

基于SpringBoot的外卖项目的优化

基于SpringBoot的外卖项目的优化1、缓存优化1.1、缓存短信验证码问题分析代码改造1.2、缓存菜品数据实现思路1.3、Spring Cache介绍常用注解CachePutCacheEvictCacheable使用方式1.4、缓存套餐数据实现思路代码改造2、读写分离2.1、主从复制存在的问题介绍配置配置主库--master…

获取浏览器硬件资源的媒体数据(拍照、录音、录频、屏幕共享)

目录一、window.navigator 对象包含有关访问者浏览器的信息取二、MediaDevices1.使用麦克风2.使用摄像头&#xff08;和音频一样&#xff09;3.拍照4.录屏三、MediaRecorder(录制,可录制音频视屏)一、window.navigator 对象包含有关访问者浏览器的信息取 <!DOCTYPE html>…

YZRJ面试

面试过程目录概述需求&#xff1a;设计思路实现思路分析1.自我介绍之类的2.http 和https 协议的区别3.进程和线程的区别4.vm 安装的nginx 和Mysql5.评价拓展实现参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full bu…

自然语言处理(NLP)之求近义词和类比词<MXNet中GloVe和FastText的模型使用>

这节主要就是熟悉MXNet框架中的两种模型&#xff1a;GloVe和FastText的模型(词嵌入名称)&#xff0c;每个模型下面有很多不同的词向量&#xff0c;这些基本都来自wiki维基百科和twitter推特这些子集预训练得到的。我们只需要导入mxnet.contrib中的text模块即可&#xff0c;这里…

模拟百度翻译-课后程序(JAVA基础案例教程-黑马程序员编著-第六章-课后作业)

【案例6-5】 模拟百度翻译 【案例介绍】 1.任务描述 大家对百度翻译并不陌生&#xff0c;本案例要求编写一个程序模拟百度翻译。用户输入英文之后搜索程序中对应的中文&#xff0c;如果搜索到对应的中文就输出搜索结果&#xff0c;反之给出提示。本案例要求使用Map集合实现英…