from datetime import datetime as dt from typing import List import pandas as pd from py_jftech import component, autowired from api import RoboReportor @component(bean_name='year-range-report') class YearRangeReport(RoboReportor): @autowired(names={'combo': 'combo-report'}) def __init__(self, combo: RoboReportor = None): self._combo = combo @property def report_name(self) -> str: return '单年区间业绩' def load_report(self, max_date=dt.today(), min_date=None) -> List[dict]: datas = pd.DataFrame(self._combo.load_report(max_date=max_date, min_date=min_date)) if not datas.empty: datas['year'] = datas['date'].dt.year datas.set_index('date', inplace=True) result = pd.DataFrame(columns=datas.columns) last_data = None for year, group_data in datas.groupby(by='year', group_keys=False): group_data = group_data.drop(columns='year') if last_data is None: last_data = group_data.iloc[0] result.loc[year] = group_data.iloc[-1] / last_data - 1 last_data = group_data.iloc[-1] result.drop(columns='year', inplace=True) result = round(result * 100, 4) result.reset_index(inplace=True) result.rename(columns={'index': 'year'}, inplace=True) return result.to_dict('records') return []