【问题标题】:Compute percentile for pandas dataframe row based on previous years data根据往年数据计算 pandas 数据框行的百分位数
【发布时间】:2016-01-01 16:28:51
【问题描述】:

我有以下数据框:

datetime       JD      YEAR    VAL 
2000-01-01      1      2000    0.5
2000-01-02      2      2000    1.2
2000-01-03      3      2000    2.1
2000-01-04      4      2000    3.4 
2000-01-05      5      2000    4.6
2000-01-06      6      2000    6.8
2000-01-07      7      2000    7.2
2000-01-08      8      2000    0.2
2000-01-09      9      2000    0.9
...
2010-12-31      365    2014    4.1

第一年是 2000 年,去年是 2010 年。没有闰年(即没有对应于 2 月 29 日的行),日期时间是索引列。

我想计算一个新的数据框,从 2010 年 1 月 1 日到 2010 年 12 月 31 日。我希望它包含一个列,用于计算由 10 个值组成的数组中 2010 年 1 月 1 日值 (VAL) 的百分位数 ( 2000 年 1 月 1 日、2001 年 1 月 1 日……2009 年 1 月 1 日)。同样,将 2010 年 1 月 2 日与往年的 1 月 2 日进行比较......

lyr = df.YEAR.max() # last year i.e. 2010
cdf = df[df.YEAR == lyr]# Latest year dataframe
pdf = df[df.index.year < lyr] # Previous years dataframe

pdf.groupby('JD')['VAL']
stats.percentileofscore(pdf['VAL'], cdf['VAL'])

但是,我不确定如何使代码正常工作。 groupby 只返回 group 而我需要一个值列表。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    设置一个小样本数据框:

    np.random.seed(1234)
    df = pd.DataFrame({ 'jd':  np.tile([1,2],3),
                        'yr':  np.repeat([2008,2009,2010],2),
                        'val': np.random.randn(6) })
    

    那么就只有一行了:

    df['pctile'] = df.groupby('jd')['val'].rank(pct=True)
    

    这是输出,按sort_values(['jd','val'])排序

       jd       val    yr    pctile
    4   1 -0.720589  2010  0.333333
    0   1  0.471435  2008  0.666667
    2   1  1.432707  2009  1.000000
    1   2 -1.190976  2008  0.333333
    3   2 -0.312652  2009  0.666667
    5   2  0.887163  2010  1.000000
    

    【讨论】:

    • .rank(pct=True) 不返回实际百分位数。它只是对值进行排名,但在计算百分位数时不使用相同的逻辑。所以这个答案是不正确的。
    • @bbennett36 恐怕我听不懂你在说什么。排名和百分位数至少应该共享相同的排序顺序。您认为本例中正确的百分位数是多少?如果您有更好或更正确的方法,请随时在此处添加您自己的答案。
    • 我想答案在技术上并不正确,但补充一下这是nearest-rank method 来计算百分位数可能会很有用。但是,pandas 中的“分位数”函数和“线性插值”方法中 numpy 的默认方法。所以发生的事情是我使用排名方法来计算一个数据集的百分位数,但相同数据的分位数并且它们不匹配,因为它们不使用相同的方法。此外,rank 方法并不总是返回我所比较的第 50 位的中位数。
    • stackoverflow.com/questions/50804120/… 我基本上在寻找“线性插值”百分位数。不是排位版。由于 OP 没有指定他的方法,我将删除反对票。
    • @bbennett36 谢谢,如果您认为这是公平的,那么您有权投反对票,但像您这样提出具体问题是 IMO 的更好方法。 +1 关于这个问题,因为业力 ;-)
    猜你喜欢
    • 2017-12-15
    • 2021-10-25
    • 2017-04-26
    • 2016-12-24
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2012-11-12
    相关资源
    最近更新 更多