如何从这些数据创建函数?

问题描述 投票:-1回答:2

我有一个表格形式的数据集:

Score   Percentile
 381         1
 382         2
 383         2
      ...
 569        98
 570        99

完整的表格是here as a Google spreadsheet

目前,我正在计算得分,然后对该数据集(表)进行查找以找到相应的百分等级。

是否可以使用公式创建一个函数来计算给定分数的相应百分等级,而不是在表格中查找?

python python-3.x mathematical-expressions
2个回答
1
投票

如果没有提供有关该数据背后的过程的信息,则无法重新创建生成给定数据表的函数。

话虽如此,我们可以做一些推测。

由于它是一个“百分位”函数,它可能代表某种概率分布的累积值。非常常见的概率分布是正态分布,其“累积”对应物(即其积分)是所谓的“误差函数”(“erf”)。

事实上,您的列表数据看起来很像一个平均值为473.09的变量的错误函数:

enter image description here

你的数据集:橙色;拟合误差函数(erf):蓝色

但是,该协议并不完美,原因可能有三个:

  1. 我用来生成错误函数参数的拟合程序没有使用正确的约束(因为我不知道我在建模什么!)
  2. 您的数据集不代表精确的正态分布,而是表示其基础分布是正态分布的真实世界数据。偏离模型的样本数据的功能将被完全忽略。
  3. 底层分布根本不是正态分布,它的积分碰巧看起来像是错误函数。

我根本没办法告诉你!

如果您想使用此功能,这是它的定义:

import numpy as np
from scipy.special import erf
def fitted_erf(x):
    c = 473.09090474
    w =  37.04826334
    return 50+50*erf((x-c)/(w*np.sqrt(2)))

测试:

In [2]: fitted_erf(439) # 17 from the table
Out[2]: 17.874052406601457

In [3]: fitted_erf(457) # 34 from the table
Out[3]: 33.20270318344252

In [4]: fitted_erf(474) # 51 from the table
Out[4]: 50.97883169390196

In [5]: fitted_erf(502) # 79 from the table
Out[5]: 78.23955071273468

但是我强烈建议您检查在不知道您的数据源的情况下制作的拟合函数是否适合您的任务。


附:

如果您感兴趣,这是用于获取参数的代码:

import numpy as np
from scipy.special import erf
from scipy.optimize import curve_fit

tab=np.genfromtxt('table.csv', delimiter=',', skip_header=1)
# using a 'table.csv' file generated by Google Spreadsheets
x = tab[:,0]
y = tab[:,1]

def parametric_erf(x, c, w):
    return 50+50*erf((x-c)/(w*np.sqrt(2)))

pars, j = curve_fit(parametric_erf, x, y, p0=[475,10])

print(pars)
# outputs [  473.09090474,   37.04826334]

并生成情节

import matplotlib.pyplot as plt

plt.plot(x,parametric_erf(x,*pars))
plt.plot(x,y)
plt.show()

0
投票

你的问题很模糊,但似乎你所做的任何计算都以381-570范围内的数字结束,这是正确的。你有一个多行计算,给出这个数字?我猜你在代码中的很多地方都在重复这个,这就是为什么要对它进行处理呢?

对于任何计算,您可以将其包装在函数中。例如:

answer = variable_1 * variable_2 + variable_3

可以写成:

def calculate(v1, v2, v3):
    ''' calculate the result from the inputs
    '''
    return v1 * v2 + v3

answer = calculate(variable_1, variable_2, variable_3)

如果您想要一个明确的答案,那么只需发布您的计算,我就可以将它变成一个功能

© www.soinside.com 2019 - 2024. All rights reserved.