以下问题是在我的采访的最后一轮出现的,很遗憾,我做不到。 我的第一张桌子为:
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
非常感谢。
答案 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)
的二维数组,其中5
是b
的轴= 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
返回排序顺序的位置/索引,而不是排序值。因此,我们可以使用它对a
和b
进行排序。
在volatility_sorted = b[x_b, y_b]
上
b[x_b, y_b]
在b
上使用在轴= 0上的数组索引x_b
和在轴= 1上的y_b
上的索引。杰克有一本关于Python数据科学的好书。他对花式索引here的解释很好。如果您想深入了解,请查看有关索引here