2017-02-12 6 views
0

У меня есть dataframe с значениями NaN. я хочу заменить, что значения NaN до CAGR значениякак заменить столбцы NaN с вычисленными значениями CAGR

val1 val2 val3 val4 val5 
0 100 100 100 100 100 
1 90 110 80 110 50 
2 70 150 70 NaN NaN 
3 NaN NaN NaN NaN NaN 

CAGR (совокупные ежегодные темпы роста) = (конечное значение/первое значение) ** (1/количество лет)

, например, VAL1 годов CAGR составляет -23%. поэтому последнее значение знач1 будет 53,9

значение CAGR столбце val4 составляет 10%

так row2 NaN будет 121 и row3 NaN замените 133

как я могу автоматически заменить NaN?

вопросов являются

1) Как я могу вычислить CAGR каждую колонку?

Я использовал isnull(), поэтому я нашел, какая строка пуста. но я не знаю, как исключить строку для вычисления CAGR.

2) как я могу заменить NaN на вычисленные значения?

спасибо.

ответ

0
from __future__ import division # for python2.7 
import numpy as np 

# tab delimitted data 
a = '''100 100 100 100 100 
90 110 80 110 50 
70 150 70 NaN NaN 
NaN NaN NaN NaN NaN 
''' 

# parse and make a numpy array 
data = np.array([[np.nan if aaa=='NaN' else int(aaa) for aaa in aa.split('\t')] for aa in a.splitlines()]) 

for col in range(5): 

    Nyears = np.isnan(data[:,col]).argmax()-1 # row index for the last non-NaN value 
    endvalue = data[Nyears,col] 
    cagr = (endvalue/100) ** (1/Nyears) 
    print Nyears, endvalue, cagr 

    for year in np.argwhere(np.isnan(data[:,col])): 
     data[year,col] = data[year-1,col] * cagr 

print data 

я получаю:

[[ 100.   100.   100.   100.   100.  ] 
[ 90.   110.   80.   110.   50.  ] 
[ 70.   150.   70.   121.   25.  ] 
[ 58.56620186 183.71173071 58.56620186 133.1   12.5  ]] 
Смежные вопросы