#python #python-3.x #pandas
Вопрос:
Я пытаюсь создать скользящее окно, в котором учитываются значения NaN и вычисляются процентные изменения. Я знаю, что функция прокатки имеет параметр для NaN, но он не отвечает моим потребностям. Функция pct_change также не отвечает моим потребностям.
Вот версия Excel того, что я собираюсь сделать на Python. Это и есть ожидаемый результат. Ссылка: Обратите внимание, что если в какой-либо из ценных бумаг отсутствует цена, эта дата не указана в обеих ценных бумагах для целей расчета столбца » Разница в%». Также обратите внимание, что если окно обратного просмотра расширено на 1 дней, то наблюдение за разницей в % за этот день делится на SQRT(#дней обратного просмотра).
Сравните ожидаемый результат с моим результатом, в частности, столбец SPX_diff_pct здесь со столбцом % разницы в версии excel:
Date BZ SPX BZ_sma_3 SPX_sma_3 BZ_log_10 SPX_log_10 SPX_diff_pct
0 2008-10-21 00:00:00 5.52806 955.05 NaN NaN NaN NaN NaN
1 2008-10-22 00:00:00 4.31546 896.78 NaN NaN NaN NaN NaN
2 2008-10-23 00:00:00 4.09932 908.11 4.647613 919.980000 0.667230 2.963778 NaN
3 2008-10-24 00:00:00 3.59905 876.77 4.004610 893.886667 0.602560 2.951282 inf
4 2008-10-27 00:00:00 3.46106 848.92 3.719810 877.933333 0.570521 2.943462 inf
5 2008-10-28 00:00:00 4.71644 940.51 3.925517 888.733333 0.593897 2.948771 inf
6 2008-10-29 00:00:00 5.37886 930.09 4.518787 906.506667 0.655022 2.957371 inf
7 2008-10-30 00:00:00 5.74658 954.09 5.280627 941.563333 0.722685 2.973850 inf
8 2008-10-31 00:00:00 4.91196 968.75 5.345800 950.976667 0.728013 2.978170 inf
9 2008-11-03 00:00:00 5.45438 966.3 5.370973 963.046667 0.730053 2.983647 inf
10 2008-11-04 00:00:00 6.00474 1005.75 5.457027 980.266667 0.736956 2.991344 inf
11 2008-11-05 00:00:00 5.57656 952.77 5.678560 974.940000 0.754238 2.988978 inf
12 2008-11-06 00:00:00 4.4136 904.88 5.331633 954.466667 0.726860 2.979761 inf
13 2008-11-07 00:00:00 4.26568 930.99 4.751947 929.546667 0.676872 2.968271 inf
14 2008-11-10 00:00:00 3.60229 919.21 4.093857 918.360000 0.612133 2.963013 inf
15 2008-11-11 00:00:00 3.64742 898.95 3.838463 916.383333 0.584157 2.962077 inf
16 2008-11-12 00:00:00 3.19651 852.3 3.482073 890.153333 0.541838 2.949465 inf
17 2008-11-13 00:00:00 3.2798 911.29 3.374577 887.513333 0.528219 2.948175 inf
18 2008-11-14 00:00:00 3.27216 873.29 3.249490 878.960000 0.511815 2.943969 inf
19 2008-11-17 00:00:00 3.0363 850.75 3.196087 878.443333 0.504619 2.943714 inf
20 2008-11-18 00:00:00 2.81385 859.12 3.040770 861.053333 0.482984 2.935030 inf
21 2008-11-19 00:00:00 2.64706 806.58 2.832403 838.816667 0.452155 2.923667 inf
22 2008-11-20 00:00:00 NaN 752.44 2.832403 806.046667 NaN NaN NaN
23 2008-11-21 00:00:00 2.3594 800.03 2.606770 786.350000 0.416103 2.895616 NaN
24 2008-11-24 00:00:00 2.71223 851.81 2.572897 801.426667 0.410422 2.903864 inf
Вот код, который я использую. Что вы думаете об изменении его в соответствии с ожидаемым результатом?
idx = 0
window = idx
df_math['SPX_diff_pct'] = np.nan
while idx < len(df_math.index):
if math.isnan(df_math['SPX_log_10'].iloc[idx]):
df_math['SPX_diff_pct'].iloc[idx] = np.NaN
else:
while math.isnan(df_math['SPX_log_10'].iloc[window - 1]) and ((window - 1) >= 0):
window -= 1
df_math['SPX_diff_pct'].iloc[idx] = ((df_math['SPX_log_10'].iloc[idx] / df_math['SPX_log_10'].iloc[window]) / np.sqrt(idx-window))
idx = 1
window = idx
Спасибо!