@LukeNukem: wenn man keinen Setter hat, sind die Properties eigentlich überflüssig.
Du hast Dir sicher etwas dabei gedacht, einen Multiprocessing-Lock mit einem ThreadPoolExecutor zu mischen.
submit hat den Vorteil, dass man da einen Rückgabewert benutzen kann, den Du aber nicht wirklich nutzt. Und das Ergebnis eines Requests ist immer noch kein req(uest).
Statt executor.submit und future.result würde man einfach execute.map benutzen.
Code: Alles auswählen
class YahooFun:
QUOTE_URL = 'https://query1.finance.yahoo.com/v7/finance/quote?symbols={}'
FILENAME = 'yahoo.csv'
def __init__(self, filename=None):
self.filename = filename or self.FILENAME
self.df = pd.read_csv(self.filename, sep=';')
def yahoo(self, ticker):
try:
url = self.QUOTE_URL.format(ticker)
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}).json()
result = response['quoteResponse']['result'][0]
return [
quote_req.get('regularMarketChangePercent', 0),
quote_req.get('regularMarketPrice', 0),
quote_req.get('epsCurrentYear', 0),
quote_req.get('marketCap', 0) / 1000000000
]
except Exception as e: # not so nice, but for demo purposes...
logging.exception('Something went terribly wrong')
return [0.0] * 4
def main():
yf = YahooFun()
print(yf.df)
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
result = list(executor.map(yf.yahoo, yf.df.Ticker))
df = pd.DataFrame(result, columns=["Change", "Price", "EPS", "Cap"])
print(df.round(2))
if __name__ == '__main__':
main()
Aber jetzt braucht ja die yahoo-Methode gar kein self mehr. Wir haben also gar keine Klasse:
Code: Alles auswählen
QUOTE_URL = 'https://query1.finance.yahoo.com/v7/finance/quote?symbols={}'
FILENAME = 'yahoo.csv'
def query_yahoo(ticker):
try:
response = requests.get(QUOTE_URL, params={"symbols":ticker}, headers={'User-Agent': 'Mozilla/5.0'}).json()
result = response['quoteResponse']['result'][0]
return [
quote_req.get('regularMarketChangePercent', 0),
quote_req.get('regularMarketPrice', 0),
quote_req.get('epsCurrentYear', 0),
quote_req.get('marketCap', 0) / 1000000000
]
except Exception as e: # not so nice, but for demo purposes...
logging.exception('Something went terribly wrong')
return [0.0] * 4
def main():
yf_df = pd.read_csv(self.filename, sep=';')
print(yf_df)
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
result = list(executor.map(query_yahoo, yf_df.Ticker))
df = pd.DataFrame(result, columns=["Change", "Price", "EPS", "Cap"])
print(df.round(2))
if __name__ == '__main__':
main()
Am besten fängt man andersherum an, man schreibt Funktionen, und sobald man merkt, das man mehrere Funktionen hat, die den selben Zustand brauchen, packt man die in eine Klasse.