o
    ac                     @   sN  d dl mZmZ d dlZd dlmZ d dlmZ d dlZd dl	m
Z
mZ d dlZd dlmZ e ZG dd dejZG d	d
 d
ejZG dd dejZG dd dejZG dd dejZdejdefddZdejdefddZdedeeef fddZdedefddZejdedd efd!d"Z e!d#krej"ed$d%d& dS dS )'    )DictListN)JSONResponse)Request)portfolio_optimizerpost_process_portfolio)	DataFramec                   @   s.   e Zd ZU eed< eed< eed< eed< dS )ETFintickerisinexchangefilenameN)__name__
__module____qualname__str__annotations__ r   r   ?/home/byschii/eodhistoricaldata/boilerplate_backend/./server.pyr	      s
   
 r	   c                   @   s6   e Zd ZU eed< eed< eed< eed< eed< dS )ETFOutr
   r   r   percent
last_priceN)r   r   r   r   r   floatr   r   r   r   r      s   
 r   c                   @   s2   e Zd ZU ee ed< eed< eed< eed< dS )	GoRequestetfsprefer_recent_data
min_weight
num_layersN)	r   r   r   r   r	   r   boolr   intr   r   r   r   r      
   
 r   c                   @   s2   e Zd ZU ee ed< eed< eed< eed< dS )LayerOutr   riskexpected_returnsharpe_ratioN)r   r   r   r   r   r   r   r   r   r   r   r!   !   r    r!   c                   @   s   e Zd ZU ee ed< dS )
GoResponselayersN)r   r   r   r   r!   r   r   r   r   r   r%   '   s   
 r%   etf_inforeturnc                 C   s   t | j| j| j| j| jdS )N)r
   r   r   r   r   )r   r
   r   r   r   r   )r'   r   r   r   EtfInfo2ETFOut-   s   r)   
risk_layerc                 C   s"   t dd | jD | j| j| jdS )Nc                 S      g | ]}t |qS r   )r)   ).0r'   r   r   r   
<listcomp>9       z&RiskLayer2LayerOut.<locals>.<listcomp>)r   r"   r#   r$   )r!   r   r"   r#   r$   )r*   r   r   r   RiskLayer2LayerOut7   s   r/   dfc                 C   sf   i }| j D ]+}| | jd }||kr,tdt| | D ]}| | j|  }||kr+ nq|||< q|S )zcreates a dict of pairs (ticker, last price)
    sometimes the last price is NaN, 
    so it s necessary to go to previous prices until a price is found   )columnsilocrangelen)r0   last_pricesr
   lpir   r   r   get_last_pricesB   s   

r:   
go_requestc                 C   s   dd | j D }dd | j D }t||}tj|| j| jd}t|| j}|d urEt	|dkrEt
|}t||}tdd |D dS td)	Nc                 S   s   g | ]}|j |j|jd qS )r
   r   r   r<   r,   etfr   r   r   r-   W   s    zgo_optimize.<locals>.<listcomp>c                 S   s   g | ]}|j qS r   )r   r=   r   r   r   r-   `   s    )r   r   r   c                 S   r+   r   )r/   )r,   r*   r   r   r   r-   z   r.   )r&   zerror optimizing portfolio)r   r   build_dataframer   PortfolioOptimizerr   r   stratify_portfolior   r6   r:   complete_infor%   	Exception)r;   	etf_datasetf_filenamesr0   	optimizerpartial_stratifiedr7   full_stratifiedr   r   r   go_optimizeV   s6   	rI   z	/optimize)response_modelrequestc              
      sz   |   I d H }tdi |}zt|}td| dW S  ty< } zt| tddt|idW  Y d }~S d }~ww )N   )status_codecontenti  errorr   )jsonr   rI   r   dictrC   printr   )rK   request_bodyr;   go_responseer   r   r   optimize   s$   rV   __main__z	127.0.0.1i@  )hostport)#typingr   r   fastapifastapi.responsesr   fastapi.requestsr   pydanticpy_opt_utilsr   r   uvicornpandasr   FastAPIapp	BaseModelr	   r   r   r!   r%   EtfInfor)   	RiskLayerr/   r   r   r:   rI   postrV   r   runr   r   r   r   <module>   s.    
/