a
    Qni5                     @   s   e d ed 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dlT ddlmZmZ ddlZdZd	Zed
 d fddZdd ZeedddZdd ZdddZdd ZdS )ZStartingz...    N)datetime)gtfs_realtime_pb2)*)URLSROUTE_TYPE_NAMES           c                 C   s  zt |  | }W nP   t |  }|d d||d< |d d||d< |d d||d< Y n0 t| d|  d| d}d}tj|rt tj| }||k rtd	|  d
| d|d dd d}|r8td|  d
| d t	|d }t
|d}||j W d    n1 s&0    Y  td t|d}	tj|	
dtd}
tj|	
dtd}tj|	
dtd}tj|	
dtd}|jddid}|d t|d< t|d   |d t|d< dd }||
g d}
||g d }||g d!}||g d"}tj|	
d#td}tj|d$ d%d&jj|d$< ||d' d(k }d)d* }d+d, }|d- ||d.< |d. ||d/< |
||||d0tj|  |< d S )1Ngtfs_url_SWE_trip_updatesvehicle_positionszcache/gtfs_static_cache__z.zipTzUsing cached GTFS for /z (r
   z.1fzh old)FzDownloading static GTFS for u   …wbzStatic GTFS updatedrz	stops.txt)Zdtypez	trips.txtzstop_times.txtz
routes.txtZ
route_typeroute_type_staticcolumnsc                    s    fdd|D } | S )Nc                    s   g | ]}| j v r|qS  r   ).0cdfr   /var/www/html/gtfsloader.py
<listcomp>5       z:load_static_gtfs.<locals>.safe_usecols.<locals>.<listcomp>r   )r   colsZexistingr   r   r   safe_usecols4   s    z&load_static_gtfs.<locals>.safe_usecols)stop_id	stop_nameparent_station)trip_idroute_iddirection_idtrip_headsign
service_id)r$   route_short_nameroute_long_namer   )r#   r    departure_timestop_headsignpickup_typedrop_off_typezcalendar_dates.txtdatez%Y%m%d)formatZexception_type1c                 S   s*   t t| d\}}}|d |d  | S )N:r
   <   )mapintsplit)thmsr   r   r   time_to_secondsI   s    z)load_static_gtfs.<locals>.time_to_secondsc                 S   s   | dkr| d S | S )NQ r   )secr   r   r   normalize_secondsM   s    z+load_static_gtfs.<locals>.normalize_secondsr*   departure_secsnormalized_secs)stopstrips
stop_timesroutescalendar_dates)r   replaceprintospathexiststimegetmtimerequestsgetopenwritecontentzipfileZipFilepdZread_csvstrrenameastyper4   Zvalue_countsZto_datetimedtr.   applyvcache)countryoperatorZ	cache_ageurlsZ
cache_fileZneed_downloadZagerespfzr@   rA   rB   rC   r   rD   r:   r=   r   r   r   load_static_gtfs   s^    ",	ra   c           	      C   s   t d t }zt| | d }W n   d}Y n0 |tj| d d|dj i }|jD ]l}|	dr\|j
}|jD ]P}|	drv|j	d	r|jj||jj|jf< qv|j	d
rvd||jj|jf< qvq\|S )z'Download and parse GTFS-RT TripUpdates.u   Downloading GTFS-RT…headerNr   F)verifyheaderstrip_update	departuredelayrJ   T)rF   r   ZFeedMessager   ZParseFromStringrL   rM   rP   entityZHasFieldre   Zstop_time_updaterf   rg   Ztripr#   r    )	r]   r[   r\   feedrb   	rt_delaysrh   ZtuZstur   r   r   load_realtime\   s     



