awacke1 commited on
Commit
d08783e
1 Parent(s): eeba00f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +151 -0
app.py CHANGED
@@ -1,5 +1,156 @@
1
  import streamlit as st
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  @st.experimental_memo
4
  def foo(x):
5
  return x**2
 
1
  import streamlit as st
2
 
3
+ import streamlit as st
4
+ import pandas as pd
5
+ import numpy as np
6
+ import altair as alt
7
+ import pydeck as pdk
8
+
9
+ # SETTING PAGE CONFIG TO WIDE MODE AND ADDING A TITLE AND FAVICON
10
+ st.set_page_config(layout="wide", page_title="NYC Ridesharing Demo", page_icon=":taxi:")
11
+
12
+ # LOAD DATA ONCE
13
+ @st.experimental_singleton
14
+ def load_data():
15
+ data = pd.read_csv(
16
+ "uber-raw-data-sep14.csv.gz",
17
+ nrows=100000, # approx. 10% of data
18
+ names=[
19
+ "date/time",
20
+ "lat",
21
+ "lon",
22
+ ], # specify names directly since they don't change
23
+ skiprows=1, # don't read header since names specified directly
24
+ usecols=[0, 1, 2], # doesn't load last column, constant value "B02512"
25
+ parse_dates=[
26
+ "date/time"
27
+ ], # set as datetime instead of converting after the fact
28
+ )
29
+
30
+ return data
31
+
32
+
33
+ # FUNCTION FOR AIRPORT MAPS
34
+ def map(data, lat, lon, zoom):
35
+ st.write(
36
+ pdk.Deck(
37
+ map_style="mapbox://styles/mapbox/light-v9",
38
+ initial_view_state={
39
+ "latitude": lat,
40
+ "longitude": lon,
41
+ "zoom": zoom,
42
+ "pitch": 50,
43
+ },
44
+ layers=[
45
+ pdk.Layer(
46
+ "HexagonLayer",
47
+ data=data,
48
+ get_position=["lon", "lat"],
49
+ radius=100,
50
+ elevation_scale=4,
51
+ elevation_range=[0, 1000],
52
+ pickable=True,
53
+ extruded=True,
54
+ ),
55
+ ],
56
+ )
57
+ )
58
+
59
+
60
+ # FILTER DATA FOR A SPECIFIC HOUR, CACHE
61
+ @st.experimental_memo
62
+ def filterdata(df, hour_selected):
63
+ return df[df["date/time"].dt.hour == hour_selected]
64
+
65
+
66
+ # CALCULATE MIDPOINT FOR GIVEN SET OF DATA
67
+ @st.experimental_memo
68
+ def mpoint(lat, lon):
69
+ return (np.average(lat), np.average(lon))
70
+
71
+
72
+ # FILTER DATA BY HOUR
73
+ @st.experimental_memo
74
+ def histdata(df, hr):
75
+ filtered = data[
76
+ (df["date/time"].dt.hour >= hr) & (df["date/time"].dt.hour < (hr + 1))
77
+ ]
78
+
79
+ hist = np.histogram(filtered["date/time"].dt.minute, bins=60, range=(0, 60))[0]
80
+
81
+ return pd.DataFrame({"minute": range(60), "pickups": hist})
82
+
83
+
84
+ # STREAMLIT APP LAYOUT
85
+ data = load_data()
86
+
87
+ # LAYING OUT THE TOP SECTION OF THE APP
88
+ row1_1, row1_2 = st.columns((2, 3))
89
+
90
+ with row1_1:
91
+ st.title("NYC Uber Ridesharing Data")
92
+ hour_selected = st.slider("Select hour of pickup", 0, 23)
93
+
94
+ with row1_2:
95
+ st.write(
96
+ """
97
+ ##
98
+ Examining how Uber pickups vary over time in New York City's and at its major regional airports.
99
+ By sliding the slider on the left you can view different slices of time and explore different transportation trends.
100
+ """
101
+ )
102
+
103
+ # LAYING OUT THE MIDDLE SECTION OF THE APP WITH THE MAPS
104
+ row2_1, row2_2, row2_3, row2_4 = st.columns((2, 1, 1, 1))
105
+
106
+ # SETTING THE ZOOM LOCATIONS FOR THE AIRPORTS
107
+ la_guardia = [40.7900, -73.8700]
108
+ jfk = [40.6650, -73.7821]
109
+ newark = [40.7090, -74.1805]
110
+ zoom_level = 12
111
+ midpoint = mpoint(data["lat"], data["lon"])
112
+
113
+ with row2_1:
114
+ st.write(
115
+ f"""**All New York City from {hour_selected}:00 and {(hour_selected + 1) % 24}:00**"""
116
+ )
117
+ map(filterdata(data, hour_selected), midpoint[0], midpoint[1], 11)
118
+
119
+ with row2_2:
120
+ st.write("**La Guardia Airport**")
121
+ map(filterdata(data, hour_selected), la_guardia[0], la_guardia[1], zoom_level)
122
+
123
+ with row2_3:
124
+ st.write("**JFK Airport**")
125
+ map(filterdata(data, hour_selected), jfk[0], jfk[1], zoom_level)
126
+
127
+ with row2_4:
128
+ st.write("**Newark Airport**")
129
+ map(filterdata(data, hour_selected), newark[0], newark[1], zoom_level)
130
+
131
+ # CALCULATING DATA FOR THE HISTOGRAM
132
+ chart_data = histdata(data, hour_selected)
133
+
134
+ # LAYING OUT THE HISTOGRAM SECTION
135
+ st.write(
136
+ f"""**Breakdown of rides per minute between {hour_selected}:00 and {(hour_selected + 1) % 24}:00**"""
137
+ )
138
+
139
+ st.altair_chart(
140
+ alt.Chart(chart_data)
141
+ .mark_area(
142
+ interpolate="step-after",
143
+ )
144
+ .encode(
145
+ x=alt.X("minute:Q", scale=alt.Scale(nice=False)),
146
+ y=alt.Y("pickups:Q"),
147
+ tooltip=["minute", "pickups"],
148
+ )
149
+ .configure_mark(opacity=0.2, color="red"),
150
+ use_container_width=True,
151
+ )
152
+
153
+
154
  @st.experimental_memo
155
  def foo(x):
156
  return x**2