aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/citco_ops/remote.py93
-rw-r--r--python/isosel_reports.py6
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()