Pandas DataFrame, созданный для каждой строки - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь передать данные в JSON из API в Pandas DataFrame.Я не смог заставить pandas.read_json работать с данными API, поэтому я уверен, что это не лучшее решение, но в настоящее время у меня for loop проходит через JSON для извлечения нужных мне значений.

Вот что у меня есть:

import json
import urllib.request
import pandas as pd

r = urllib.request.urlopen("https://graph.facebook.com/v3.1/{page-id}/insights?access_token={access-token}&pretty=0&metric=page_impressions%2cpage_engaged_users%2cpage_fans%2cpage_video_views%2cpage_posts_impressions").read()

output = json.loads(r)

for item in output['data']:
    name = item['name']
    period = item['period']
    value = item['values'][0]['value']

    df = [{'Name': name, 'Period': period, 'Value': value}]

    df = pd.DataFrame(df)

    print(df)

А вот выдержка из JSON из API:

    {
  "data": [
    {
      "name": "page_video_views",
      "period": "day",
      "values": [
        {
          "value": 634,
          "end_time": "2018-11-23T08:00:00+0000"
        },
        {
          "value": 465,
          "end_time": "2018-11-24T08:00:00+0000"
        }
      ],
      "title": "Daily Total Video Views",
      "description": "Daily: Total number of times videos have been viewed for more than 3 seconds. (Total Count)",
      "id": "{page-id}/insights/page_video_views/day"
    },

Проблема, с которой я сейчас сталкиваюсь, заключается в том, чтоцикла For (я полагаю), каждая строка данных вставляется в свой собственный DataFrame следующим образом:

               Name Period  Value
0  page_video_views    day    465
               Name Period  Value
0  page_video_views   week   3257
               Name   Period  Value
0  page_video_views  days_28   9987
               Name Period  Value
0  page_impressions    day   1402

Как я могу легко передать все их в один DataFrame, как это?

               Name Period  Value
0  page_video_views    day    465
1  page_video_views   week   3257
2  page_video_views  days_28   9987
3  page_impressions    day   1402

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

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Если вы берете данные из URL.Я хотел бы предложить такой подход и передавать только данные, хранящиеся под атрибутом

import request
data=request.get("url here").json('Period')

Точка теперь словарь, теперь вы можете вызвать pd.DataFrame.from_dict (data) для анализа данных

df = pd.DataFrame.from_dict(Period)
0 голосов
/ 28 ноября 2018

Вы можете создать список словарей и перейти к конструктору DataFrame:

L = []
for item in output['data']:
    name = item['name']
    period = item['period']
    value = item['values'][0]['value']

    L.append({'Name': name, 'Period': period, 'Value': value})

df = pd.DataFrame(L)

Или использовать list comprehension:

L = [({'Name': item['name'], 'Period': item['period'], 'Value': item['values'][0]['value']}) 
       for item in output['data']]

df = pd.DataFrame(L)
print (df)
               Name Period  Value
0  page_video_views    day    634

Образец для тестирования:

output = {
  "data": [
    {
      "name": "page_video_views",
      "period": "day",
      "values": [
        {
          "value": 634,
          "end_time": "2018-11-23T08:00:00+0000"
        },
        {
          "value": 465,
          "end_time": "2018-11-24T08:00:00+0000"
        }
      ],
      "title": "Daily Total Video Views",
      "description": "Daily: Total number of times videos have been viewed for more than 3 seconds. (Total Count)",
      "id": "{page-id}/insights/page_video_views/day"
    }]}
0 голосов
/ 28 ноября 2018

Попытаться преобразовать словарь после загрузки json в фрейм данных как :

output = json.loads(r)
df = pd.DataFrame.from_dict(output , orient='index')
df.reset_index(level=0, inplace=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...