streamlit python yfinance och mpfinance

Permalänk
Medlem

streamlit python yfinance och mpfinance

hej!

behöver lite guide i vad jag ska jag göra för att få mina båda grafer att synas i streamlit eller om ni har något annat alternativ som gör det jag vill göra lite bättre så är det välkommet.

tanken är då att ha två eller fler grafer som kontinuerligt uppdateras, jag trodde att om jag la de i varsin tråd och sedan körde det igen så skulle det funka men det verkar inte funka eller så förstår jag inte mig på hur trådar fungerar. är det nu jag ska använda mig utav join? är ny inom GUI och liknande och har sedan tidigare bar gjort saker i terminalen så allt detta gui är rätt så nytt för mig så all hjälp är uppskattad!

import yfinance as yf import mplfinance as mpf import pandas as pd import time import streamlit as st from threading import Thread # https://github.com/matplotlib/mplfinance/blob/master/examples... st.title("Candle Chart") # Streamlit container for the chart chart_container = st.empty() # Function to fetch and process data def download_data(ticker, period="1d", interval="1m"): data = yf.download(ticker, period=period, interval=interval, multi_level_index=False) data = data[["Open", "High", "Low", "Close", "Volume"]] data.index = pd.to_datetime(data.index) return data def create_chart(symbol_ticker): # Infinite loop to update the chart while True: # Clear the previous chart chart_container.empty() # Fetch the latest data data = download_data(symbol_ticker) # Create the mplfinance plot fig, ax = mpf.plot( data, type="candle", style="yahoo", title=f"{symbol_ticker}", volume=True, show_nontrading=False, returnfig=True ) # Render the chart in Streamlit chart_container.pyplot(fig) # write the latest price in the streamlit app latest_price = data["Close"].iloc[-1] # Get the latest closing price latest_time = data.index[-1] # Get the latest time st.write(f"Latest Price : {latest_time} : {latest_price}") # Wait for 60 seconds before updating time.sleep(60) if __name__ == "__main__": # Create the initial chart c1 = Thread(target=create_chart(symbol_ticker="AAPL")) c2 = Thread(target=create_chart(symbol_ticker="MSFT")) c1.start() c2.start()

Permalänk
Medlem

1. Ditt program asvslutas och därmed stängs trådarna också av omedelbart efter sista raden i main, du måste "vänta" på trådarna, förslasvis genom join.

2. Du måste använda en mutex eller annat lås för att accessa en delad datastruktur mellan olika trådar, annars kommer du få massvis av konstiga problem.

3. Ena tråden kommer cleara för den andra och vice-versa.

4. Du behöver verkligen inte trådning för detta

Permalänk
Medlem
Skrivet av dlq84:

1. Ditt program asvslutas och därmed stängs trådarna också av omedelbart efter sista raden i main, du måste "vänta" på trådarna, förslasvis genom join.

2. Du måste använda en mutex eller annat lås för att accessa en delad datastruktur mellan olika trådar, annars kommer du få massvis av konstiga problem.

3. Ena tråden kommer cleara för den andra och vice-versa.

4. Du behöver verkligen inte trådning för detta

1. ska kika på join
2. ska kika på detta också
3. vad detta betyder vet jag inte
4. tänkte att det skulle bli mindre kod om jag använde trådar, tycker du jag ska överge trådar och övergå till annat istället?

edit:

låter som att enligt snubben på SO, så ska jag typ inte använda join men jag vet inte, blir förvirrad nu när olika folk säger tvärtom

från stackoverflow https://stackoverflow.com/questions/18773474/simple-way-to-ru...

Assuming your while loops are within the functions you listed, this is the easiest way I can think of.

from threading import Thread t1 = Thread(target = firstFunction) t2 = Thread(target = secondFunction) t1.start() t2.start()

As pointed out by tdelaney, doing it this way will just kick off each thread and immediately move on. If you need to wait for those threads to complete before running the rest of your program you can use the .join() method.

Permalänk
Medlem

överger trådar, blev så bökigt med trådar.