如何根据另一个熊猫表对熊猫表进行排序

时间:2019-12-19 03:21:45

标签: python-3.x pandas

以下问题是在我的采访的最后一轮出现的,很遗憾,我做不到。 我的第一张桌子为:

ticker            AAPL       MSFT        WMT
date                                        
2015-12-31  101.696810  52.829107  58.379766
2016-01-04  101.783763  52.181598  58.532144
2016-01-05   99.233131  52.419653  59.922592
2016-01-06   97.291172  51.467434  60.522580
2016-01-07   93.185040  49.677262  61.932075
data = quandl.get_table('WIKI/PRICES', ticker = ['AAPL', 'MSFT', 'WMT'], 
                        qopts = { 'columns': ['ticker', 'date', 'adj_close'] }, 
                        date = { 'gte': '2015-12-31', 'lte': '2016-12-31' }, 
                        paginate=True)

data = data.set_index('date')
data = data.pivot (columns='ticker')

现在我想从上表中获得10天的滚动标准偏差。 我们得到:


ticker          AAPL      MSFT       WMT
date                                    
2016-01-14  3.128565  1.303180  1.144040
2016-01-15  2.750341  1.272089  1.058815
2016-01-19  2.003544  1.282124  0.928272
2016-01-20  1.496574  1.048227  1.177348
2016-01-21  1.261271  0.911893  1.209570

现在我想按其波动率对上述波动率表进行排序,例如在2016年1月14日至2016年1月15日,我们应该具有以下内容:(如何最好按行对该表进行排序?)

1.144040    1.303180     3.128565
1.058815    1.272089     2.750341

现在我们如何按照上述波动率表的位置对原始表“数据”进行排序?例如在2016-01-14-2016-01-15中,表格应为:

58.379766    52.829107   101.696810 
58.532144    52.181598   101.783763

非常感谢。

1 个答案:

答案 0 :(得分:1)

您的原始数据框和波动率数据框具有不同的索引,但是您说您想按波动率表的位置对原始df进行排序。因此,只需要将结果设为这2个数据帧的基础numpy ndarray的格式就有意义。假设原始数据帧名为org_df,波动率表为df。使用numpy argsort和精美索引来实现。

import numpy as np

a = org_df.to_numpy()
b = df.to_numpy()
y_b = np.argsort(b, axis=1)
x_b = np.arange(b.shape[0])[:,None]

volatility_sorted = b[x_b, y_b]

print(volatility_sorted)

Out[39]:
array([[1.14404 , 1.30318 , 3.128565],
       [1.058815, 1.272089, 2.750341],
       [0.928272, 1.282124, 2.003544],
       [1.048227, 1.177348, 1.496574],
       [0.911893, 1.20957 , 1.261271]])

org_df_sorted = a[x_b, y_b]

print(org_df_sorted )

Out[49]:
array([[ 58.379766,  52.829107, 101.69681 ],
       [ 58.532144,  52.181598, 101.783763],
       [ 59.922592,  52.419653,  99.233131],
       [ 51.467434,  60.52258 ,  97.291172],
       [ 49.677262,  61.932075,  93.18504 ]])

说明

x_b = np.arange(b.shape[0])[:,None]

它将创建形状为(5, 1)的二维数组,其中5b的轴= 0的长度。其输出是

Out[161]:
array([[0],
       [1],
       [2],
       [3],
       [4]])

Numpy花式索引需要在轴0和1上都具有数组索引。所需的输出是2-d,因此这些数组索引必须是2-d数组。此命令为轴0创建数组索引,以与numpy花式索引一起使用。 b.shape[0]返回b轴的长度= 0。 np.arange(b.shape[0])返回一维数组,形状为(5,)。我们需要将其放大为二维尺寸,因此添加[:,None](或者您可以使用np.newaxis而不是None)是向其添加一个尺寸的简短方法。很长的路要用np.reshape

y_b = np.argsort(b, axis=1)

它按轴1(最右边的轴)对b进行排序。 argsort返回排序顺序的位置/索引,而不是排序值。因此,我们可以使用它对ab进行排序。

volatility_sorted = b[x_b, y_b]

b[x_b, y_b]b上使用在轴= 0上的数组索引x_b和在轴= 1上的y_b上的索引。杰克有一本关于Python数据科学的好书。他对花式索引here的解释很好。如果您想深入了解,请查看有关索引here

的numpy文档