Преобразование словаря списка словарей в фрейм данных pandas

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я извлек список исторических цен опционов AAPL из функции robin_stocks.get_option_historicals() RobinHoood . Данные были возвращены в виде словаря списка словарей, как показано ниже.

У меня возникли трудности с преобразованием приведенного ниже объекта (именованного historicalData ) в DataFrame . Может кто-нибудь, пожалуйста, помогите?

 historicalData = {'data_points': [{'begins_at': '2020-10-05T13:30:00Z',
   'open_price': '1.430000',
   'close_price': '1.430000',
   'high_price': '1.430000',
   'low_price': '1.430000',
   'volume': 0,
   'session': 'reg',
   'interpolated': False},
{'begins_at': '2020-10-05T13:40:00Z',
   'open_price': '1.430000',
   'close_price': '1.340000',
   'high_price': '1.440000',
   'low_price': '1.320000',
   'volume': 0,
   'session': 'reg',
   'interpolated': False}],
'open_time': '0001-01-01T00:00:00Z',
'open_price': '0.000000',
'previous_close_time': '0001-01-01T00:00:00Z',
'previous_close_price': '0.000000',
'interval': '10minute',
'span': 'week',
'bounds': 'regular',
'id': '22b49380-8c50-4c76-8fb1-a4d06058f91e',
'instrument': 'https://api.robinhood.com/options/instruments/22b49380-8c50-4c76-8fb1-a4d06058f91e/'}
  

Я попробовал приведенный ниже код кода, но это не помогло:

 import pandas as pd
df = pd.DataFrame(historicalData)
df
  

Ответ №1:

Вы не написали, что вам нужны только data_points (как в другом ответе), поэтому я предполагаю, что вы хотите, чтобы весь ваш словарь был преобразован в фрейм данных.

Чтобы сделать это, начните с вашего кода:

 df = pd.DataFrame(historicalData)
  

Он создает фрейм данных, в котором data_points «разбивается» на
последовательные строки, но они все еще являются словарями.

Затем переименуйте столбец open_price в open_price_all:

 df.rename(columns={'open_price': 'open_price_all'}, inplace=True)
  

Причина в том, чтобы избежать дублирования имен столбцов после объединения
, которое должно быть выполнено в ближайшее время (data_points содержат также
атрибут open_price, и я хочу, чтобы соответствующий столбец из data_points
«унаследовал» это имя).

Следующим шагом является создание временного фрейма данных — разделение словарей в data_points на отдельные столбцы:

 wrk = df.data_points.apply(pd.Series)
  

Выведите wrk, чтобы увидеть результат.

И последний шаг — объединить df с wrk и удалить столбец data_points (больше не нужен, поскольку он был разделен на отдельные столбцы):

 result = df.join(wrk).drop(columns=['data_points'])
  

Комментарии:

1. Большое спасибо, это полностью отвечает на мой вопрос. И если на самом деле, шаг с wrk был всем, что я пытался получить.

Ответ №2:

Это довольно легко решить с помощью приведенного ниже. Я поместил фрейм данных в список с помощью понимания списка

 import pandas as pd
df_list = [pd.DataFrame(dic.items(), columns=['Parameters', 'Value']) for dic in historicalData['data_points']]
  

Затем вы могли бы сделать:

 df_list[0]
  

что даст

      Parameters                 Value
0     begins_at  2020-10-05T13:30:00Z
1    open_price              1.430000
2   close_price              1.430000
3    high_price              1.430000
4     low_price              1.430000
5        volume                     0
6       session                   reg
7  interpolated                 False
  

Комментарии:

1. Большое спасибо за вашу оперативность, я намерен указать begins_at, open_price, close_price, high_price, volume, session, interpolated и столбцы моего фрейма данных. Приведенный выше код, похоже, этого не делает. Есть ли другой код, который я могу использовать?