【问题标题】:How can I create a function from this data?如何从这些数据创建函数?
【发布时间】:2018-08-30 02:26:02
【问题描述】:

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

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

完整的表格是here as a Google spreadsheet

目前,我正在计算一个分数,然后对该数据集(表)进行查找以找到相应的百分位排名。

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

【问题讨论】:

  • 欢迎来到 SO。请提供一个最小、完整和可验证的示例。 向我们展示您最近尝试的代码以及您遇到的问题。并解释为什么结果不符合您的预期stackoverflow.com/help/mcve

标签: python python-3.x mathematical-expressions


【解决方案1】:

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

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

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

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

你的数据集:橙色;拟合误差函数(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()

【讨论】:

  • 感谢这个非常详细的答案,这正是我正在寻找的。发布这个问题后,我开始四处挖掘,并意识到我需要在这些数据上拟合一个模型,但我不知道是哪一种(抛物线回归对曲线本身有效,但对整个数据无效)。至于数据本身,我应该提供更多细节。数据是标准化测试的全国百分位数排名(我认为是 cdf)。我有一些本地结果,我想看看它们在全国范围内的百分比。
  • 由于您的数据集基于真实世界的数据,因此无法用解析公式(除了直接插值)来描述。但是,这种数据(具有大量可能分数的测试结果)可能很好地描述了正态分布,并且由于您的抽样是基于整个国家的,因此统计数据预计会遵循潜在的“理想”分布很好。
  • 决定权在您手中:您可以使用我的 fit,但请注意,这与使用查找表不同!与其说“与该国其他地区相比,您处于第 x 个百分位”,而是说“根据该国其他地区的结果,您处于正态分布的第 x 个百分位”
  • 是的,感谢您的澄清。对于生产,我仍在使用这些表格,但对于我自己的个人学习和实验,我使用了拟合模型。感谢您在回答中包含参数选择。
【解决方案2】:

您的问题非常含糊,但您所做的任何计算似乎都以 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)

如果你想要一个明确的答案,那么只需发布你的计算,我可以为你把它变成一个函数

【讨论】:

  • 谢谢斯蒂芬。我有数据集(查找表),但我没有它背后的公式。所以我试图使用数据找到公式,以便将公式放入函数中。这可能更像是一个数学问题而不是编程问题。我刚刚发现这个question 似乎是相关的。
  • 您是否正在寻找公式以在数据集中查找答案?如果是这样,只需将数据集放入字典并直接提取结果即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2021-08-23
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多