U

������g�o����������������������@���s����d�dl�Z�d�dlZd�dlZd�dlZd�dlZd�dlZd�dlT�d�dlmZ�d�dl	m	Z	m
Z
�d�dlZd�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��Zdd��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���ZforecastZparametersetr����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�YYYYMMDDHHMMSSZCBRFCPatternZNERFCPatternZLMRFCPattern�ABRFCPattern�NWRFCPatternZMBRFCPatternZRFCName�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���ZforecastDaterJ����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|jkr�|}�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���(