【问题标题】:Input a mean and standard deviation to apply probability distribution across DataFrame Pandas Python输入平均值和标准差以在 DataFrame Pandas Python 中应用概率分布
【发布时间】:2016-04-13 19:45:57
【问题描述】:

我有一系列未来的日期。我想使用关于尚未安排的事件的标准偏差和平均值的假设来“预测”该事件在任何给定日期发生的未来概率。假设我有一个 min/max 日期为 1/8/162/3/16 的 Pandas DF。我目前只是在所有日子里以相同的概率运行 (.037 ...)。

我把它放在一个看起来像这样的数据框中(我已经手动填写了所需的Standard_dev_assisted_probability):

Poss_Date   Equal_probability  Standard_dev_assisted_probability

1/8/2016    0.037037            min date in poss date range
1/9/2016    0.037037
1/10/2016   0.037037
1/11/2016   0.037037            -1st dv / two thirds border
1/12/2016   0.037037
1/13/2016   0.037037
1/14/2016   0.037037
1/15/2016   0.037037
1/16/2016   0.037037
1/17/2016   0.037037
...         ...
1/22/2016   0.037037            mean / peak of distribution
...         ...
2/1/2016    .03707              +~1std dev
2/3/2016    0.037037            max date in poss range

如果我们假设未来分布的“平均值”是1/22/16,而标准的开发时间是 11 天......

有没有办法将它们插入 Pandas DF 并让它返回一个有概率的列?显然,66% 的概率应该在 1/22 周围分配 +/- 11 天,正态分布等。

我正在用伪代码进行成像,它会是这样的:

df['Probability']=df.applystandarddev(column=dates,mean=1/22,stddv=11)

如果我们不需要“考虑”超过平均值的简短时间段,那就太好了。显然,平均值之前的时间比平均值之后的时间长,但我认为这是图书馆处理的统计游戏的一部分,等等。

【问题讨论】:

  • 看来你会识别分布。鉴于您的参数选择,我猜您正在考虑正态分布?我也认为指数、帕累托可能也是合理的选择。
  • @David Maust 我很高兴能使用正态分布开始。我什至想不出具体该怎么做-
  • 也许有一种方法可以使用 scipy.norm(index_of_mean,std_dev) 然后在其他索引方法的位置使用某种概率....
  • 我认为scipy.stats.distribution.norm.cdf 会这样做。从一天开始时的 CDF 中减去一天结束时的 CDF day+1。这就是当天的概率。稍后我会发布一个示例,除非有人想打败我。
  • 非常感谢。如果使用 pandas 索引而不是日期对象或类似的东西来实现这一点要容易得多,我认为这也同样有效。如果我这样选择并且可能不必调整任何代码,它也可能允许我过滤掉周末之类的事情。作为一种总是计算指数而不是日期的概率可能......保持这些东西的独立性。不确定这是否是一个半生不熟的想法

标签: python numpy pandas scipy dataframe


【解决方案1】:

通过在一天结束和一天开始时获取给定概率的 CDF,我们能够找到事件在当天发生的概率。

这是一个正态分布的例子。

from scipy.stats.distributions import norm

def prob_distribution(day, mean_day, std):
    start_z = float((day - mean_day).days) / std
    end_z = float((day - mean_day).days + 1) / std
    return norm.cdf(end_z) - norm.cdf(start_z)

df['Prob'] = df['Poss_Date'].apply(lambda day: prob_distribution(day, datetime(2016,2,1), 10))

【讨论】:

  • 这对我有用。我必须确保我通过 func .. a day 和 mean_day 这是 Pandas.Timestamp 和一个很长的 std。我想唯一的进一步功能是过滤周末或尝试非正态分布的方法。也许如果我可以对我的一些数据进行分布。呵呵....也许最后一件事完全是另一个线程。谢谢大卫。
猜你喜欢
  • 2019-03-29
  • 1970-01-01
  • 2021-09-06
  • 2012-09-06
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2019-01-25
  • 2018-02-15
相关资源
最近更新 更多