Проблема:
crsp_data_ret=crsp_data['ret']
crsp_data_dlret=crsp_data['dlret']
возврат Series
, поэтому невозможно выбрать позже, Series.dropna
используется:
crsp_data_ret=crsp_data['ret'].dropna()
crsp_data_dlret=crsp_data['dlret'].dropna()
Решение удалить ['ret']
и ['dlret']
:
crsp_data['retadj']=(1+crsp_data)*(1+crsp_data)-1
Другим решением является использование DataFrame.dropna
, поэтому возвращается DataFrame
s:
crsp_data_ret=crsp_data.dropna(subset=['ret'])
crsp_data_dlret=crsp_data.dropna(subset=['dlret'])
crsp_data['retadj']=(1+crsp_data['ret'])*(1+crsp_data['dlret'])-1
EDIT:
Если необходимо игнорировать NaN
s, одним из возможных решений является использование add
с параметром fill_value=0
, затем получите:
crsp_data = pd.DataFrame({'ret':[1,2,'C', 5, np.nan],
'dlret':[10, np.nan, 7, 1, np.nan]})
crsp_data['ret'] = pd.to_numeric(crsp_data['ret'], errors='coerce')
crsp_data['retadj1']=(1+crsp_data['ret'])*(1+crsp_data['dlret'])-1
crsp_data['retadj2']= crsp_data['ret'].add(1, fill_value=0).mul(crsp_data['dlret'].add(1, fill_value=0)).sub(1)
print (crsp_data)
ret dlret retadj1 retadj2
0 1.0 10.0 21.0 21.0
1 2.0 NaN NaN 2.0
2 NaN 7.0 NaN 7.0
3 5.0 1.0 11.0 11.0
4 NaN NaN NaN 0.0
Деталь
print (crsp_data['ret'].add(1, fill_value=0))
0 2.0
1 3.0
2 1.0
3 6.0
4 1.0
Name: ret, dtype: float64
print (crsp_data['dlret'].add(1, fill_value=0).sub(1))
0 10.0
1 0.0
2 7.0
3 1.0
4 0.0
Name: dlret, dtype: float64