import pandas as pd from api import Navs, Datum from basic.dao import robo_exrate as re, robo_fund_navs as rfn from framework import get_config, component, autowired @component class DefaultNavs(Navs): @autowired def __init__(self, datum: Datum = None): self._config = get_config(__name__) self._datum = datum def get_fund_navs(self, fund_ids=None, min_date=None, max_date=None): navs = rfn.get_navs(fund_id=fund_ids, min_date=min_date, max_date=max_date) if 'exrate' in self._config: navs = pd.DataFrame(navs) navs = navs.pivot_table(index='nav_date', columns='fund_id', values='nav_cal') for exrate_config in self._config['exrate']: exrate = pd.DataFrame(re.get_exrates(ticker=exrate_config['ticker'], min_date=navs.index.min(), max_date=navs.index.max())) exrate = exrate[['date', 'close']] exrate.set_index('date', inplace=True) for fund in self._datum.get_fund_datums(crncy=exrate_config['from']): if fund['id'] in navs.columns: navs[fund['id']] = round(navs[fund['id']] * exrate['close'], 4) navs = navs.reset_index().melt(id_vars='nav_date', value_name='nav_cal') navs.dropna(inplace=True) navs = navs[['fund_id', 'nav_date', 'nav_cal']] navs.sort_values(by=['fund_id', 'nav_date'], inplace=True) navs = navs.to_dict('records') return navs