Как загрузить данные из вложенного словаря в dataframe? - PullRequest
1 голос
/ 14 апреля 2019

Я пытаюсь создать фрейм данных с ценами закрытия для акций и нашел бесплатный API, который возвращает данные JSON в виде вложенных разногласий с данными, выглядя так:

{'name': 'AAPL',
 'history': 
           {'2019-01-04': 
                  {'open': '144.53',
                   'close': '148.26',
                   'high': '148.55',
                   'low': '143.80',
                   'volume': '58607070'},
           '2019-01-03': 
                   {'open': '143.98',
                    'close': '142.19',
                    'high': '145.72',
                    'low': '142.00',
                    'volume': '91312195'},
          '2019-01-02': 
                  {'open': '154.89',
                   'close': '157.92',
                   'high': '158.85',
                   'low': '154.23',
                   'volume': '37039737'
}}}

Так как мой нужный ключ 'close' вложен в 'history', и каждую конкретную дату мне трудно его извлечь и поместить в фрейм данных.

Какой путь / логика стоит за ситуацией такого типа? Я попытался создать список дат с указанием даты и времени, но безуспешно. Есть ли у вас какие-либо предложения или чтения?

РЕДАКТИРОВАТЬ: ТЕКУЩИЙ КОД, очевидно, не работает

def make_request():
    '''Makes a request to the API that returns a JSON-response '''
    r = requests.get(url)
    sample = json.loads(r.text)
    return sample


def check_keys(data):
    '''Checks the keys in the JSON-response'''
    print(data.keys())


def check_values(data):
    '''Checks the values in the JSON-respose'''
    print(data.values())


def get_values(data):
    '''Gets the date for each day in the sample and stores it in a list'''
     for v in data.get('history'):
        values = v
        return v


def get_closeprice(data, values):
    '''Uses the dates from get_values() to iterate through the sample and get the
    closing price for each date in the sample'''
    for date in values:
        data.get('history').get(values).get('close')
        return value

Ответы [ 4 ]

2 голосов
/ 14 апреля 2019

Если вы просто хотите загрузить его в фрейм данных:

# h = your dictionary

df = pd.DataFrame.from_dict(data=h['history'],orient='index')

cols = ['close']

df = df[cols]

# Just as an aside Quandl has been very good for free financial data to me. 
#It has a paid side with premium data but I havent used it.
1 голос
/ 14 апреля 2019

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

d = {'name': 'AAPL',
 'history': 
           {'2019-01-04': 
                  {'open': '144.53',
                   'close': '148.26',
                   'high': '148.55',
                   'low': '143.80',
                   'volume': '58607070'},
           '2019-01-03': 
                   {'open': '143.98',
                    'close': '142.19',
                    'high': '145.72',
                    'low': '142.00',
                    'volume': '91312195'},
          '2019-01-02': 
                  {'open': '154.89',
                   'close': '157.92',
                   'high': '158.85',
                   'low': '154.23',
                   'volume': '37039737'
}}}
def print_nested_dict(nested_dict, name, prior_keys=[]):
    for key, value in nested_dict.items():
        # current_key_path is a list of each key we used to get here
        current_key_path = prior_keys + [key]
        # Convert that key path to a string
        key_path_str = ''.join('[\'{}\']'.format(key) for key in current_key_path)

        # If the value is a dict then recurse
        if isinstance(value, dict):
            print_nested_dict(value, name, current_key_path)
        else:
            # Else lets print the key and value for this value
            # along with where it was found
            print(key, value, '{}{}'.format(name, key_path_str))
print_nested_dict(d, "d")

Вывод:

name AAPL d['name']
open 144.53 d['history']['2019-01-04']['open']
close 148.26 d['history']['2019-01-04']['close']
high 148.55 d['history']['2019-01-04']['high']
low 143.80 d['history']['2019-01-04']['low']
volume 58607070 d['history']['2019-01-04']['volume']
open 143.98 d['history']['2019-01-03']['open']
close 142.19 d['history']['2019-01-03']['close']
high 145.72 d['history']['2019-01-03']['high']
low 142.00 d['history']['2019-01-03']['low']
volume 91312195 d['history']['2019-01-03']['volume']
open 154.89 d['history']['2019-01-02']['open']
close 157.92 d['history']['2019-01-02']['close']
high 158.85 d['history']['2019-01-02']['high']
low 154.23 d['history']['2019-01-02']['low']
volume 37039737 d['history']['2019-01-02']['volume']

При этом может быть более эффективный способ, чем этотиспользуя встроенные dataframe методы.

1 голос
/ 14 апреля 2019

Вы можете использовать регулярное выражение:

import re

if re.match(r"^(\d+-\d+-\d+)$", key):
    # do something with it's values.

Однако вам нужно будет самостоятельно перебирать словарь.

1 голос
/ 14 апреля 2019

Вам не нужно знать, какой ключ присутствует для доступа к нему. Вы можете просто перебрать все ключи в словаре.

d = <your dict>
retval = {}

for k,v in d['history'].items():
    retval[k] = v['close']

print(retval)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...