Source code for kaxanuk.attribution_analysis.input_handlers.portfolio_weights_input_handler
import pandas as pd
from kaxanuk.attribution_analysis.interfaces.input_handler_interface import InputHandlerInterface
from kaxanuk.attribution_analysis.exceptions import MissingCSVReadError
from kaxanuk.attribution_analysis.entities import PortfolioDailyWeights
[docs]
class WeightsInputHandler(InputHandlerInterface):
"""
Read portfolio weights input.
Parameters
----------
input_base_dir : str
The path that will contain all the input subdirectories
input_subdir: str
The subdirectory to which the input data files will be readed
"""
def __init__(
self,
input_base_dir: str,
input_subdir: str,
file_name: str,
dates_column_name: str = 'm_date',
):
self.input_base_dir = input_base_dir
self.input_subdir = input_subdir
self.file_name = file_name
self.dates_column_name = dates_column_name
# HAcer metodo privado que ejecute el leer las cosas
# Siempre que tengan attributos que vaya a jalar el usuario que sean publicos para que no jale los privados
# hacer interfaz para reeder tool, que lo recibe como input y ejecuta los metodos publicos del
[docs]
def input_data(
self,
*,
ticker: str,
) -> PortfolioDailyWeights:
"""
Parameters
----------
ticker : str
The ticker of the stock, on which the output csv file will be named.
Returns
-------
Pandas DataFrame
"""
input_subdir_path = f'{self.input_base_dir}/{self.input_subdir}'
try:
input_file_path = f'{input_subdir_path}/{self.file_name}.csv'
except KeyError as error:
raise MissingCSVReadError from error
table_df = pd.read_csv(
input_file_path,
index_col=self.dates_column_name,
parse_dates=[0]
)
table_df = table_df.sort_index()
table_df.index = pd.to_datetime(table_df.index, format='mixed')
return PortfolioDailyWeights(table_df)
[docs]
def read_csv_intersection(path, wanted_cols, index_col=0, **kwargs):
# Read only column names (no data)
available = pd.read_csv(path, nrows=0).columns
# Keep only columns that exist
cols = [c for c in wanted_cols if c in set(available)]
# Ensure the index column is included so index_col works
idx_name = available[index_col] if isinstance(index_col, int) else index_col
if idx_name not in cols:
cols = [idx_name, *cols]
return pd.read_csv(
path,
usecols=cols,
index_col=index_col,
parse_dates=[index_col],
**kwargs
)