You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:52:35