B
    	a                 @   s,  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZ	d dl
Zd dlZd dlmZ d dlmZ dZd6ddZd7d	d
Zdd Zdd Zd8ddZd9ddZd:ddZd;ddZd<ddZd=ddZd d! Zd"d# Zd$d% Z d&d' Z!d(d) Z"d*d+ Z#d,d-d.gd/fd0d1Z$d2d3 Z%d4d5kr(e%  dS )>    N)
genextreme)	timedeltazA-SEP[ 	:,-]+c             C   s   t j| |d||d}|jd d df td |jd d df t }t j|dd}t|jd d df d	 d	 d
d }|| }||_||j	dd   }|S )Npython)sepengineheaderskiprowsr       z%Y %m)format      c             S   s   t | d dS )Nr   )days)td)x r   D/home/disk/rocinante/DATA/temp/chico/hyak/writeup/scripts/metrics.py<lambda>-       zread_data.<locals>.<lambda>   )
pdread_csvlocastypestrto_datetimeroundapplyindexcolumns)ifiledelimZhdrskipdfdatesr   r   r   r   	read_data)   s    4(r&   '  c             C   s    | | j j|k| j j|k@  } | S )N)r   year)r$   styredyrr   r   r   filter_year4   s    r+   c             C   s(   | j j| j jdk }| ||k||k@  S )N	   )r   r(   month)r$   r)   r*   Zwyearr   r   r   filter_wyear9   s    r.   c             C   sr   | j d }| j d }t|| t|  jd }tj||d|d}tj||d}| d	 }|d	 }d S )Nr   <   z{}min)freq)r   M)
r   r   lensecondsr   
date_ranger   	DataFrameresamplecount)r$   tZstdtZeddtZminsr%   m1m2r   r   r   apply_threshold>   s    

r<   NaNFc             C   s*   |  |} |rt|  | j|d|d d S )NF)r   r   )fillnaprintto_csv)r$   outnaValZ
keepHeaderverboser   r   r   
save_tableP   s    
rD   meanc             C   s   |  ||} d S )N)r7   agg)r$   r1   rF   r   r   r   calc_timeseriesY   s    rG   c             C   s   |  t|} | S )N)r7   wyfmtrF   )r$   rF   r   r   r   calc_wyearly^   s    rI   c             C   s    |  | jj|} d| j_| S )NZMonth)groupbyr   r-   rF   name)r$   rF   r   r   r   calc_monthlyavgc   s    rL   r   c             C   sp   | j |dd } t| tjd}| t d	d
 }|| tj }| j| } dg| _d| j_| S )NF)windowcenter)rF   r   r   ZPeakFlowDATE)rollingrE   rI   np	nanargmaxr7   rH   r8   shiftr>   cumsumr   intvaluesflattenilocr    r   rK   )r$   wdwidxrS   r   r   r   	calc_peakk   s    
r[      c             C   sp   | j |dd } t| tjd}| t d	d
 }|| tj }| j| } dg| _d| j_| S )NF)rM   rN   )rF   r   r   ZLowFlowrO   )rP   rE   rI   rQ   	nanargminr7   rH   r8   rS   r>   rT   r   rU   rV   rW   rX   r    r   rK   )r$   rY   rZ   rS   r   r   r   calc_lowx   s    
r^   c             C   s"   | t | g }t||j |jS )N)rQ   rR   r?   r   )r   rZ   r   r   r   custagg   s    r_   c             C   s   |   }tjtj|jddd d d |j|jd}|jdd}|jd |d< t	|j}||d  ||d   ||jd   |d	< |d	 |d |d   |d
  |d< |d |d
 |d   |d  |d< |S )Nr   )axisr/   )r   r    T)dropr   ZRankB1ir   B2ir   B3i)
dropnar   r6   rQ   sortrV   r   r    reset_indexr3   )r$   edfnr   r   r   get_extreme_moments   s    *
*$$rj   c               C   s   d S )Nr   r   r   r   r   save_quantile   s    rk   c             C   s\  dddddg}dddddg}ddddg}ddddg}ddddg}ddddg}t ddddgddddgddddgd}| | jd   |d< | d  |d< | d  |d< | d  |d< |d |d< d|d  |d  |d< d	|d  d	|d   |d  |d< |d d|d   dkr(d
|d< nd|d  |d d|d    d |d< d|d  d|d  |d   |jd< td|jd  }|jd |d  |dtd|jd     |jd< |d |jd |d  |jd   |jd< ddddg}	|	d |	d  |jd< td|jd  }ddddg}
d|d  |jd< |d d|jd   |jd< |S )Nr   r   r   )kappaalphapsirb   r   rc   rd      gtמ?g0?gV-o@gT@)r   rl   )r   rm   )r   rn   g?W[?gHgQI?gMOĿ)r   rl   g47?g~:pNgjMSt?g_LJgJ+?)r   rm   g	h"lx?)r   rn   )	r   r6   r    rE   sumr   mathgammapow)rh   BLcrl   rm   rn   gevrr   a2Za4r   r   r   get_gev_params   s<    
$
(&4*ry   c             C   s   |rt ddd|  i}nt dd| i}d|j_| jd }| jd }| jd }||| dtt|j |   |d< |	tj
}|	t|_d|j_|S )Nprobr   )r   rm   )r   rl   )r   rn   Zdist0ZRtnYr)r   r6   r   rK   r   rQ   powerlogrz   r   doubler   )rw   ZexListisFloodrh   akpr   r   r   get_extremes   s    


*r   c             C   s*   t |}t| }t|}t|||}|S )N)rQ   arrayrj   ry   r   )r$   Zprobsr~   Zpgevrh   r   r   r   calc_extremes   s
    
r      2   _   Tc       	         s   |rj jj jdk  }nj j }fdd|D }fdd|D }|d j }|d j tj|tt|ddj	ddtj
| d fd	d|D }tj
||dS )
Nr,   c                s   g | ]}  j j|k qS r   )r   r(   ).0r   )r$   r   r   
<listcomp>   s    z!use_bootstrap.<locals>.<listcomp>c                s   g | ]} |fqS r   r   )r   r   )funckwargsr   r   r      s    r   )keysr`   )level)r   r    c                s0   g | ](} D ]}t j|k | qqS r   )rQ   
percentiler   )r   ij)colsmfranksr   r   r      s    )r   r(   r-   uniquer    r   concatranger3   rg   r6   )	r$   r   r   Zuse_wyrr   ZyrsZmcsidxsZpqr   )r   r$   r   r   r   r   r   use_bootstrap   s    

 r   c              C   s  t  } | d t  } | d | jddddd | jddd	d
d | jddd	dd | jddd	dd | jddd	dd | jddtddd | jddtddd | jddtddd | jddtddd | jddd	dd | jd dd	d!d | jd"dd	d#d | jd$dd	d%d | jd&td'd(d) | jd*td+d,d) | jd-td.d/d) | jd0dd	d1d | jd2dd	d3d | jd4dd	d5d | jd6dd	d7d | jd8dtdd9d: | jd;dd	d<d | jd=d>d?d@d | jdAdtddBd: | jdCdtddDd: | jdEdd	dFd | jdGdd	dHd | jdIdd	dJd | jdKdd	dLd | jdMtd dNd) | jdOdt dP |  }|j}t	|j
dk st	|j
dkrtdQ t  t	|j
}dR}dS}|jd krtjtj|d dTd }n|j}|jdU }tj|jstdV tdW|  t  || }|dX }	|dY }
|dZ }|d[ }|d\ }|d] }|d^ }|d_ }|d` }|da }|db }|dc }|dd }|de }|df }|jrttdg}|jrttdh}|jrttdi}d S )jN
input_filez-t?r   ziApply a threshold for NaN calculations. Choose between 0 to 1. 0 accepts all. 1 requires all data points.)nargsdefaulthelpz-d
store_trueFzCreates a daily data file.)actionr   r   z-mz Calculates average monthly data.z-pz#Calculates peak flow by water year.z-lz4Calculates minimum 7-day average flow by water year.z--pqstorer   z>Choose the number of days to include in a rolling flow. (Peak))r   typer   r   z--lqr\   z=Choose the number of days to include in a rolling flow. (Low)z--pfreq z/Calculates frequency from streamflow magnitudesz--lfreqz-gz.Calculates monthly averages grouped by months.z-yz!Calculates water yearly averages.z-ezCalculates extreme statistics.z--gevzTSave GEV parameters as output when calculating frequency from streamflow magnitudes.z--expyrz2,10,50,100zdSpecify return years to use for extreme statistics. Input comma delimited list. Default: 2,10,50,100)r   r   r   z--exlyrz2,10z]Specify return years to use for extreme statistics. Input comma delimited list. Default: 2,10z--nazNA,NaN, zTProvide list of values to treat as NA. Input comma delimited list. Default NA,NaN, .z-sz0Strips the dates to start and end on water year.z-xz4Diagnostics table showing NA for each month and yearz-kz)Keep NaN in dataset when using threshold.z-vzOutputs results on screen.z--skipz"Skips the first [n] lines of file.)r   r   r   r   z--headerz9Uses the first line as header. Default assumes no header.z	--headoutstore_falseTz/No header on output. Header enabled by default.z--startzSpecify start year to cut.z--endzSpecify end year to cut.z--datesz.Creates a dates only csv for peak or low flow.z--wdayz-Creates a wday only csv for peak or low flow.z--flowz-Creates a flow only csv for peak or low flow.z--quantilesz0Create a quantile file during stat calculations.z--namez"Use a custom filename for outputs.out_dir)r   r   z=ERROR: Threshold out of range. Please choose between 0 and 1.r   r=   ./z%Given output directory doesn't exist.z   z_DailyFlows.csvz_MonthlyFlows.csvz_YearlyFlows.csvZ
_PeakFlowsZ	_LowFlowsz_MonthlyAvg.csvZ_NAViewz_PeakQuantile.csvz_LowQuantile.csvz_PeakStats.csvz_LowStats.csvz_PeakFreq.csvz_LowFreq.csvz_PeakGEV.csvz_LowGEV.csvDr2   zA-OCT)argparseArgumentParseradd_argumentrU   r   osgetcwd
parse_argsr   floatr9   r?   sysexitrK   pathsplitextbasenamesplitr   isdirdrG   r$   my)parserargsinfileZtholdprecrB   filenamer   ZfoutZoutDailyZoutMonthAvgZoutYearlyAvgZoutPeakZoutLowZoutGroupMonthZoutDiagnZ
outExQPeakZ	outExQLowZ
outExSPeakZ	outExSLowZ	outFqPeakZoutFqLowZ
outGEVPeakZ	outGEVLowZddfZmdfZwdfr   r   r   main  s
   

	 
$


r   __name____main__)r   Nr   )r   r'   )r=   FF)rE   )rE   )rE   )r   )r\   )&r   r   rq   datetimedtdecimalrer   pandasr   numpyrQ   scipyspscipy.statsr   rw   r   r   rH   r&   r+   r.   r<   rD   rG   rI   rL   r[   r^   r_   rj   rk   ry   r   r   r   r   r   r   r   r   <module>   sN   


	




6	 X
     I