Можно ли создать основной фрейм данных для многих компаний из yfinance?

#python #pandas #dataframe #yfinance

Вопрос:

Мои цели заключаются в том, чтобы:

  1. Получите данные Yahoo finance OHLC (Открытые, высокие, низкие и закрытые) в Postgres.
  2. Возможность легко обновлять данные.
  3. Возможность легко добавлять или удалять тикеры.

Моя нынешняя методология:

  1. Создайте фрейм данных панд.
  2. Сбросьте данные в файл .csv
  3. Из КОПИИ Postgres

ПРОБЛЕМА: Я не знаю, как создать фрейм данных для компании A, затем добавить (объединить, объединить, объединить и т. Д.) фрейм данных для других компаний (до сих пор~150 компаний) и сбросить в .cvs.

Ниже приведен мой фактический код и обходной путь, который обеспечивает желаемый результат, но является неуклюжим.

Дай мне знать, что ты думаешь.

ФАКТИЧЕСКИЙ (работает не так, как ожидалось)

 import pandas as pd  import yfinance as yf   tickers = ['VIR','PATH'] #ticker = ['VIR'] for ticker in tickers:  df_yahoo = yf.download(ticker,   #start='2000-01-01',  #end='2010-12-31',  progress='True')  df = pd.DataFrame(df_yahoo)  df.insert(0, 'TICKER', ticker)  file_name = "/Users/kevin/Dropbox/Programming/Python/test_data/deleteme.csv" df.to_csv(file_name)  print(df)   

ОБХОДНОЙ ПУТЬ (рабочий)

 import pandas as pd  import yfinance as yf import pickle   tickers = ['VIR'] #ticker = ['VIR'] for ticker in tickers:   df_yahoo = yf.download(ticker,   #start='2000-01-01',  #end='2010-12-31',  progress='True')  df = pd.DataFrame(df_yahoo)  df.insert(0, 'TICKER', ticker)  tickers = ['PATH'] #ticker = ['VIR'] for ticker in tickers:    df_yahoo = yf.download(ticker,   #start='2000-01-01',  #end='2010-12-31',  progress='True')  df1 = pd.DataFrame(df_yahoo)  df1.insert(0, 'TICKER', ticker)  frames = [df1, df]  result = pd.concat(frames)  file_name = "/Users/kevin/Dropbox/Programming/Python/test_data/deleteme.csv" result.to_csv(file_name)  print(df)   

Ответ №1:

Учитывая то, чего, я думаю, вы хотите достичь, вот как бы я это сделал:

 # Create a function to load the data and create the frame # Assumes len(tickers) gt;= 1 def build_df(tickers):  df = pd.DataFrame(yf.download(tickers[0],   #start='2000-01-01',  #end='2010-12-31',  progress='True'))  df.insert(0, 'TICKER', tickers[0])  for ticker in tickers[1:]:  dx = pd.DataFrame(yf.download(ticker,   #start='2000-01-01',  #end='2010-12-31',  progress='True'))  dx.insert(0, 'TICKER', ticker)  df = pd.concat([df, dx])  return df   

Затем вызовите функцию для сборки нужного DF следующим образом:

 result = build_df(tickers)   

Наконец, выведите завершенный кадр в CSV

 file_name = "/Users/kevin/Dropbox/Programming/Python/test_data/deleteme.csv" result.to_csv(file_name)