我有一个包含时间序列数据的表,其中大部分为空值,我想用最后一个已知值填充所有空值。
我有一些解决方案,但它们比同等的解决方案慢得多DataFrame.fillna(method='ffill')
在 Pandas 中进行操作。
我正在使用的代码/数据的简化版本:
select d.[date], d.[price],
(select top 1 p.price from price_table p
where p.price is not null and p.[date] <= p.[date]
order by p.[date] desc) as ff_price
from price_table d
制作表格
date price ff_price
---------- ----- --------
2016-07-11 0.79 0.79
2016-07-12 NULL 0.79
2016-07-13 NULL 0.79
2016-07-14 0.69 0.69
2016-07-15 NULL 0.69
...
2016-09-21 0.88 0.88
...
我有超过 1 亿行,所以这需要相当长的时间。
这看起来像是一个“经典”的差距和岛屿问题。Assuming您没有使用 2008 年或更早版本(它们(几乎)完全不受支持)should得到你想要的结果:
WITH CTE AS(
SELECT [date],
price,
COUNT(CASE WHEN price IS NOT NULL THEN 1 END) OVER (ORDER BY [date]
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Grp
FROM price_table p)
SELECT [date],
price,
MIN(price) OVER (PARTITION BY grp) AS ff_price
FROM CTE;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)