From 5595571596f6fedac2d7f81a3608de277a322e11 Mon Sep 17 00:00:00 2001 From: "Carl Zh." Date: Tue, 5 Nov 2024 11:40:32 -0600 Subject: [PATCH] update code --- .../pythonx_lesson3.cpython-312.pyc | Bin 6361 -> 7146 bytes .../pythonx_lessons_pages/pythonx_lesson3.py | 153 ++++++++++-------- 2 files changed, 86 insertions(+), 67 deletions(-) diff --git a/webpages/pythonx_lessons_pages/__pycache__/pythonx_lesson3.cpython-312.pyc b/webpages/pythonx_lessons_pages/__pycache__/pythonx_lesson3.cpython-312.pyc index 9d127dcd175d6a156b6a52665271d1bd70912feb..4957797e17eb958b8a153a79ce8d243961d0f64c 100644 GIT binary patch delta 2746 zcmb_eU2GKB6`t82?|Qv!ds(mTF2=sLf!#Ihbqpjl1|x!rVjCMqd=}7pgviKvAknQ6lAm_X^2?8|V_LsG?HUr?xl`RbP7U{MeZ0 z=OrWU?%X@)=li~M?wS2_|341Y|1lPe2yjK->Y1r+TdsdUQVT0Te4hRN_qX2@nd)m| zCwz6wk2?~vTOv0V1W}j~tt%EuZu3qDWmUK{(gQ;$p%drwR7h zw@0*BEai`iNjBkcV?+L=*vc)K>W_5ZUGOagW{(Mi8CmeVcR|?m^F7i`MfN%P-1Ns{ zH|P#07i4H>{lP?o=pnlpTnL`)wD-XCcFP8;8um+nhuFG&FDZ8M$LyUzv~Jf%nB9CY zShG-bF2fE4_K6`j8|V;2V9s6&Cfeib z>x*W9_nBzdo~*ALG^s>r)sHp#!uFn?DQONJlctBg#n;sWLHcqzd7xiFek#_auuS5NVH8*oN6 z!=f+vad&!LjS~ak77M!Sdm^!ijR!iR zM+rt$m!%4n$xh8VotIPv7Enmm7EcYkBD@APp|n&-1XHN^c@CKi$U&mH5{73$BYo1E zE-N&RrY%ar9zYjVr7(+S_HsPE=u}Dpg0^tbxje0jBmiRPMHx*8s!p(?MJV*vo_en4)!bp&>7(T4ZB;cvDWF>WCv_gJS4yP`H+YPRm|82l>H^%vG@k24mB=` zT_6wfW}O{(9)Jrmh$_YWDbAGuO5RAk12)lf>uxmVspkv~r68$Jo@q?yFsSG#Gv!J1 z0#Y8<9W{{9PLp@njx>Xtlye9~8T5q7vg`4d#qXFk?t%75ZB7{i)5)&#Mq?U$I=z4_ z&rOO1D7)-kSX%@rfdZ2%RM?Tsj^o76Oc+?p!Ni;?<{0M;Vh{Twv5WmJ@nhE6 z)X#p>)R5j3nWLP+8YXZaWG8`p3Sf*v>6!ar8b zogIOKF5_%%HR8y`C!BY0bG@Ey*~?$;{6z;kR%2V_tongVwa(NnQov_4UcAw$=6ncT#Kdu}h<@tL2qN*bhf8 zSC%T*TGv9UC(-7WNXy*j$ua_~>lL*S5X`Cw#u zWaZq0rtFp1pR{#eAOCRtlgOR$%J_q}kt^feeE90{YI5&dbl+20j9ndD*|8Q)KLrHo z<@8GLlT`X)s`p;1_pe7%1CQD>HxA!xfAz_(R~}{d|10Q6sr6WGV*8b$^=2W~z(ZX- z`Kxgr2tZsrzZPx(XZVPi2wytBe$>alZrR!U4Ac^`F%p0u;)kzlEtD8bWmTbs|4*xi zy}vmm!_Kts*q^gE=kT-vy<(CeU-}A|aP4mjt##b=_ delta 2110 zcmbtVZEO=|9KXBv)~+vGyKAqd+q#Et&=;D*5Eu*!W6Zc^=uk`$VzS(NPrDo4-MqWf zl@teGL<~`yhq(Dk;wKDC)aVDl`1-+U{NTVrW|;{w`($FGP(w5^@p-Q8=p->FK27hQ z=l}Bi|Nbv`_jBJ5y)EB5oi+-ukB&t%DZbQl)kcmc{D1K22aB)M$VGe5GmPDmp+x69 z^f{DZ0NYZe7F*GKj2HbxduUhbrWd`*cua2HjqWnr$Q}hu4m(GH$(r(@UQ?Lnk(=gF z)@1W87MY^?^bkd9Y|&KRsaR|7+Qi?Wt3EU(U)DEO_ZT67UNUp-H1;#yAnfou$Lcj( ztnVP$?Y>2S-G4VlQ+ij`66*o+XW1e<6+)NHPav1M3!OAOORF}zhq!L*syot@X#8$4 zRcCw#=PV7OwxZ2!n2s39yvXwCzL|>^En@Rx=#fi->ZW=rjm|SPbrLh7smn)aO(&^5 z{oy=&hutfkfFLhrvmmEIpie@OQbY){P*7zkg0!kkgBcZ`k(8Wa?IsiX4j}hhtzfc+BRQDy1M8mNZ>a3)pJZ5p9YZ zR_Jb9$QO&9wU5X+tddcorbX$pS%7%IPd}YiA@Y3`|UX^qhF-}Ah{vY|yg$;d~WN}S^lE%DAEoEUEYBe}~9%l^!`muFOf~3+7G)P(kgql6>ONz9@aM1-d1NCtO z2@SdS%^A+MShz0#Lhm2_c|=gdpgIr*9TJjcTB<}P-1KVC<3NOIA(z#Gq!|WjNyRCN zLcvO03V5#2P1o2iD2x9crxp;Ma`%OCPI&$>p5b22)Ho&$LBh~QqR7)0K4KIDoDs58 zHJD*dDkqT&<5b2CZ!1PxE2 zA~*CeUX8T9p71&c!ozS%f$Ymim!8v+UAIFec>sXRPuNR>dy;ip>Bwh zm-I=@BB9MlvJBM-d1#X1h9@i>?XQk>9h2PCQU)Z!%xoen$uL5g#_Oo)1>VyNW|Ksi zkYo|g#%<_Xz8!t%O`-wb+@?!<7A6~0K^^=yqC!vcThKM$f)su?zV9|#}^5%+K%XVWX z$Bl6>I~qxpZI8NMw$^*CcH`G;*-Vltn{d_`K*^~oI8N|1D^{Yr{+Dficw@nT?F*FJ zls&O#Zn`*nVRXg%+)5z$JIk=3Vx?Hi#o-IXD^{&yV%VmNjR>&Ol55AZx%Yk(#qByj zy2g3u50nlpfqkFvU*^WnAFUxRxppq&&p{-xXKvNfe6et$aK*oD3EZ=L7uZ|&&TIbb zPu|+xyXt6pWBAhWl6T;?<8Y;k^6>NfOZyj!*H3-y|DGFsb!g4a%?C<>Yn^x8+t+yi ze5RCH5Lbesx2N8kDhCg)gc9!uZ-x%ti}tU?_x{G3dV-Z^i?8d7sp6urtF>fZ2y$1Q ztFE?rTgkStXW12c=%d^t?(KhSPF$3)dJp?XIMX*A zJJMl^I#n~4spRWeZpNL2!gN;B)edsD7SfU|$SJ69L2`TNu81Mb!-*Lo12vT;M+R$2 kx!AwuhcX+_Ls;X!o(ebydo9%SgadI)R&26_l|SpWb4 diff --git a/webpages/pythonx_lessons_pages/pythonx_lesson3.py b/webpages/pythonx_lessons_pages/pythonx_lesson3.py index 6aac0e814..bdbaff617 100644 --- a/webpages/pythonx_lessons_pages/pythonx_lesson3.py +++ b/webpages/pythonx_lessons_pages/pythonx_lesson3.py @@ -28,51 +28,61 @@ def pythonx_lesson3(): st.header(":three: Application Demo") # print text formatted by HTML + + # Display a styled title in HTML format st.markdown( "

Sample Stock Price App.

", unsafe_allow_html=True) + st.write("Reference: [yfinance Package](https://aroussi.com/post/python-yahoo-finance)") + # Brief description of the app's purpose + st.subheader('Build an online application for tracing stock price history') - st.write( - 'We will use the code learned from previous lecture to build an online application for tracing stock price' - ) + # Display a subheading in Markdown + st.header("Check Stock History") - # print text in markdown - st.markdown("## **Check Stock Information**") + # Define a list of popular stock symbols + stock_list = ['MSFT', 'AAPL', 'AMZN', 'GOOGL'] - # a list of stock names - stock_names = ['MSFT', 'AAPL', 'AMZN', 'GOOGL'] - # select a stock to check - target_stock = st.selectbox('Select a stock to check', options=stock_names) + # Create a dropdown menu for selecting a stock + stock_name = st.selectbox('Select a stock to check', options=stock_list) - st.markdown("## **Check Stock Price History**") - - # start date of the stock infomation, default is the first day of year 2024 + # Input for selecting the start date of stock data, default is January 1, 2024 start_date = st.date_input('Start Date', datetime(2024, 1, 1)) - # end date of the stock infomation, default is date of today + # Input for selecting the end date of stock data, default is today end_date = st.date_input("End Date") - # get today date + # Store today's date for validation today = date.today() - if st.button('Submit'): - # check valid date - if start_date > today or end_date > today: - st.write("## **Please select a valid date period.**") - else: - # download the stock data based on stock name, start/end date - data = yf.download(target_stock, start_date, end_date) - # show a progress bar - with st.spinner(text='In progress'): - fig = px.line(data, - x=data.index, - y=['Open', 'High', 'Low', 'Close'], - title=target_stock + " Stock Price", - labels={ - "value": "Stock Price ($)", - "variable": "Price Type" - }) - st.write(fig) - st.success('Done') + # Action to retrieve stock data when the 'Submit' button is clicked + if st.button('Submit'): + # Check if selected dates are valid (not in the future) + if (start_date > today) or (end_date > today) or (start_date > end_date): + st.warning("Please select a valid date period.") + else: + # Get data for the selected stock + stock = yf.Ticker(stock_name) + # Retrieve historical data between selected dates + stock_history = stock.history(start=start_date, end=end_date) + st.write("**Raw Data of Stock Price**") + # Display raw data of stock price + st.dataframe(stock_history) + # Plot stock price data (Open, High, Low, Close) using Plotly + fig = px.line(stock_history, + # use the index of the stock_history data as x-axis. + x=stock_history.index, + # plot data of columns ['Open', 'High', 'Low', 'Close'] + y=['Open', 'High', 'Low', 'Close'], + title=stock_name + " Stock Price", + labels={ + "value": "Stock Price ($)", + "variable": "Price Type" + }) + # Display the generated plot in the app + st.write(fig) + # Display a success message upon completion + st.success('Done') + source_code = """ @@ -82,52 +92,61 @@ def pythonx_lesson3(): import yfinance as yf import plotly.express as px - # print text formatted by HTML + + # Display a styled title in HTML format st.markdown( "

Sample Stock Price App.

", unsafe_allow_html=True) + st.write("Reference: [yfinance Package](https://aroussi.com/post/python-yahoo-finance)") + # Brief description of the app's purpose + st.subheader('Build an online application for tracing stock price history') - st.write( - 'We will use the code learned from previous lecture to build an online application for tracing stock price' - ) + # Display a subheading in Markdown + st.header("Check Stock History") - # print text in markdown - st.markdown("## **Check Stock Information**") + # Define a list of popular stock symbols + stock_list = ['MSFT', 'AAPL', 'AMZN', 'GOOGL'] - # a list of stock names - stock_names = ['MSFT', 'AAPL', 'AMZN', 'GOOGL'] - # select a stock to check - target_stock = st.selectbox('Select a stock to check', options=stock_names) + # Create a dropdown menu for selecting a stock + stock_name = st.selectbox('Select a stock to check', options=stock_list) - st.markdown("## **Check Stock Price History**") - - # start date of the stock infomation, default is the first day of year 2024 + # Input for selecting the start date of stock data, default is January 1, 2024 start_date = st.date_input('Start Date', datetime(2024, 1, 1)) - # end date of the stock infomation, default is date of today + # Input for selecting the end date of stock data, default is today end_date = st.date_input("End Date") - # get today date + # Store today's date for validation today = date.today() - if st.button('Submit'): - # check valid date - if start_date > today or end_date > today: - st.write("## **Please select a valid date period.**") - else: - # download the stock data based on stock name, start/end date - data = yf.download(target_stock, start_date, end_date) - # show a progress bar - with st.spinner(text='In progress'): - fig = px.line(data, - x=data.index, - y=['Open', 'High', 'Low', 'Close'], - title=target_stock + " Stock Price", - labels={ - "value": "Stock Price ($)", - "variable": "Price Type" - }) - st.write(fig) - st.success('Done') + # Action to retrieve stock data when the 'Submit' button is clicked + if st.button('Submit'): + # Check if selected dates are valid (not in the future) + if (start_date > today) or (end_date > today) or (start_date > end_date): + st.warning("Please select a valid date period.") + else: + # Get data for the selected stock + stock = yf.Ticker(stock_name) + # Retrieve historical data between selected dates + stock_history = stock.history(start=start_date, end=end_date) + st.write("**Raw Data of Stock Price**") + # Display raw data of stock price + st.dataframe(stock_history) + # Plot stock price data (Open, High, Low, Close) using Plotly + fig = px.line(stock_history, + # use the index of the stock_history data as x-axis. + x=stock_history.index, + # plot data of columns ['Open', 'High', 'Low', 'Close'] + y=['Open', 'High', 'Low', 'Close'], + title=stock_name + " Stock Price", + labels={ + "value": "Stock Price ($)", + "variable": "Price Type" + }) + # Display the generated plot in the app + st.write(fig) + # Display a success message upon completion + st.success('Done') + """