在python/pandas中如何查找最近的值?

1 投票
1 回答
1610 浏览
提问于 2025-04-18 13:59

我有一个这样的数组:

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.whereSeries.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,否则 - 会进行一种集合差的操作。

撰写回答