Задать вопрос
@PashaLynx
Страшный дилетант

Почему python не пробегается по всему словарю?

Всем салют. Есть некоторый скрипт, который с помощью API подтягивает исторические данные о стоимости акций и заносит их в бд Postgre. Все тикеры акций занесены в словарь, по которому я и пробегаюсь, но почему-то он пробегается только по первому элементу словаря, а затем останавливается. Сам код.
import psycopg2
import yfinance as yf
import datetime
from datetime import timedelta

test_arist = dict(
    AWR='AWR',  # Словарь с тикерами дивидендных аристократов.
    DOV='DOV',
    NWN='NWN',
    GPC='GPC',
    PG='PG',
    PH='PH',
    EMR='EMR',
    MMM='MMM',
    CINF='CINF',
    KO='KO'
)

date1 = datetime.date(1950, 1, 21)
date2 = datetime.date(2020, 9, 23)

def import_func(date_his):
    global dat, i

    con = psycopg2.connect(
        database='base',
        user='user',
        password='qwerty',
        host='127.0.0.1',
        port='5432'
    )
    c = (dat.loc[date_his, 'Close'])
    o = (dat.loc[date_his, 'Open'])
    h = (dat.loc[date_his, 'High'])
    l = (dat.loc[date_his, 'Low'])

    cur = con.cursor()
    cur.execute("INSERT INTO stocks(ticker, date_update, open, close, high, low)"
                "VALUES (%s, %s, %s, %s, %s, %s)",
                (key, x, o, c, h, l))
    con.commit()
    con.close()
for key in test_arist:
    tic = yf.Ticker(key)
    dat = tic.history(period="max", interval="1d")

    while date1 <= date2:
        x = date1.strftime('%Y-%m-%d')
        try:
            date1 = date1 + timedelta(1)
            import_func(x)
        except KeyError:
            date1 = date1 + timedelta(1)

Что не так? Заранее спасибо за помощь.
  • Вопрос задан
  • 146 просмотров
Подписаться 1 Средний 6 комментариев
Решения вопроса 1
@seonn
Проще сказать, что с кодом так, т.к. тут сразу несколько антипатернов, но ответ на ваш вопрос прост: вы не занулили date1 после первого прогона цикла. Т.е. когда итератор переходит от "AWR" к "DOV" уже date1 = date2

P.S.: из критичного вынесите коннект к постгресу в класс, или перенесите обработку KeyError в функцию. Сейчас, если вы упали по KeyError - вы не закрыли коннект и на след итерации while создаете новый.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы