Project Presentation#
Due Date: See course schedule
Format: 10-minute presentation + 5-minute Q&A
Points: Part of project grade (50% of course)
Purpose#
The presentation allows you to share your work with the class and practice communicating technical results. This is an essential skill for engineers in industry and academia.
! curl -LsSf https://astral.sh/uv/install.sh | sh && \
uv pip install -q --system "s26-06642 @ git+https://github.com/jkitchin/s26-06642.git"
from pycse.colab import pdf
downloading uv 0.10.3 x86_64-unknown-linux-gnu
no checksums to verify
installing to /home/runner/.local/bin
uv
uvx
everything's installed!
Presentation Structure#
Your 10-minute presentation should cover:
Section |
Time |
Content |
|---|---|---|
Introduction |
2 min |
Problem motivation, why it matters |
Data & Methods |
3 min |
Data source, key features, approach |
Results |
3 min |
Main findings, key visualizations |
Conclusions |
2 min |
Key takeaways, limitations, future work |
What You Need to Do#
1. Prepare Slides#
Create a slide deck (PowerPoint, Google Slides, or similar) with:
Title slide with your name and project title
Clear problem statement
Data overview (1-2 slides)
Methods summary (1-2 slides)
Results with visualizations (2-3 slides)
Conclusions and takeaways (1 slide)
Recommended: 8-12 slides total
2. Practice#
Time yourself to stay within 10 minutes
Practice explaining technical concepts clearly
Anticipate questions
3. Prepare for Q&A#
Be ready to answer questions about:
Why you chose your methods
Alternative approaches you considered
Limitations of your analysis
How results could be applied
Presentation Planning#
Use this space to outline your presentation:
Slide 1: Title#
Project title:
Your name:
Slide 2: Problem & Motivation#
Key message:
Slides 3-4: Data#
What to show:
Slides 5-6: Methods#
Key methods to highlight:
Slides 7-9: Results#
Main figures to include:
Slide 10: Conclusions#
Key takeaways:
Key Figures for Presentation#
Create high-quality versions of your key figures here. These should be:
Large enough to read from the back of the room
Clear axis labels and titles
Appropriate color schemes
import matplotlib.pyplot as plt
import numpy as np
# Set up nice plotting defaults for presentations
plt.rcParams.update({
'font.size': 14,
'axes.labelsize': 16,
'axes.titlesize': 18,
'figure.figsize': (10, 6),
'figure.dpi': 150
})
# Figure 1: Data Overview
# Create a visualization showing your data
# Figure 2: Model Performance
# Create a visualization showing your results
# Figure 3: Key Insight
# Create a visualization showing your main finding
What Success Looks Like#
A successful presentation will:
Criterion |
Expectation |
|---|---|
Clarity |
Audience understands the problem and approach |
Organization |
Logical flow, easy to follow |
Visuals |
Clear, readable figures that support the narrative |
Timing |
Stays within 10 minutes |
Delivery |
Confident, engaging, good eye contact |
Q&A |
Thoughtful responses to questions |
Tips for a Great Presentation#
Do:
Start with why the problem matters
Use figures to tell your story
Highlight key numbers (“accuracy improved from 75% to 92%”)
Be honest about limitations
End with clear takeaways
Avoid:
Reading directly from slides
Too much text on slides
Tiny fonts or cluttered figures
Going over time
Saying “I don’t know” without trying to reason through the question
Red Flags#
Slides with walls of text
Figures copied from the notebook without reformatting
No clear problem statement
Rushing through results
Unable to explain methodology choices
Submission#
Submit:
Your slide deck (PDF or PowerPoint)
This notebook with your presentation figures
Run the cell below to generate a PDF of this notebook.
pdf("project-presentation.pdf")
---------------------------------------------------------------------------
ConnectionRefusedError Traceback (most recent call last)
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/urllib3/connection.py:204, in HTTPConnection._new_conn(self)
203 try:
--> 204 sock = connection.create_connection(
205 (self._dns_host, self.port),
206 self.timeout,
207 source_address=self.source_address,
208 socket_options=self.socket_options,
209 )
210 except socket.gaierror as e:
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/urllib3/util/connection.py:85, in create_connection(address, timeout, source_address, socket_options)
84 try:
---> 85 raise err
86 finally:
87 # Break explicitly a reference cycle
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/urllib3/util/connection.py:73, in create_connection(address, timeout, source_address, socket_options)
72 sock.bind(source_address)
---> 73 sock.connect(sa)
74 # Break explicitly a reference cycle
ConnectionRefusedError: [Errno 111] Connection refused
The above exception was the direct cause of the following exception:
NewConnectionError Traceback (most recent call last)
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/urllib3/connectionpool.py:787, in HTTPConnectionPool.urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)
786 # Make the request on the HTTPConnection object
--> 787 response = self._make_request(
788 conn,
789 method,
790 url,
791 timeout=timeout_obj,
792 body=body,
793 headers=headers,
794 chunked=chunked,
795 retries=retries,
796 response_conn=response_conn,
797 preload_content=preload_content,
798 decode_content=decode_content,
799 **response_kw,
800 )
802 # Everything went great!
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/urllib3/connectionpool.py:493, in HTTPConnectionPool._make_request(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)
492 try:
--> 493 conn.request(
494 method,
495 url,
496 body=body,
497 headers=headers,
498 chunked=chunked,
499 preload_content=preload_content,
500 decode_content=decode_content,
501 enforce_content_length=enforce_content_length,
502 )
504 # We are swallowing BrokenPipeError (errno.EPIPE) since the server is
505 # legitimately able to close the connection after sending a valid response.
506 # With this behaviour, the received response is still readable.
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/urllib3/connection.py:500, in HTTPConnection.request(self, method, url, body, headers, chunked, preload_content, decode_content, enforce_content_length)
499 self.putheader(header, value)
--> 500 self.endheaders()
502 # If we're given a body we start sending that in chunks.
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/http/client.py:1298, in HTTPConnection.endheaders(self, message_body, encode_chunked)
1297 raise CannotSendHeader()
-> 1298 self._send_output(message_body, encode_chunked=encode_chunked)
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/http/client.py:1058, in HTTPConnection._send_output(self, message_body, encode_chunked)
1057 del self._buffer[:]
-> 1058 self.send(msg)
1060 if message_body is not None:
1061
1062 # create a consistent interface to message_body
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/http/client.py:996, in HTTPConnection.send(self, data)
995 if self.auto_open:
--> 996 self.connect()
997 else:
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/urllib3/connection.py:331, in HTTPConnection.connect(self)
330 def connect(self) -> None:
--> 331 self.sock = self._new_conn()
332 if self._tunnel_host:
333 # If we're tunneling it means we're connected to our proxy.
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/urllib3/connection.py:219, in HTTPConnection._new_conn(self)
218 except OSError as e:
--> 219 raise NewConnectionError(
220 self, f"Failed to establish a new connection: {e}"
221 ) from e
223 sys.audit("http.client.connect", self, self.host, self.port)
NewConnectionError: HTTPConnection(host='10.1.0.65', port=9000): Failed to establish a new connection: [Errno 111] Connection refused
The above exception was the direct cause of the following exception:
MaxRetryError Traceback (most recent call last)
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/requests/adapters.py:644, in HTTPAdapter.send(self, request, stream, timeout, verify, cert, proxies)
643 try:
--> 644 resp = conn.urlopen(
645 method=request.method,
646 url=url,
647 body=request.body,
648 headers=request.headers,
649 redirect=False,
650 assert_same_host=False,
651 preload_content=False,
652 decode_content=False,
653 retries=self.max_retries,
654 timeout=timeout,
655 chunked=chunked,
656 )
658 except (ProtocolError, OSError) as err:
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/urllib3/connectionpool.py:841, in HTTPConnectionPool.urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)
839 new_e = ProtocolError("Connection aborted.", new_e)
--> 841 retries = retries.increment(
842 method, url, error=new_e, _pool=self, _stacktrace=sys.exc_info()[2]
843 )
844 retries.sleep()
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/urllib3/util/retry.py:535, in Retry.increment(self, method, url, response, error, _pool, _stacktrace)
534 reason = error or ResponseError(cause)
--> 535 raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type]
537 log.debug("Incremented Retry for (url='%s'): %r", url, new_retry)
MaxRetryError: HTTPConnectionPool(host='10.1.0.65', port=9000): Max retries exceeded with url: /api/sessions (Caused by NewConnectionError("HTTPConnection(host='10.1.0.65', port=9000): Failed to establish a new connection: [Errno 111] Connection refused"))
During handling of the above exception, another exception occurred:
ConnectionError Traceback (most recent call last)
Cell In[6], line 1
----> 1 pdf("project-presentation.pdf")
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/pycse/colab.py:287, in pdf(line)
285 delay = 10000
286 plotly = "-p" in args
--> 287 pdf_from_html(pdf, verbose, plotly, delay)
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/pycse/colab.py:122, in pdf_from_html(pdf, verbose, plotly, javascript_delay)
119 if verbose:
120 print("PDF via wkhtmltopdf")
--> 122 fname, fid = current_notebook()
123 ipynb = notebook_string(fid)
125 if plotly:
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/pycse/colab.py:86, in current_notebook()
84 ip = gethostbyname(gethostname())
85 url = f"http://{ip}:9000/api/sessions"
---> 86 d = requests.get(url).json()[0]
87 fid = d["path"].split("=")[1]
88 fname = d["name"]
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/requests/api.py:73, in get(url, params, **kwargs)
62 def get(url, params=None, **kwargs):
63 r"""Sends a GET request.
64
65 :param url: URL for the new :class:`Request` object.
(...) 70 :rtype: requests.Response
71 """
---> 73 return request("get", url, params=params, **kwargs)
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/requests/api.py:59, in request(method, url, **kwargs)
55 # By using the 'with' statement we are sure the session is closed, thus we
56 # avoid leaving sockets open which can trigger a ResourceWarning in some
57 # cases, and look like a memory leak in others.
58 with sessions.Session() as session:
---> 59 return session.request(method=method, url=url, **kwargs)
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/requests/sessions.py:589, in Session.request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
584 send_kwargs = {
585 "timeout": timeout,
586 "allow_redirects": allow_redirects,
587 }
588 send_kwargs.update(settings)
--> 589 resp = self.send(prep, **send_kwargs)
591 return resp
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/requests/sessions.py:703, in Session.send(self, request, **kwargs)
700 start = preferred_clock()
702 # Send the request
--> 703 r = adapter.send(request, **kwargs)
705 # Total elapsed time of the request (approximately)
706 elapsed = preferred_clock() - start
File /opt/hostedtoolcache/Python/3.11.14/x64/lib/python3.11/site-packages/requests/adapters.py:677, in HTTPAdapter.send(self, request, stream, timeout, verify, cert, proxies)
673 if isinstance(e.reason, _SSLError):
674 # This branch is for urllib3 v1.22 and later.
675 raise SSLError(e, request=request)
--> 677 raise ConnectionError(e, request=request)
679 except ClosedPoolError as e:
680 raise ConnectionError(e, request=request)
ConnectionError: HTTPConnectionPool(host='10.1.0.65', port=9000): Max retries exceeded with url: /api/sessions (Caused by NewConnectionError("HTTPConnection(host='10.1.0.65', port=9000): Failed to establish a new connection: [Errno 111] Connection refused"))