丹东商城网站建设,logo在线设计生成器app,东营市信息网官网,宜昌seo优化有n组标本(1, 2, 3, 4), 每组由m个( , , ...)元素( , )组成(m值不定), . 各组样本的分布 曲线如下图所示. 通过程序近似实现各曲线与oc, cd直线围成的⾯积. 思路
可以将图像分成若干个梯形#xff0c;每个梯形的底边长为(Xn1 - Xn-1)#xff0c;面积为矩形的一半#xff0c…有n组标本(1, 2, 3, 4), 每组由m个( , , ...)元素( , )组成(m值不定), . 各组样本的分布 曲线如下图所示. 通过程序近似实现各曲线与oc, cd直线围成的⾯积. 思路
可以将图像分成若干个梯形每个梯形的底边长为(Xn1 - Xn-1)面积为矩形的一半其面积 (底边长 X 高)/2即S (Xn1 - Xn-1) * Yn1 Yn2对于整个图形面积为所有梯形面积之和。 [图片]求曲线与其下方x轴的面积本质上是一个求积分的过程。可以对所有点进行积分可以调用np.tapz(x, y)来求
代码
Calculate the area between the coordinates and the X-axis
import typing
from pandas import read_parquetdef calc_area(file_name: str) - typing.Any:⾯积计算.Args:file_name: parquet⽂件路径, eg: data.parquetReturns:计算后的结果res []# Load data from .parquetinitial_data read_parquet(file_name)# Get number of groupsgroup_numbers initial_data[gid].drop_duplicates().unique()# Loop through the results for each groupfor i in group_numbers:data initial_data[initial_data[gid] i]data data.reset_index(dropTrue)# Extract the list of x\yx_coordinates data[x]y_coordinates data[y]# Calculate area between (x[i], y[i]) and (x[i1], y[i1])rect_areas [(x_coordinates[i 1] - x_coordinates[i])* (y_coordinates[i 1] y_coordinates[i])/ 2for i in range(len(x_coordinates) - 1)]# Sum the total arearesult 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 rescalc_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 SparkSessiondef calc_area(file_name: str) - typing.Any:⾯积计算.Args:file_name: parquet⽂件路径, eg: data.parquetReturns:计算后的结果res []# Create a session with sparkspark SparkSession.builder.appName(Area Calculation).getOrCreate()# Load data from .parquetinitial_data spark.read.parquet(file_name, headerTrue)# Get number of groupsdf_unique initial_data.dropDuplicates(subset[gid]).select(gid)group_numbers df_unique.collect()# Loop through the results for each groupfor row in group_numbers:# Select a set of datadata 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 pointwindow Window.orderBy(data[x])data data.withColumn(delta_x, lead(x).over(window) - data[x])# Calculated trapezoidal areadata 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 rescalc_area(./data.parquet)
提高计算的效率
可以使用更高效的算法如自适应辛普森方法或者其他更快的积分方法可以在数据上进行并行化处理对pd DataFrame\spark DataFrame进行分区并使用分布式计算在使用spark的时候可以为window操作制定分区来提高性能以下为与本例无关的笼统的提高效率的方法:
并行计算使用多核CPU或分布式计算系统将任务分解成多个子任务并行处理。数据压缩压缩大数据以减少存储空间和带宽加快读写速度。数据分块对大数据进行分块处理可以减小内存需求并加快处理速度。缓存优化优化缓存策略减少磁盘访问和读取提高计算效率。算法优化使用高效率的算法比如基于树的算法和矩阵算法可以提高计算效率。