diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/citco_ops/remote.py | 93 | ||||
| -rw-r--r-- | python/isosel_reports.py | 6 |
2 files changed, 52 insertions, 47 deletions
diff --git a/python/citco_ops/remote.py b/python/citco_ops/remote.py index 7a05f90e..7570aa62 100644 --- a/python/citco_ops/remote.py +++ b/python/citco_ops/remote.py @@ -1,6 +1,5 @@ from serenitas.utils.remote import SftpClient -from dataclasses import field, dataclass -from typing import Callable +from typing import Callable, List import pandas as pd from serenitas.utils.db import dawn_engine, dbconn import datetime @@ -11,64 +10,40 @@ from serenitas.analytics.dates import prev_business_day, next_business_day def citco_accrued(s): if m := re.search("100502500_INNOCAP_ISOSEL.([\d]+)\.", s): dt = datetime.datetime.strptime(m.group(1), "%Y%m%d%H%M%S") - return prev_business_day(dt) + return prev_business_day(dt) def citco_all(s): if m := re.search("SPOS4X_INNOCAP_ISOSEL_D_IM.([\d.]+)\.", s): dt = datetime.datetime.strptime(m.group(1), "%Y%m%d.%H%M%S") - return dt + return dt -def load_citco_report(df, kd): +def load_citco_report(fh, kd, date_cols): + df = pd.read_csv(fh, parse_dates=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"] = kd.date() df["knowledge_date"] = next_business_day(kd) - for column in [ - "init_date", - "init_settle_date", - "liqd_date", - "liqd_settle_date", - "maturity_date", - "orig_date", - "start_date", - "end_date", - ]: - if column in df.columns: - df[column] = pd.to_datetime(df[column], infer_datetime_format=True).dt.date return df -@dataclass class Report: table: str ped_func: Callable[[str], datetime.datetime] - fname: str - _sftp: SftpClient - date: datetime.date + _sftp = SftpClient.from_creds("citco", folder="outgoing") _conn: dbconn = dbconn("dawndb") + date_cols: List[str] = [] - @classmethod - def set_report(cls, report, date): - fund, report = report.split("_") - if (fund, report) == ("isosel", "accrued"): - return cls( - "isosel_accrued", - citco_accrued, - "100502500_INNOCAP_ISOSEL", - SftpClient.from_creds("citco", folder="outgoing"), - date, - ) - elif (fund, report) == ("isosel", "all"): - return cls( - "citco_reports", - citco_all, - "SPOS4X_INNOCAP_ISOSEL_D_IM", - SftpClient.from_creds("citco", folder="outgoing"), - date, - ) + def __init_subclass__(cls, table, f, fname, date_cols): + cls.table = table + cls.ped_func = f + cls.fname = fname + cls.date_cols = date_cols + + def __init__(self, date): + self.date = date @property def most_recent_report(self): @@ -76,14 +51,15 @@ class Report: filename for filename in self._sftp.client.listdir() if self.fname in filename - if self.ped_func(filename).date() == self.date + if type(self).ped_func(filename).date() == self.date ] - return max(report_files, key=self.ped_func) + return max(report_files, key=type(self).ped_func) def to_df(self): with self._sftp.client.open(self.most_recent_report) as fh: - df = pd.read_csv(fh) - return load_citco_report(df, self.ped_func(self.most_recent_report)) + return load_citco_report( + fh, type(self).ped_func(self.most_recent_report), self.date_cols + ) def to_db(self): with self._conn.cursor() as c: @@ -94,3 +70,32 @@ class Report: self._conn.commit() df = self.to_df() df.to_sql(self.table, dawn_engine, if_exists="append", index=False) + + +class AccruedReport( + Report, + table="isosel_accrued", + f=citco_accrued, + fname="100502500_INNOCAP_ISOSEL", + date_cols=[ + "Init Date", + "Init Settle Date", + "Liqd Date", + "Liqd Settle Date", + "Bond Maturity", + "Orig Date", + "Start Date", + "End Date", + ], +): + pass + + +class AllReport( + Report, + table="citco_reports", + f=citco_all, + fname="SPOS4X_INNOCAP_ISOSEL_D_IM", + date_cols=["Maturity Date"], +): + pass diff --git a/python/isosel_reports.py b/python/isosel_reports.py index bda34534..a94563c9 100644 --- a/python/isosel_reports.py +++ b/python/isosel_reports.py @@ -1,4 +1,4 @@ -from citco_ops.remote import Report +from citco_ops.remote import AccruedReport, AllReport import datetime from serenitas.analytics.dates import prev_business_day @@ -15,6 +15,6 @@ if __name__ == "__main__": help="report date", ) args = parser.parse_args() - for report in ("isosel_accrued", "isosel_all"): - report = Report.set_report(report, args.date) + for report_cls in AccruedReport, AllReport: + report = report_cls(args.date) report.to_db() |
