根据前几年的数据计算 pandas 数据帧行的百分位

2024-01-13

我有以下数据框:

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 仅返回组,而我需要一个值列表。


设置一个小样本数据框:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据前几年的数据计算 pandas 数据帧行的百分位 的相关文章

随机推荐