Как создать фрейм данных из вложенного JSONField в Django?
В моей модели Django есть поля DateTimeField
и JSONField
, с помощью которых я хотел бы создать временной ряд данных.
В пакете django-pandas
есть метод to_timeseries
для этого, но моя проблема в том, что он помещает все поле JSONField в столбец. Как я могу сплющить этот столбец в мультииндексированные столбцы?
models.py
class Indicator(models.Model):
dt = models.DateTimeField(null=True)
metrics = models.JSONField(default=dict)
JSONField dictionary:
{'housing': {'1d_percent': 73.62755998, '2d_percent': 3e-08},
'fund-flower': {'ratio': 0.01981295},
'mpi': {'mpi': -0.6527736158660562}}
Преобразование набора queryset во временной массив данных :
>> qs = Indicator.objects.all()
>> df = qs.to_timeseries(index='dt', fieldnames='metrics').sort_index().dropna()
>> df
metrics
dt
2018-01-01 00:00:00+00:00 {'mpi': {'mpi': -0.01679772442974948}, 'fund-f...
2018-01-02 00:00:00+00:00 {'mpi': {'mpi': 1.1785319016689795}, 'fund-flo...
2018-01-03 00:00:00+00:00 {'mpi': {'mpi': 1.047678402830424}, 'fund-flow...
2018-01-04 00:00:00+00:00 {'mpi': {'mpi': 1.111703887319459}, 'fund-flow...
2018-01-05 00:00:00+00:00 {'mpi': {'mpi': 2.3908629334035343}, 'fund-flo...
...
2022-09-17 00:00:00+00:00 {'mpi': {'mpi': -1.0434999082318062}, 'fund-fl...
2022-09-18 00:00:00+00:00 {'mpi': {'mpi': -0.9680468633746766}, 'fund-fl...
2022-09-19 00:00:00+00:00 {'mpi': {'mpi': -0.9287818619840235}, 'fund-fl...
2022-09-20 00:00:00+00:00 {'mpi': {'mpi': -0.8487296227267782}, 'fund-fl...
Это желаемый выход:
mpi fund-flower housing
dt mpi ratio 1d_percent 2d_percent
2018-01-01 00:00:00+00:00 value value value value
2018-01-02 00:00:00+00:00 value value value value
2018-01-03 00:00:00+00:00 value value value value
2018-01-04 00:00:00+00:00 value value value value
2018-01-05 00:00:00+00:00 value value value value
...
2022-09-17 00:00:00+00:00 value value value value
2022-09-18 00:00:00+00:00 value value value value
2022-09-19 00:00:00+00:00 value value value value
2022-09-20 00:00:00+00:00 value value value value
Я пытался нормализовать данные с помощью json_normalize
как указано здесь , но он выдает ошибку:
>> pd.json_normalize(df, record_path =['metrics'])
TypeError: string indices must be integers
Я наконец-то нашел ответ на свой собственный вопрос.
df = pd.DataFrame()
for obj in qs:
tmp = pd.DataFrame.from_dict(obj.metrics, orient="columns").stack().to_frame().T
df = pd.concat([df, m])
df.index = qs.values_list('dt')