有没有办法遍历列表和函数?

时间:2020-01-27 20:49:06

标签: python mysql python-3.x python-3.7

我有一个函数,该函数可以将数据加载到数据库中,以便通过股票行情清单进行迭代,然后通过用于标准化命名约定的股票端点和从函数中提取数据的函数列表进行迭代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),然后我想对股票行情自动收录器进行另一次迭代,但要使用端点two_year_daily和函数StockEndpoints.two_year_daily(tckr)并通过当前正在迭代的tckr。

我知道我可以对股票报价器执行一个FOR循环,然后对股票端点执行另一个FOR循环,但是我也不知道如何遍历函数并确保它们与端点匹配。

如果有用的话,函数

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 :(得分:0)

您可以使用getattr,然后在您的for循环中使用endpoints

getattr(StockEndpoints, endpoint)(tckr)

否则,您可以创建一个有效函数字典到端点,然后遍历字典

{
   "one_year_daily": StockEndpoints.one_year_daily
}

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