o
    ЎiA/                     @   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mZ d dlm	Z	 d dlT d dl
mZmZ dZddd	Zd
d ZdedefddZdd ZdddZdd ZdS )    N)datetime)gtfs_realtime_pb2)*)URLSROUTE_TYPE_NAMES   Q c                 C   s  zt |  | }W n&   t |  }|d d||d< |d d||d< |d d||d< Y t| d|  d| d}d}tj|ret tj| }||k retd	|  d
| d|d dd d}|rtd|  d
| d t	|d }t
|d}||j W d    n1 sw   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 (  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   YC:\Users\computer\Desktop\notes\tskylt4.0\server\20260128 - new GTFS loader\gtfsloader.py
<listcomp>0   s    z:load_static_gtfs.<locals>.safe_usecols.<locals>.<listcomp>r   )r   colsexistingr   r   r   safe_usecols/   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_headsignZpickup_typeZ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_secondsD   s   z)load_static_gtfs.<locals>.time_to_secondsc                 S   s   | dkr| d S | S )Nr   r   )secr   r   r   normalize_secondsH   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astyper1   Zvalue_countsZto_datetimedtr+   applyvcache)countryoperatorZ	cache_ageurlsZ
cache_fileZneed_downloadZagerespfzr<   r=   r>   r?   r   r@   r7   r9   r   r   r   load_static_gtfs
   s`   "	r]   c           	      C   s   t d t }z
t| | d }W n   d}Y |tj| d d|dj i }|jD ]6}|	drb|j
}|jD ](}|	dra|j	d	rR|jj||jj|jf< q9|j	d
rad||jj|jf< q9q,|S )z'Download and parse GTFS-RT TripUpdates.u   Downloading GTFS-RT…headerNr   F)verifyheaderstrip_update	departuredelayrF   T)rB   r   ZFeedMessager   ZParseFromStringrH   rI   rL   entityZHasFieldra   Zstop_time_updaterb   rc   Ztripr"   r   )	rY   rW   rX   feedr^   	rt_delaysrd   ZtuZstur   r   r   load_realtimeW   s"   



rg   r   returnc                 C   s   |   ot| dko| dS )N   Z000)isdigitlenendswith)r   r   r   r   
is_area_idl   s    rm   c                 C   sP  z	t j| |  W n   ddit j| |< Y t j| | }|d  }|d td|d< |d td|d< | p?d }|d j jj|dd|d j jj|ddB }||  }|dkrg }|dD ]"\}	}
|
|
d 	t
 }t|r||jd	  qm||
jd	  qmt|}tt|d d d
 |d d d
 S )Nz	Try again r<   r   r    F)naser      )rU   rV   copyrR   rP   ZfillnalowercontainsgroupbyrT   rm   rk   appendilocrO   Z	DataFramedictzip)queryrW   rX   datar<   qmaskmatchesZ	best_rowsnamegroupZ	area_rowsr   r   r   searchn   s*   
&r   c                 C   s   t | } | }|d t |d< |dkr7|  r7t| dkr7| d d }||d j | d  }|r7|S | |d jv rT||d t | k d  }|rQ|S | gS ||d t | k d  }|rg|S ||d j | d  d  }|r{|S g S )Nr   rp   ri   r!   r   )rP   rr   rR   rj   rk   
startswithtolistvalues)r   Zstops_dfrW   baseZsiblingschildrenZprefix_matchesr   r   r   normalize_stop_id   sV   r   c                    s  zt | | }W n-   tj| |  t | }|d d||d< |d d||d< |d d||d< Y 	 tj| | }|d |d }|d |d }|d	 }t||| tj }|jd
 |jd  |j	 }	|	t
d
  }
| }t| }|std|  g S d |	kd |
k@ d t|@  }|j|ddj|ddjdd}||d |k d   }|
dkr|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" }|d ||d#< |d}td$| g }fd%d&}| D ]6\}}t|d'd(}|rC|d)krEd*}||d+d* ||d# t|d, |d d-g d.}|| q/t|rt|tj| | | < |S )/Nr	   r
   r   r   r<   r=   r>   r?   r@   r   r/   zNo matching stop_ids found for:r;   r   r"   )Zonr#   r+   r&   r      )daysr   c                 S   s   t | | S N)r   rI   )xr   r   r   <lambda>   s    zdeparture.<locals>.<lambda>Ztraffic_typec                    s0   | d | d f}| v r| d  |  S | d S )Nr"   r   r:   r   )rowkeyrf   r   r   apply_delay   s   zdeparture.<locals>.apply_delay)ZaxisZrt_departure_secsc                    s   | d | d f v S )Nr"   r   r   )r   r   r   r   r      s    Zhas_realtimec                 S   s:   t j   }t j |t j j tj| d }|dS )N)secondsz%Y-%m-%dT%H:%M:%S)	r   nowr+   combineminrF   rO   	Timedeltastrftime)r6   todayrS   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r$| d  r$| d S t | dr6| d  r6| d S | d }  d |k }t|ra|jd d }jd |kdf }t|ra|jd S d	S )
Nr*   r%   r(   r"   r   r   r    r   rn   )rO   ZnotnarI   striprk   rw   loc)r   r"   seqZlast_stop_idr   )r>   r<   r   r   get_destination  s   
z"departure.<locals>.get_destinationr$   rn   nanr   (r'   )idtransport_mode)destinationdirection_codeexpectedline
deviations) r   rU   rV   rA   rg   r   r   hourminutesecondHOURSr+   r   rB   rR   rP   isinmergeuniquer   rO   r   listsetrT   Zsort_valuesZiterrowsrI   r2   rv   rk   	operators)r   rW   rX   rY   r{   r=   r?   r@   r   Znow_secscutoffZservice_dateZplatform_idsfutureZoperating_servicesZ	next_dateZtomorrow_servicesr   r   outputr   r   r   r   itemr   )rf   r>   r<   r   rb      s   









	
rb   )r   r   )rH   rM   rC   rF   rU   ZpandasrO   r   Zgoogle.transitr   r{   r   r   r   r]   rg   rP   boolrm   r   r   rb   r   r   r   r   <module>   s   ( 
M
$