U ������g�o����������������������@���s����d�dl�Z�d�dlZd�dlZd�dlZd�dlZd�dlZd�dlT�d�dlmZ�d�dl m Z m Z �d�dlZd�dl Z d�dlZd�dlm��mZ�d�dlZd�dlmZ�d�dlmZ�G�dd��d�ZdS�) �����N)�*)�OrderedDict)�datetime� timedelta)�RFC_Forecast)� RFC_Sitesc�������������������@���s����e�Zd�ZdZedd���Zejdd���Zedd���Zejdd���Zedd ���Zejd d ���Zdd��Z d d��Z dd��Zdd��Zdd��Z dd��Zdd��Zdd��Zdd��Zdd��Zdd ��Zd!d"��Zd#d$��Zd%S�)&�PI_XMLz0 Store one RFC forecast data c�����������������C���s���|�j�S��N�Z _timeZone��self��r ����A/lfs/h1/ops/prod/packages/nwm.v3.0.13/ush/rfc_ingestion/PI_XML.py�timeZone ���s����zPI_XML.timeZonec�����������������C���s ���||�_�d�S�r ���r ���)r����tr ���r ���r���r���$���s����c�����������������C���s���|�j�S�r ����Z_seriesr���r ���r ���r����series(���s����z PI_XML.seriesc�����������������C���s ���||�_�d�S�r ���r���)r����sr ���r ���r���r���,���s����c�����������������C���s���|�j�S�r ����Z _rfcsitesr���r ���r ���r����rfcsites0���s����zPI_XML.rfcsitesc�����������������C���s ���||�_�d�S�r ���r���)r����rr ���r ���r���r���4���s����c�����������������C���s ���||�_�g�|�_||�_|��|��dS�)za Initialize the RFC_Forecast object with a given filename N)�sourcer���r���� loadPIxml)r���� pixmlfilenameZsitesr ���r ���r����__init__8���s����zPI_XML.__init__c�������������� ���C���s����z@t��|�}|���}|�d�j|�_|�d�D�]}|�j�|��q,W�n>�t k r~�}�z t dt|��d�|�d���W�5�d�}~X�Y�nX�d�S�)Nz'{http://www.wldelft.nl/fews/PI}timeZonez%{http://www.wldelft.nl/fews/PI}serieszWARNING: parsing PI XML error: z: z skipping ...)�etree�parse�getroot�find�textr����iterr����append� Exception�RuntimeError�str)r���r���Zfstwml�rootr����er ���r ���r���r���C���s���� ����zPI_XML.loadPIxmlc�����������������C���s&���g�}|�j�D�]}|�t||�j���q |S�r ���)r���r!���r���r���)r���� rfc_seriesr���r ���r ���r���� toRFCForecastS���s���� zPI_XML.toRFCForecastc�����������������C���s���t�tdd��|������S�)Nc�����������������S���s���|�j�dko|�jd�k o|�����S�)N��RQOT�QINE�SQIN)�parameterId�rfcname�isEmpty�r���r ���r ���r����<lambda>^���s �����z*PI_XML.getFlowTimeseries.<locals>.<lambda>)�list�filterr(���r���r ���r ���r����getFlowTimeseries]���s���� �zPI_XML.getFlowTimeseriesc�����������������C���s���t�tdd��|������S�)Nc�����������������S���s���|�����S�r ���)�get5CharStationIDr0���r ���r ���r���r1���d��������z)PI_XML.getAllStationIDs.<locals>.<lambda>)�set�mapr4���r���r ���r ���r����getAllStationIDsc���s���� �zPI_XML.getAllStationIDsc��������������������s����t���fdd�|����D��d��}t���fdd�|����D��d��}|d�k r�|d�kr�t�|�}|���}t|���d�}|���d�}||kr�|jr�|j� ���||�}qt|� ���d|_|���d�}||k�r�|jj dd ��||�}q�|� ���||fS�) Nc�����������������3���s&���|�]}|����r|�����kr|V��qd�S�r ���)� isForecastr5�����.0r�����idr ���r���� <genexpr>i���s�����z5PI_XML.getObservedAndForecastForID.<locals>.<genexpr>c�����������������3���s&���|�]}|����r|�����kr|V��qd�S�r ���)� isObservedr5���r;���r=���r ���r���r?���l���s�������seconds�����observedr���F��last)�nextr4����copy�deepcopy�getT0r����getTimeStepInSeconds� getTimePeriod�timeValueQuality�popitem�resetTimePeriod�qualifierId)r���r>����fst�obv�T0Zdtr���r ���r=���r����getObservedAndForecastForIDh���s.������ z"PI_XML.getObservedAndForecastForIDc����������� ��� ���C���s���|�����}g�}g�}tdddg�}|D�]R}|j|kr"|���s"|���rL|�|��q"|���r`|�|��q"|jdkr"|�|��q"|�r�|D��]}|D��] }|j|jkr�|j |� ��k�r|j |j���k�r�t j|j|j �d�t|j�dd��s�|j�|j |j�|j t|j�df�i���n�|j |� ��k��r�t��}|jD�]"}||� ��k�r*|j|�||<��q*||_|j�|� ����r�|j�|� ��|j�|� ���i��|jj|� ��dd ��|� ��|_ t|j����d�t|j����d �f|_n�|j t|���d��} | |� ��k�r.|j�| t|j�dfi��|jj| dd ��| t|���d��} �q�|j�| |j�| t|j�df�i��|jj| dd ��|� ��|_ t|j����d�t|j����d �f|_�q�q�q�g�} |D�]>}d}|D�]}|j|jk�r�d}��qΐq�|�s�| �|���q�| D�]�}|j |� ��k��r2t��}|jD�]"}||� ��k�r|j|�||<��q||_nb|j t|���d��} | |� ��k�r�|j�| t|j�dfi��|jj| dd ��| t|���d��} �qF|� ��|_ t|j����d�t|j����d �f|_�q�n�|D�]�}|j |� ��k��rt��}|jD�]"}||� ��k�r�|j|�||<��q�||_nb|j t|���d��} | |� ��k�r||j�| t|j�dfi��|jj| dd ��| t|���d��} �q.|� ��|_ t|j����d�t|j����d �f|_�q�|S�) Nr*���r+���r,����CNRFCr���g-C��6?)Zabs_tolFrE��������rA���T)r(���r7���r-���r/���r@���r!���r:���r.���� stationIDZ startDaterJ���rM����keys�math�isclose�float�missVal�update�getr���Zhas_key�move_to_endr2���Z fstPeriodr���rK���) r���r���rD���ZforecastZparametersetr����oZtvq�kr���Zforcast_without_observed�found�fr ���r ���r����getReserviorForecastWithT0����s��� �� �� �� ��������� �� ���� � ���� � z!PI_XML.getReserviorForecastWithT0c�����������������C���s����d}d}|d�}d|�d�}d}d|�}d|�d �|�}d|�d �|�}d|�d�|�} d�} t��||�j�}|rtd} nvt��||�j�}|r�d } n^t��||�j�}|r�d} nFt��||�j�}|r�d} n.t��||�j�}|r�d} nt��| |�j�}|r�d} | S�)NzC[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])(2[0-3]|[01][0-9])z1[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])z(0[0-9]|[1-5][0-9]){2}z^(.*/)?CBRFC_Reservoirs_z.xmlz!^(.*/)?NERFC_Reservoir_Export.xmlz!^(.*/)?LMRFC_RESERVOIR_FORECAST\.z^(.*/)?z_RES_NWM_pixml_export.z_QINE_NWM_Res_export.z_RQOT_Forecast_.+_xml_�CBRFC�NERFC�ABRFC�NWRFC�LMRFC�MBRFC)�re�matchr���)r���� YYYYMMDDHHZYYYYMMDD�YYYYMMDDHHMMSSZCBRFCPatternZNERFCPatternZLMRFCPattern�ABRFCPattern�NWRFCPatternZMBRFCPatternZRFCName�resultr ���r ���r���� getRFCName��s:����zPI_XML.getRFCNamec�����������������C���s*���t���}|����}|D�]}|�|�����q|S�r ���)r7���r(����addr5���)r���Zstationsr���r���r ���r ���r����allStationsD��s ����zPI_XML.allStationsc�����������������C���s8���|�����}|jD�]$}|�|�}|�t|��s|��S�qd�S�r ���)rt����RFCZ getSitesByRFC� isdisjointr7���)r���ZgagesZstaZrfcZrfcgagesr ���r ���r����getRFCNameBySitelistK��s ���� zPI_XML.getRFCNameBySitelistc�����������������C���s���t��|d��}t��|d��}|�tdd���|�tdd���t��|�}|���}|���}|d�|d�kr�|j���D�]\}}||jkrp||j|<�qpn�|d�tdd��|d�k��r0|�|d�tdd����|d�tdd��} | |d�k��rt |j �ddf|j| <�| t|���d��} q�|j���D�]\}}||j|<��qn.|�|d���|j���D�]\}}||j|<��qH|����|j |_ |j|_|���} |���}|tdd��| d�k��r�|�|tdd��tdd���|td d��| d�k�r�|�|td |���d ����|S�)NrC���r����Zhours��days���������TrA�������� ���)rz���rB���)rH���rI����linearInterpolater����interForwardPersistrL���rM����items�persistForwardr[���r\���rK���rO���rP���ZforecastDaterJ����persistBackward)r���ZobvfstrR���rQ���Zcombined� obvperiod� fstperiodra����vr���Zcombined_periodrS���r ���r ���r����3combineObvFstAndApplyPresistenceLinearInterpolation`��sN���� ��� � z:PI_XML.combineObvFstAndApplyPresistenceLinearInterpolationc�����������������C���s���|��tdd���|���}|�tdd���|���}|d�|d�kr�|d�t|���d��}||d�kr�|j�||j|�i��|jj|dd��|t|���d��}qV�n:|d�tdd��|d�k�r�|���}||d�k�r�|d�}|tdd��}||k�r�|j�||j|�d�|j|�d��||�� ��||�� ����|j|�d��|j|�d�|j|�d��||�� ��||�� ����|j|�d��d fi��|jj|dd��|tdd��}q�|}||d�k�r�|j�||j|�i��|jj|dd��|tdd��}�q�n�|d�}|d�tdd��}||tdd��k�r\|j�|t tj�d d fi��|jj|dd��|tdd��}�q ||k�r�|j�||j|�i��|jj|dd��|tdd��}�q\||d�k�r�|j�||j|�i��|jj|dd��|tdd��}�q�n�|d�}|d�tdd��}||tdd��k�rR|j�|t tj�d d fi��|jj|dd��|tdd��}�q�||k�r�|j�||j|�i��|jj|dd��|tdd��}�qR||d�k�r�|j�||j|�i��|jj|dd��|tdd��}�q�d�S�)NrC���rx���r���rA���FrE���r|���ry���Tr{���) r���r���rL���r~���rK���rM���r]���r_���rJ���� total_secondsr[���r���r\���)r���r`���rc���r����r����r����t0�t1r ���r ���r����1linearInterpolateObservedPresisForecastAndCombine���s�������� � ���� �������� ���� ��z8PI_XML.linearInterpolateObservedPresisForecastAndCombinec����������� ������C���sz��|�����}g�}g�}|D�]>}|jdkr|jd�k r|���s|���rH|�|��q|�|��q|D�]�}d�}|���}|jdkr�|����|�t dd���|� |t dd��t dd�d��|�|t dd��d��nx|D�]}|j|jkr�|}�q�q�|r�|���s�|�� ||��n|�t dd���|� |t dd��t dd���|�|t dd����|����qX|����|D�]&}|jdk�rN|����rN|�|���qN|S�) Nr)����APRFCrC���rx���r|���ry���r{���r}���)r(���r-���r.���r/���r:���r!���rJ���ZaddLeadingAndTrailingZerosr~���r���r����r����rW���r����Z'linearInterpolateAndInterForwardPersistrO����clear) r���r���ZobsrQ���r���rc���rR���r����r`���r ���r ���r����*getReserviorObservedForecastCombinedWithT0 ��s\���� ��# ������ z1PI_XML.getReserviorObservedForecastCombinedWithT0N)�__name__� __module__�__qualname__�__doc__�propertyr����setterr���r���r���r���r(���r4���r9���rT���rd���rr���rt���rw���r����r����r����r ���r ���r ���r���r������s6��� $�'0zr���)�os�sys�timeZcsvrk����logging�string�collectionsr���r���r���Zdateutil.parserZdateutilrY���Zpytz�xml.etree.ElementTreer����ElementTreerH���r���r���r���r ���r ���r ���r����<module>���s���(