在python/pandas中如何查找最近的值?
我有一个这样的数组:
sp500=Quandl.get("YAHOO/INDEX_GSPC")
Open High Low Close Volume Adjusted Close returns vols
Date
1950-05-26 18.67 18.67 18.67 18.67 1330000 18.67 -0.001070 0.091246
1950-05-29 18.72 18.72 18.72 18.72 1110000 18.72 0.002678 0.078494
1950-05-31 18.78 18.78 18.78 18.78 1530000 18.78 0.003205 0.073638
1950-06-01 18.77 18.77 18.77 18.77 1580000 18.77 -0.000532 0.069189
1950-06-02 18.79 18.79 18.79 18.79 1450000 18.79 0.001066 0.059300
在任何日期,我想找出自从波动率(vol)低于5%以来的天数。比如说在1950年5月26日,我会向后查找,直到找到一个波动率低于5%的日期,然后计算这个日期和1950年5月26日之间的天数差。简单来说,就是“自从这件事发生以来的天数”!
有没有更简单的方法来做到这一点呢?
我想到的是使用np.where(x<0.10),然后用这个索引来计算天数差。np.where可以放在pd.rolling_apply里面,用来向后查找100个索引。是的,假设向后查找100个索引是为了找到合适的点。
有没有比我上面提到的这个非常粗糙的想法更好的主意呢???
1 个回答
2
假设你的数据框已经按照索引排序,你可以结合使用 numpy.where
和 Series.fillna
来找到某个阈值以下的最后一天的交易量。例如,开始时可以这样做:
>>> df
vols
Date
2014-07-10 0.045
2014-07-11 0.057
2014-07-12 0.064
2014-07-13 0.003
2014-07-14 0.021
2014-07-15 0.052
2014-07-16 0.090
接下来可以这样处理:
>>> df['tick'] = np.where(df.vols < .05, df.index, pd.tslib.NaT)
>>> df
vols tick
Date
2014-07-10 0.045 2014-07-10
2014-07-11 0.057 NaN
2014-07-12 0.064 NaN
2014-07-13 0.003 2014-07-13
2014-07-14 0.021 2014-07-14
2014-07-15 0.052 NaN
2014-07-16 0.090 NaN
然后进行向前填充,计算与索引的日期差:
>>> df['tick'].fillna(method='ffill', inplace=True)
>>> df
vols tick
Date
2014-07-10 0.045 2014-07-10
2014-07-11 0.057 2014-07-10
2014-07-12 0.064 2014-07-10
2014-07-13 0.003 2014-07-13
2014-07-14 0.021 2014-07-14
2014-07-15 0.052 2014-07-14
2014-07-16 0.090 2014-07-14
>>> df['days'] = df.index.values - df['tick']
>>> df
vols tick days
Date
2014-07-10 0.045 2014-07-10 0 days
2014-07-11 0.057 2014-07-10 1 days
2014-07-12 0.064 2014-07-10 2 days
2014-07-13 0.003 2014-07-13 0 days
2014-07-14 0.021 2014-07-14 0 days
2014-07-15 0.052 2014-07-14 1 days
2014-07-16 0.090 2014-07-14 2 days
注意,在最后一步你需要使用 .values
,否则 -
会进行一种集合差的操作。