diff options
Diffstat (limited to 'python/report_ops/admin.py')
| -rw-r--r-- | python/report_ops/admin.py | 88 |
1 files changed, 46 insertions, 42 deletions
diff --git a/python/report_ops/admin.py b/python/report_ops/admin.py index f2e60e96..8dce970b 100644 --- a/python/report_ops/admin.py +++ b/python/report_ops/admin.py @@ -3,6 +3,7 @@ from typing import ClassVar import datetime from dataclasses import dataclass import pandas as pd +import dateutil.parser as dparser from serenitas.utils.remote import SftpClient from serenitas.ops.trade_dataclasses import Fund @@ -15,13 +16,11 @@ from .misc import dt_from_citco @dataclass class CitcoReport: - date: datetime.date - fund: Fund report_name: ClassVar table: ClassVar knowledge_date: datetime.date = None - fund: Fund = None _conn: dbconn = dbconn("dawndb") + _sftp: ClassVar = SftpClient.from_creds("citco", folder="outgoing") date_cols: ClassVar = [] dtkey: ClassVar _registry = {} @@ -36,7 +35,6 @@ class CitcoReport: return cls._registry[table] def __post_init__(self): - self._sftp = SftpClient.from_creds("citco", folder="outgoing") if not self.report_file_name: raise MissingDataError( f"No reports for {self.fund}:{self.table} on {self.date}" @@ -45,53 +43,61 @@ class CitcoReport: next_business_day(self.date), self.dtkey_fun(self.report_file_name).time() ) - @property - def dtkey_fun(self): - return partial(dt_from_citco, file_tag=self.file_prefix, dt_format=self.dtkey) + @staticmethod + def get_report_date(cob): + return cob - @property - def sftp_report_date(self): - return self.date - - @property - def report_file_name(self): + @classmethod + def get_report(cls, date, fund): + prefix = cls.get_prefix(fund) + dtkey_fun = cls.get_dt_fun(fund) + report_date = cls.get_report_date(date) return max( [ f - for f in self._sftp.client.listdir() - if (self.file_prefix in f) - and (self.dtkey_fun(f).date() == self.sftp_report_date) + for f in cls._sftp.client.listdir() + if (prefix in f) and (dtkey_fun(f).date() == report_date) ], - key=self.dtkey_fun, - default=None, + key=dtkey_fun, ) - def to_df(self): - with self._sftp.client.open(self.report_file_name) as fh: - df = pd.read_csv(fh, parse_dates=self.date_cols, infer_datetime_format=True) + @classmethod + def get_df(cls, report_name): + with cls._sftp.client.open(report_name) as fh: + df = pd.read_csv(fh, parse_dates=cls.date_cols, infer_datetime_format=True) df["row"] = df.index df.columns = df.columns.str.lower() df.columns = df.columns.str.replace(" ", "_") - df["period_end_date"] = self.date - df["knowledge_date"] = self.knowledge_date - df["fund"] = self.fund + df["period_end_date"] = cls.date + df["knowledge_date"] = cls.knowledge_date + df["fund"] = cls.fund return df - def to_db(self): - df = self.to_df() - with self._conn.cursor() as c: + @classmethod + def to_db(cls, date, fund): + report_name = cls.get_report(date, fund) + df = cls.get_df(report_name) + with cls._conn.cursor() as c: c.execute( - f"DELETE FROM {self.table} WHERE period_end_date=%s AND fund=%s", + f"DELETE FROM {cls.table} WHERE period_end_date=%s AND fund=%s", ( - self.date, - self.fund, + date, + fund, ), ) - self._conn.commit() + cls._conn.commit() if "strategy" in df.columns: df["strategy"] = df["strategy"].str.replace("/M_|/SER_", "/", regex=True) df.to_sql(self.table, dawn_engine, if_exists="append", index=False) + @classmethod + def get_dt_fun(cls, fund): + def dt_fun(fname, date): + ts = fname.removeprefix(cls.get_prefix(fund)).removesuffix(".csv") + return dparser(ts) + + return dt_fun + class AccruedReport( CitcoReport, @@ -108,13 +114,13 @@ class AccruedReport( ], dtkey="%Y%m%d%H%M%S", ): - @property - def sftp_report_date(self): - return next_business_day(self.date) + @staticmethod + def get_report_date(cob): + return next_business_day(cob) - @property - def file_prefix(self): - return f"100502500_INNOCAP_{self.fund}_" + @staticmethod + def get_prefix(fund): + return f"100502500_INNOCAP_{fund}_" class AllReport( @@ -123,8 +129,6 @@ class AllReport( date_cols=["Maturity Date"], dtkey="%Y%m%d.%H%M%S", ): - @property - def file_prefix(self): - return ( - f"SPOS4X_INNOCAP_{self.fund}_D_{'IM' if self.fund =='ISOSEL' else 'IMCG'}." - ) + @staticmethod + def get_prefix(fund): + return f"SPOS4X_INNOCAP_{fund}_D_{'IM' if fund =='ISOSEL' else 'IMCG'}." |
