aboutsummaryrefslogtreecommitdiffstats
path: root/python/report_ops
diff options
context:
space:
mode:
Diffstat (limited to 'python/report_ops')
-rw-r--r--python/report_ops/admin.py88
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'}."