求Pandas向量化函数:计算时间序列中价格增长n%所需时长
问题需求
给定一个包含二手车价格时间序列的Pandas DataFrame(索引为时间步长),需要实现向量化函数,对每个单元格的价格,计算后续首次达到该价格增长n%所需的时间步长(索引差值);若后续永远无法达到目标价格,则返回nan。每行计算独立,可通过向量化实现高效运算。
示例数据与预期输出
输入数据
import numpy as np import pandas as pd df = pd.DataFrame( [ 1490.47, 1492.98, 1494.69, 1497.43, 1499.02, 1503.29, 1501.60, 1502.80, 1502.30, 1509.38, 1512.01, 1508.98, 1512.63, ], columns=['price'], ) df.index.names = ['time'] n = 1/100 # 1%增长目标
预期输出
time_to_growth time 0 9.0 1 8.0 2 8.0 3 NaN 4 NaN 5 NaN 6 NaN 7 NaN 8 NaN 9 NaN 10 NaN 11 NaN 12 NaN
向量化解决方案
def compute_time_to_growth(df, n): prices = df['price'].values # 计算每个价格增长n%后的目标值 target_prices = prices * (1 + n) # 为每个目标值,在价格数组中找到第一个大于它的索引 first_pos = np.searchsorted(prices, target_prices, side='right') # 计算时间步长差 time_diffs = first_pos - np.arange(len(prices)) # 过滤无效结果:位置超出数组、对应价格不达标、步长差<=0(无后续数据达标) invalid_mask = (first_pos >= len(prices)) | (prices[first_pos] <= target_prices) | (time_diffs <= 0) time_diffs[invalid_mask] = np.nan # 将结果加入原DataFrame df['time_to_growth'] = time_diffs return df # 调用示例 result_df = compute_time_to_growth(df, n) print(result_df[['time_to_growth']])
方案说明
- 向量化目标计算:直接通过NumPy数组运算生成所有价格的目标值,避免逐行循环,效率极高。
- 高效查找达标位置:
np.searchsorted利用二分查找实现向量化定位,时间复杂度为O(N log N),远优于O(N²)的循环实现,适合大规模数据。 - 严格无效值过滤:通过掩码排除三种无效情况,确保结果仅保留有效时间步长,其余设为
nan。
内容的提问来源于stack exchange,提问作者dg141
相关产品推荐
相关产品推荐

