Получение списка DataFrames через цикл for

С помощью Python я хочу получить из Интернета информацию о холдингах руководителей публично зарегистрированных компаний. Поэтому сначала я создаю полный список кодов акций (только с цифрами) под названием target_list_onlynumber, который выглядит следующим образом:

Вот веб-сайт, с которого я пытаюсь получить данные: https://data.eastmoney.com/executive/000001.html . Он соответствует биржевому коду <000001>. Для акций с кодовым номером i соответствующий веб-сайт https://data.eastmoney.com/executive/i.html И, выполнив следующий код, я могу получить нужный фрейм данных:

df = pd.DataFrame(
    requests.get('https://datacenter-web.eastmoney.com/api/data/v1/get?reportName=RPT_EXECUTIVE_HOLD_DETAILS&columns=ALL&filter=(SECURITY_CODE%3D"000001")')\
        .json().get('result').get('data'))
print(df)

Результирующий фрейм данных выглядит так:

Теперь я хочу написать цикл for, чтобы получить все DataFrames всех акций, кодовые номера которых находятся в списке target_list_onlynumber. df_i — это стандартный DataFrame с кодовым номером i. (например, df_601857 — это стандартный DataFrame с кодовым номером 601857.) Вот что я попробовал, что похоже на предыдущий код для стандартного <000001>:

df_list = []
for i in target_list_onlynumber:
    exec_data = requests.get('https://datacenter-web.eastmoney.com/api/data/v1/get?reportName=RPT_EXECUTIVE_HOLD_DETAILS&columns=ALL&filter=(SECURITY_CODE%3D"{i}")')\
        .json().get('result').get('data')
    df_i = pd.DataFrame(exec_data)
    df_list.append(df_i)
    print(df_i)

Но результат таков:

Traceback (most recent call last):
  File "/tmp/jqcore/jqboson/jqboson/core/entry.py", line 379, in _run
    engine.start()
  File "/tmp/jqcore/jqboson/jqboson/core/engine.py", line 231, in start
    self._dispatcher.start()
  File "/tmp/jqcore/jqboson/jqboson/core/dispatcher.py", line 280, in start
    self._run_loop()
  File "/tmp/jqcore/jqboson/jqboson/core/dispatcher.py", line 240, in _run_loop
    self._loop.run()
  File "/tmp/jqcore/jqboson/jqboson/core/loop/loop.py", line 107, in run
    self._handle_queue()
  File "/tmp/jqcore/jqboson/jqboson/core/loop/loop.py", line 153, in _handle_queue
    message.callback(**message.callback_data)
  File "/tmp/jqcore/jqboson/jqboson/core/mds/market_data_subscriber.py", line 228, in broadcast
    consumer.send(market_data)
  File "/tmp/jqcore/jqboson/jqboson/core/mds/market_data_consumer_manager.py", line 59, in   consumer_gen
    msg_callback()
  File "/tmp/jqcore/jqboson/jqboson/core/mds/market_data_consumer_manager.py", line 52, in  msg_callback
    callback(market_data)
  File "/tmp/jqcore/jqboson/jqboson/core/mds/market_data_consumer_manager.py", line 122, in wrapper
    result = callback(*args, **kwargs)
  File "/tmp/jqcore/jqboson/jqboson/core/strategy.py", line 474, in _wrapper
    self._context.current_dt
  File "/tmp/strategy/user_code.py", line 90, in handle_data
    .json().get('result').get('data')
AttributeError: 'NoneType' object has no attribute 'get'

Я не понимаю, почему код для одной акции завершается успешно, а цикл for терпит неудачу. Может кто-нибудь помочь мне исправить это, пожалуйста?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

способ передачи параметра I в строку URL должен использовать «f» в начале строки

вместо:

exec_data = requests.get('https://datacenter-web.eastmoney.com/api/data/v1/get?reportName=RPT_EXECUTIVE_HOLD_DETAILS&columns=ALL&filter=(SECURITY_CODE%3D"{i}")')\
    .json().get('result').get('data')

делать:

exec_data = requests.get(f'https://datacenter-web.eastmoney.com/api/data/v1/get?reportName=RPT_EXECUTIVE_HOLD_DETAILS&columns=ALL&filter=(SECURITY_CODE%3D"{i}")')\
    .json().get('result').get('data')

это говорит Python использовать стиль формата, заменяя то, что находится в фигурных скобках, его значением

stackoverflow.com/questions/78573329/… Как насчет следующего вопроса, пожалуйста?
Evariste Galois 04.06.2024 13:03

Во-первых, вам не хватает f в начале строки, а это означает, что значения i в фигурных скобках не оцениваются. Кроме того, вы используете get, предполагая, что никогда не получите недействительный инвентарный номер, что может быть еще одной причиной, по которой он может вернуться None. Вместо того, чтобы предполагать, что это сработает, вам следует попробовать что-то вроде этого:

df_list, broken_values = [], []

for i in target_list_onlynumber:
    try:   
        exec_data = (
            requests.get(
                f'https://datacenter-web.eastmoney.com/api/data/v1/get?reportName=RPT_EXECUTIVE_HOLD_DETAILS&columns=ALL&filter=(SECURITY_CODE%3D"{i}")'
            ).json().get('result').get('data')
        )
        df_i = pd.DataFrame(exec_data)
        df_list.append(df_i)
        print(df_i)
    except: 
        AttributeError as e:
            print(f"{e} for {i}")
            broken_values.append(i)
stackoverflow.com/questions/78573329/… Как насчет следующего вопроса, пожалуйста?
Evariste Galois 04.06.2024 13:03

Другие вопросы по теме