NeuroMorpho.org - получение результатов с нескольких страниц API - PullRequest
1 голос
/ 18 июня 2020

Заранее извините, так как это мой первый пост, и я совершенно не знаком с кодированием Python. Я хочу использовать NeuroMorpho API (http://neuromorpho.org/apiReference.html) для поиска и получения информации об определенных нейронах (добавлены фильтры в строке запроса).

Я использовал следующие коды:

import requests
import json
import csv
import pandas as pd
from pandas import DataFrame
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

response = requests.get("http://neuromorpho.org/api")
response

query = (
    "http://neuromorpho.org/api/neuron/select?q=species:rat&fq=brain_region:hippocampus, CA1&fq=experiment_condition:Control&fq=cell_type:Pyramidal, principal cell"
)

response = requests.get(query)
json_data = response.json()
rat_data = json_data
rat_data

Я получаю большой объем данных, и в конце он говорит следующее:

'page': {'size': 50, 'totalElements': 1115, 'totalPages': 23, 'number': 0}}

Затем я хотел создать словарь из этих данных и использовал следующий код:

df_dict = {}
df_dict['NeuronID'] = []
df_dict['Archive'] = []
df_dict['Strain'] = []
df_dict['Cell'] = []
df_dict['Region'] = []
for i in rat_data['_embedded']['neuronResources']:
    df_dict['NeuronID'].append(str(i['neuron_id']))
    df_dict['Archive'].append(str(i['archive']))
    df_dict['Strain'].append(str(i['strain']))
    df_dict['Cell'].append(str(i['cell_type']))
    df_dict['Region'].append(str(i['brain_region']))

rat_df = DataFrame(df_dict)
print(rat_df)

И в конце, когда я проверил длину словаря:

len(rat_df)

Результат был 50.

Итак, в конце я решил, что программа вытащила только первые 50 нейронов из первого ( страница 0). Согласно тому выводу в начале, у меня осталось еще 23 страницы. Как я могу поместить все эти результаты в один словарь или класс, т.е. есть ли способ перечислить все эти страницы? Я пробовал с несколькими вариантами l oop, но безуспешно.

Извините, если это простой вопрос или я допустил ошибку, но последние пару дней я пробовал все и не получил никакого результата.

1 Ответ

0 голосов
/ 18 июня 2020

Заявление об ограничении ответственности: Я не эксперт в области HTTP или библиотеки запросов и раньше не использовал neuroomorpho.org , поэтому, пожалуйста, возьмите это с скепсис.

Вы можете запросить количество страниц с первым запросом, а затем l oop через отдельные страницы. В l oop вы должны включить запрашиваемую страницу в качестве параметра HTTP-метода GET, например ?page=42&..., например:

url = 'http://neuromorpho.org/api/neuron/select'
params = {
        'page' : 0,
        'q' : 'species:rat',
        'fq' : [
            'brain_region:hippocampus,CA1',
            'experiment_condition:Control',
            'cell_type:Pyramidal,principal cell' ] }

totalPages = requests.get(url, params).json()['page']['totalPages']

df_dict = {
        'NeuronID' : list(),
        'Archive' : list(),
        'Strain' :  list(),
        'Cell' : list(),
        'Region' : list() }

for pageNum in range(totalPages):
    params['page'] = pageNum
    response = requests.get(url, params)
    print('Querying page {} -> status code: {}'.format(
        pageNum, response.status_code))
    if (response.status_code == 200):    #only parse successful requests
        data = response.json()
        for row in data['_embedded']['neuronResources']:
            df_dict['NeuronID'].append(str(row['neuron_id']))
            df_dict['Archive'].append(str(row['archive']))
            df_dict['Strain'].append(str(row['strain']))
            df_dict['Cell'].append(str(row['cell_type']))
            df_dict['Region'].append(str(row['brain_region']))

rat_df = pd.DataFrame(df_dict)
print(rat_df)

. Вы можете увидеть результат DataFrame и то, как запрошенные изменения номера страницы в выводе консоли:

Querying page 0 -> status code: 200
Querying page 1 -> status code: 200
Querying page 2 -> status code: 200
Querying page 3 -> status code: 200
Querying page 4 -> status code: 200
Querying page 5 -> status code: 200
Querying page 6 -> status code: 200
Querying page 7 -> status code: 200
Querying page 8 -> status code: 200
Querying page 9 -> status code: 200
Querying page 10 -> status code: 200
Querying page 11 -> status code: 200
Querying page 12 -> status code: 200
Querying page 13 -> status code: 200
Querying page 14 -> status code: 200
Querying page 15 -> status code: 200
Querying page 16 -> status code: 200
Querying page 17 -> status code: 200
Querying page 18 -> status code: 200
Querying page 19 -> status code: 200
Querying page 20 -> status code: 200
Querying page 21 -> status code: 200
Querying page 22 -> status code: 200
     NeuronID    Archive          Strain                             Cell                          Region
0         100     Turner     Fischer 344  ['pyramidal', 'principal cell']          ['hippocampus', 'CA1']
1         101     Turner     Fischer 344  ['pyramidal', 'principal cell']          ['hippocampus', 'CA1']
2        1016     Ascoli  Sprague-Dawley  ['pyramidal', 'principal cell']                 ['hippocampus']
3        1019     Ascoli  Sprague-Dawley  ['pyramidal', 'principal cell']                 ['hippocampus']
4         102     Turner     Fischer 344  ['pyramidal', 'principal cell']          ['hippocampus', 'CA1']
...       ...        ...             ...                              ...                             ...
1110    99614  Guizzetti  Sprague-Dawley  ['principal cell', 'pyramidal']  ['hippocampus', 'CA1', 'left']
1111    99615  Guizzetti  Sprague-Dawley  ['principal cell', 'pyramidal']  ['hippocampus', 'CA1', 'left']
1112    99616  Guizzetti  Sprague-Dawley  ['principal cell', 'pyramidal']  ['hippocampus', 'CA1', 'left']
1113    99617  Guizzetti  Sprague-Dawley  ['principal cell', 'pyramidal']  ['hippocampus', 'CA1', 'left']
1114    99618  Guizzetti  Sprague-Dawley  ['principal cell', 'pyramidal']  ['hippocampus', 'CA1', 'left']

[1115 rows x 5 columns]

Обновление # 1:

Я изменил свой опубликованный код, добавив модифицированную версию вашего кода для анализа ответов в l oop. Я думаю, что есть небольшая ошибка в API neuroomorpho.org , так как он отвечает size: 50 для последней страницы (номер 22), в то время как он содержит только 15 (индекс 0-14) объектов в JSON ответ. Вы можете обойти эту проблему, перебирая объект JSON и пренебрегая сообщаемым размером.

Обновление № 2:

Понятно, что параметры GET не нужно кодировать в URL но этот Requests делает это за нас, передавая их как dict (обновленный код).

Надеюсь, это поможет!

...