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

pashka

Новичок
Пользователь
Окт 14, 2020
1
0
1
Всем салют. Есть некоторый скрипт, который с помощью API подтягивает исторические данные о стоимости акций и заносит их в бд Postgre. Все тикеры акций занесены в словарь, по которому я и пробегаюсь, но почему-то он пробегается только по первому элементу словаря, а затем останавливается. Сам код:
Python:
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)


Что не так? Заранее спасибо за помощь.
 

lynulx

Модератор
Команда форума
Модератор
Авг 9, 2020
139
19
18
возможно проблема в while
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
но почему-то он пробегается только по первому элементу словаря, а затем останавливается
Цикл for проходит по всем элементам словаря, чтобы в этом убедиться можете добавить print(key) сразу после строки
for key in test_arist:
Цикл while выполняется только для первого ключа в словаре потому, что значение переменной date1 становится равным значению переменной date2 и условие для запуска цикла больше не выполняется.
Чтобы исправить можно на каждой итерации цикла for присваивать переменной data1 ее первоначальное значение:
Python:
for key in test_arist:
    tic = yf.Ticker(key)
    dat = tic.history(period="max", interval="1d")
    date1 = datetime.date(1950, 1, 21)

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

Форум IT Специалистов