a
    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d4ddZd5d	d
Zdd Zdd Zd6ddZd7ddZd8ddZd9d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#g d,d-fd.d/Z$d0d1 Z%d2d3k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   L/home/disk/rocinante/DATA/temp/chico/hyak/writeup/scripts/climate/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    r0   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    
rF   meanc                 C   s   |  ||} d S r(   )r9   agg)r$   r3   rH   r   r   r   calc_timeseriesY   s    rI   c                 C   s   |  t|} | S r(   )r9   wyfmtrH   r$   rH   r   r   r   calc_wyearly^   s    rL   c                 C   s    |  | jj|} d| j_| S )NZMonth)groupbyr   r/   rH   namerK   r   r   r   calc_monthlyavgc   s    rO   r   c                 C   sz   | j |dd  } t| tjdt}| t	
 dd }|| tj }| j| } dg| _d| j_| S )NTwindowcenterrH   r   r   ZPeakFlowDATE)rollingrG   dropnarL   np	nanargmaxr   intr9   rJ   r:   shiftr@   cumsumvaluesflattenilocr    r   rN   r$   ZwdwidxrZ   r   r   r   	calc_peakk   s    
ra      c                 C   sz   | j |dd  } t| tjdt}| t	
 dd }|| tj }| j| } dg| _d| j_| S )NTrP   rS   r   r   ZLowFlowrT   )rU   rG   rV   rL   rW   	nanargminr   rY   r9   rJ   r:   rZ   r@   r[   r\   r]   r^   r    r   rN   r_   r   r   r   calc_lowx   s    
rd   c                 C   s"   | t | g }t||j |jS r(   )rW   rX   rA   r   )r   r`   r   r   r   custagg   s    re   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   )axisr1   r   r    T)dropr   ZRankB1ir   B2ir   B3i)
rV   r   r8   rW   sortr\   r   r    reset_indexr5   )r$   edfnr   r   r   get_extreme_moments   s    *
*$$rp   c                   C   s   d S r(   r   r   r   r   r   save_quantile   s    rq   c                 C   s*  g d}g d}g d}g d}g d}g d}t g dg dg d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rd|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< g d}	|	d |	d  |jd< td|jd  }g d}
d|d  |jd< |d d|jd   |jd< |S )N)r   r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )kappaalphapsir   ri   r   rj   r   rk   r      gtמ?g0?gV-o@gT@r   rr   r   rs   r   rt   )g?W[?gHgQI?gMOĿ)r   rr   )g47?g~:pNgjMSt?g_LJgJ+?)r   rs   g	h"lx?)r   rt   )	r   r8   r    rG   sumr   mathgammapow)rn   BLcrr   rs   rt   gevr{   a2Za4r   r   r   get_gev_params   s>    
$
(&4*r   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   rw   rv   rx   Zdist0ZRtnYr)r   r8   r   rN   r   rW   powerlogr   r   doubler   )r   ZexListisFloodrn   akpr   r   r   get_extremes   s    


*r   c                 C   s*   t |}t| }t|}t|||}|S r(   )rW   arrayrp   r   r   )r$   Zprobsr   Zpgevrn   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)   .0r   )r$   r   r   
<listcomp>   r   z!use_bootstrap.<locals>.<listcomp>c                    s   g | ]} |fi qS r   r   r   )funckwargsr   r   r      r   r   )keysrf   )levelrg   c                    s0   g | ](} D ]}t j|k | qqS r   )rW   
percentiler   )r   ij)colsmfranksr   r   r      r   )r   r*   r/   uniquer    r   concatranger5   rm   r8   )	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 u 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--lqrb   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Dr4   zA-OCT)argparseArgumentParseradd_argumentrY   r   osgetcwd
parse_argsr   floatr;   rA   sysexitrN   pathsplitextbasenamesplitr   isdirdrI   r$   my)parserargsinfileZtholdprecrD   filenamer   ZfoutZoutDailyZoutMonthAvgZoutYearlyAvgZoutPeakZoutLowZoutGroupMonthZoutDiagnZ
outExQPeakZ	outExQLowZ
outExSPeakZ	outExSLowZ	outFqPeakZoutFqLowZ
outGEVPeakZ	outGEVLowZddfmdfZwdfr   r   r   main  sF   


 
$


r   __name____main__)r   Nr   )r   r'   )r?   FF)rG   )rG   )rG   )r   )rb   )&r   r   rz   datetimedtdecimalrer   pandasr   numpyrW   scipyspscipy.statsr   r   r   r   rJ   r&   r-   r0   r>   rF   rI   rL   rO   ra   rd   re   rp   rq   r   r   r   r   r   r   r   r   r   <module>   sD   


	




6	 X
