Есть ли способ перебирать списки и функции? - PullRequest
0 голосов
/ 27 января 2020

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

self.stock_tickers = ['MMM', 'ABT', 'ABBV', 'ABMD', 'ACN', 'ATVI', 'ADBE', 'AMD', 'AAP', 'AES']

self.stock_endpoints = ['one_year_daily', 'two_year_daily',
                        'one_year_weekly', 'two_year_weekly', 'three_year_weekly',
                        'one_month_daily', 'two_month_daily', 'three_month_daily', 'six_month_daily',
                        'one_day_minute', 'two_day_minute', 'three_day_minute']

self.functions = (StockEndpoints.one_year_daily(),
                  StockEndpoints.two_year_daily(),
                  StockEndpoints.one_year_weekly(),
                  StockEndpoints.two_year_weekly(),
                  StockEndpoints.three_year_weekly(),
                  StockEndpoints.one_month_daily(),
                  StockEndpoints.two_month_daily(),
                  StockEndpoints.three_month_daily(),
                  StockEndpoints.six_month_daily(),
                  StockEndpoints.one_day_min(),
                  StockEndpoints.two_day_min(),
                  StockEndpoints.three_day_min())

StockEndpoints () - это функция в отдельном классе, для которой требуется параметр (tckr) или биржевой тикер.

Вот код, который у меня пока есть :

def fill_tables(self):

    # Inserts data into their respective column
    try:
        for tckr in self.stock_tickers:
            for endpoint in self.stock_endpoints:
                query = '''INSERT INTO {}_{} (symbol, date_time, close_price, high, low, open_price, volume)
                           VALUES (%s, %s, %s, %s, %s, %s, %s)'''.format(tckr, endpoint)


         values = PERFORM FUNCTION THAT MATCHES THE ENDPOINT BEING ITERATED THROUGH.

             EXAMPLE: THE CURRENT ENDPOINT IS 'one_year_daily' THEREFORE I WANT TO RUN THE
             FUNCTION 'StockEndpoints.one_year_daily(tckr)'


            # Execute the sql commands to insert data
            self.cursor.executemany(query, values)
            self.conn.commit()
            print(self.cursor.rowcount, 'records inserted into {}_{}'.format(tckr, endpoint))

    except Error as e:
        print(e)

Основная проблема, с которой я столкнулся, заключается в том, что в первой итерации, скажем, конечная точка - one_year_daily, а затем функция StockEndpoints.one_year_daily (tckr), а затем я хочу go через другую итерацию этот биржевой тикер, но использующий конечную точку two_year_daily и функцию StockEndpoints.two_year_daily (tckr) и проходящий через текущий tckr, проходящий итерацию.

Я знаю, что могу сделать FOR l oop с биржевыми биржами, а затем еще один FOR l oop для конечных точек акций, но тогда я понятия не имею, как выполнить итерацию Также выполните функции и убедитесь, что они соответствуют конечной точке.

Если это поможет, вот функция

StockEndpoints.one_year_daily (tckr)

def one_year_daily(self, tckr):
    self.TDSession.login()

    quote_data = self.TDSession.get_price_history(symbol=tckr,
                                                  periodType='year',
                                                  period=1,
                                                  frequencyType='daily',
                                                  frequency=1,
                                                  needExtendedHoursData='false')

    sql_data = [(tckr,
                 quote_data['candles']['datetime'],
                 quote_data['candles']['close'],
                 quote_data['candles']['high'],
                 quote_data['candles']['low'],
                 quote_data['candles']['open'],
                 quote_data['candles']['volume'])
                for x, quote_data['candles'] in enumerate(quote_data['candles'])]

    return sql_data

Дайте мне знать если у вас есть какие-либо вопросы или я могу добавить или уточнить, спасибо!

1 Ответ

0 голосов
/ 27 января 2020

Вы можете использовать getattr, а затем использовать endpoints из вашего для l oop

getattr(StockEndpoints, endpoint)(tckr)

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

{
   "one_year_daily": StockEndpoints.one_year_daily
}

for endpoint, func in self.stock_endpoints.items()
    func(tckr)
...