Окно с наноразмерными Панд Питона

#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
 

Спасибо!