rk   )r    returnc                 C   s   |   ot| dko| dS )N   Z000)isdigitlenendswith)r    r   r   r   
is_area_idq   r   rq   c                 C   s  zt j|  W n   i t j|< Y n0 zt j| | }W n   t||}Y n0 |d  }|d td|d< |d td|d< | pd }|d j jj|dd|d j jj|ddB }||  }|dkrBg }|	dD ]F\}	}
|
|
d 
t }t|r&||jd  q||
jd  qt|}|d	krg }|	dD ]\}	}
||
jd  qZt|}tt|d |d S )
Nr@   r     r!   F)naser   de)rY   rZ   ra   copyrV   rT   ZfillnalowercontainsgroupbyrX   rq   ro   appendilocrS   Z	DataFramedictzip)queryr[   r\   datar@   qmaskZmatchesZ	best_rowsnamegroupZ	area_rowsr   r   r   searchs   s6    




r   c                 C   s   t | } | }|d t |d< |dkrn|  rnt| dkrn| d d }||d j | d  }|rn|S | |d jv r||d t | k d  }|r|S | gS ||d t | k d  }|r|S ||d j | d  d  }|r|S g S )Nr    rt   rm   r"   r   )rT   rv   rV   rn   ro   
startswithtolistvalues)r    Zstops_dfr[   baseZsiblingsZchildrenZprefix_matchesr   r   r   normalize_stop_id   sF    r   c                    s
  zt j|  W n   i t j|< Y n0 zt j| |  W n   t|| Y n0 zt| | }W n^   t j| |  t| }|d d||d< |d d||d< |d d||d< Y n0 t j| | }|d |d }|d |d }|d	 }t||| tj }|jd
 |j	d  |j
 }	|	td
  }
| }t| }|sXtd|  g S d |	kd |
k@ d t|@   }|
dkr|
d nd}d dkd |k@ d t|@   }tj||gdd}|j|ddj|ddjdd}||d |k d   }|
dkrl|tjdd }||d |k d   }tt|| }||d | }|d dd |d<  fdd }|j|dd!|d"< |j fd#ddd!|d$< d%d& }|j|dd!|d'< |d"}td(| g }fd)d*}| D ]\}}t|d+d,}z(t|dkr@d-}t|dkrRd}W n   Y n0 |rr|d.krvd}|d/krt|d0 t|d1  rq|| d2d ||d' t|d3 |d d4g d5}||vr|!| qt"|r|t j#| | | < |S )6Nr   r   r   r   r@   rA   rB   rC   rD   r
   r2   zNo matching stop_ids found for:r?   r    r;   r   r>   T)Zignore_indexr#   )Zonr$   r.   r'      daysr   c                 S   s   t | | S )N)r   rM   )xr   r   r   <lambda>  r   zdeparture.<locals>.<lambda>Ztraffic_typec                    s0   | d | d f}| v r(| d  |  S | d S )Nr#   r    r>   r   )rowkeyrj   r   r   apply_delay  s    zdeparture.<locals>.apply_delay)Zaxisrt_departure_secsc                    s   | d | d f v S )Nr#   r    r   )r   r   r   r   r     r   Zhas_realtimec                 S   sl   t j   }| d }|dkr8|tjdd }|d }n|}|}t j |t j j tj|d }|dS )Nr   r;   r   r   )secondsz%Y-%m-%dT%H:%M:%S)	r   nowr.   rS   	TimedeltacombineminrJ   strftime)r   todayZrt_secsZtarget_dateZtime_of_dayrW   r   r   r   secs_to_iso8601(  s    
"z"departure.<locals>.secs_to_iso8601Z	real_timezFUTURE: c                    s   t | dr$| d  r$| d S t | drH| d  rH| d S t | drl| d  rl| d S | d }  d |k }t|r|jd d }jd |kdf }t|r|jd S d	S )
Nr+   r&   r)   r#   r   r    r!   r   rr   )rS   ZnotnarM   stripro   r{   loc)r   r#   seqZlast_stop_idr   )rB   r@   r   r   get_destination=  s    
z"departure.<locals>.get_destinationr%   rr   r   nansncbr,   r-   (r(   )idtransport_mode)destinationdirection_codeexpectedline
deviations)$rY   rZ   ra   r   rE   rk   r   r   hourminutesecondHOURSr.   r   rF   rV   rT   isinrv   rS   concatmergeuniquer   r   listsetrX   Zsort_valuesZiterrowsrM   r4   r5   rz   ro   	operators)r    r[   r\   r]   r   rA   rC   rD   r   Znow_secscutoffZservice_dateZplatform_idsZtoday_departuresZtomorrow_overflowZtomorrow_departuresfutureZoperating_servicesZ	next_dateZtomorrow_servicesr   r   outputr   r   r   r   itemr   )rj   rB   r@   r   rf      s    











(
	
rf   )N)rF   __name__rL   rQ   rG   rJ   rY   ZpandasrS   r   Zgoogle.transitr   r   r   r   builtinsr   ZAGEra   rk   rT   boolrq   r   r   rf   r   r   r   r   <module>   s   (M+
$