a
    z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   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delim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-   wyearr   r   r   filter_wyear9   s    r2   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%   tstdteddtminsr&   m1m2r   r   r   apply_threshold>   s    

rC   NaNFc                 C   s*   |  |} |rt|  | j|d|d d S )NF)r   r   )fillnaprintto_csv)r%   outnaVal
keepHeaderverboser   r   r   
save_tableP   s    
rL   meanc                 C   s   |  ||} d S r)   )r;   agg)r%   r5   rN   r   r   r   calc_timeseriesY   s    rO   c                 C   s   |  t|} | S r)   )r;   wyfmtrN   r%   rN   r   r   r   calc_wyearly^   s    rR   c                 C   s    |  | jj|} d| j_| S )NMonth)groupbyr   r0   rN   namerQ   r   r   r   calc_monthlyavgc   s    rV   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rN   r   r   PeakFlowDATE)rollingrM   dropnarR   np	nanargmaxr   intr;   rP   r<   shiftrE   cumsumvaluesflattenilocr    r   rU   r%   wdwidxrb   r   r   r   	calc_peakk   s    
rj      c                 C   sz   | j |dd  } t| tjdt}| t	
 dd }|| tj }| j| } dg| _d| j_| S )NTrW   rZ   r   r   LowFlowr\   )r]   rM   r^   rR   r_   	nanargminr   ra   r;   rP   r<   rb   rE   rc   rd   re   rf   r    r   rU   rg   r   r   r   calc_lowx   s    
rn   c                 C   s"   | t | g }t||j |jS r)   )r_   r`   rF   r   )r   ri   r   r   r   custagg   s    ro   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   )axisr3   r   r    T)dropr   RankB1ir   B2ir   B3i)
r^   r   r:   r_   sortrd   r   r    reset_indexr7   )r%   edfnr   r   r   get_extreme_moments   s    *
*$$r{   c                   C   s   d S r)   r   r   r   r   r   save_quantile   s    r|   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   rt   r   ru   r   rv   r      gtמ?g0?gV-o@gT@r   r}   r   r~   r   r   )g?W[?gHgQI?gMOĿ)r   r}   )g47?g~:pNgjMSt?g_LJgJ+?)r   r~   g	h"lx?)r   r   )	r   r:   r    rM   sumr   mathgammapow)ry   BLcr}   r~   r   gevr   a2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   r   r   r   dist0RtnYr)r   r:   r   rU   r   r_   powerlogr   r   doubler   )r   exListisFloodry   akpr   r   r   get_extremes   s    


*r   c                 C   s*   t |}t| }t|}t|||}|S r)   )r_   arrayr{   r   r   )r%   probsr   pgevry   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   )keysrp   )levelrq   c                    s0   g | ](} D ]}t j|k | qqS r   )r_   
percentiler   )r   ij)colsmfranksr   r   r      r   )r   r+   r0   uniquer    r   concatranger7   rx   r:   )	r%   r   r   use_wyrr   yrsmcsidxs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--lqrk   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   rD   ./z%Given output directory doesn't exist.z   z_DailyFlows.csvz_MonthlyFlows.csvz_YearlyFlows.csv
_PeakFlows	_LowFlowsz_MonthlyAvg.csv_NAViewz_PeakQuantile.csvz_LowQuantile.csvz_PeakStats.csvz_LowStats.csvz_PeakFreq.csvz_LowFreq.csvz_PeakGEV.csvz_LowGEV.csvDr6   zA-OCT)argparseArgumentParseradd_argumentra   r   osgetcwd
parse_argsr   floatr=   rF   sysexitrU   pathsplitextbasenamesplitr   isdirdrO   r%   my)parserargsinfiletholdprecrI   filenamer   foutoutDailyoutMonthAvgoutYearlyAvgoutPeakoutLowoutGroupMonthoutDiagn
outExQPeak	outExQLow
outExSPeak	outExSLow	outFqPeakoutFqLow
outGEVPeak	outGEVLowddfmdfwdfr   r   r   main  sF   


 
$


r   __name____main__)r   Nr   )r   r(   )rD   FF)rM   )rM   )rM   )r   )rk   )&r   r   r   datetimedtdecimalrer   pandasr   numpyr_   scipyspscipy.statsr   r   r   r   rP   r'   r.   r2   rC   rL   rO   rR   rV   rj   rn   ro   r{   r|   r   r   r   r   r   r   r   r   r   <module>   sD   


	




6	 X
