如何在Pandas中实现曲线拉直?支持自定义拉直程度
问题
给定如下DataFrame,Original为原始曲线,Linear是完全拉直的线性曲线,Target是期望的近似拉直结果(对应45%的拉直程度):
import pandas as pd import matplotlib.pyplot as plt df = pd.DataFrame({ 'Original': [0, 6, 14, 23, 49, 100], 'Target': [0, 10, 25, 40, 65, 100], 'Linear': [0, 20, 40, 60, 80, 100] }) df.plot() plt.show()
需要实现可自定义拉直程度的曲线转换:允许设置0%(完全保留原始曲线)到100%(完全变为线性曲线)之间的任意拉直程度,生成对应的过渡曲线。
解决方案
这里提供两种常用方法,按需选择:
方法一:线性加权法(简单直观)
核心是对原始曲线和完全线性曲线做加权平均,alpha为拉直程度(01,对应0%100%):
def linear_straighten(df, alpha): """ alpha: 0=0%拉直(完全保留Original),1=100%拉直(完全变为Linear) """ col_name = f'{alpha*100:.0f}% Straightened' df[col_name] = df['Original'] * (1 - alpha) + df['Linear'] * alpha return df # 生成45%拉直的曲线示例 df = linear_straighten(df, 0.45) print(df) df.plot() plt.show()
这种方法计算简单、过渡平滑,得到的结果是原始与线性曲线的线性组合,适合对过渡平滑度要求高的场景。
方法二:分位数映射法(贴合Target非线性趋势)
如果需要更接近示例中Target的非线性拉直效果,可以通过分位数匹配将原始数据的分布映射到混合分位数(原始分位数与线性分位数的加权组合):
import numpy as np def quantile_straighten(df, alpha): """ alpha: 0=0%拉直,1=100%拉直 """ # 计算0-100分位数的基准点 pcts = np.arange(0, 101) orig_q = np.percentile(df['Original'], pcts) linear_q = np.percentile(df['Linear'], pcts) # 加权混合分位数 mixed_q = orig_q * (1 - alpha) + linear_q * alpha # 对原始数据做插值映射 col_name = f'{alpha*100:.0f}% Quantile Straightened' df[col_name] = np.interp(df['Original'], orig_q, mixed_q) return df # 生成45%拉直的曲线示例 df = quantile_straighten(df, 0.45) df.plot() plt.show()
这种方法会让曲线的分布更贴合目标趋势,生成的结果更接近示例中的Target值。
内容的提问来源于stack exchange,提问作者Niclas
相关产品推荐
相关产品推荐

