Вы фильтруете словари, затем пытаетесь поместить их в набор. Ожидаемый результат не требует, чтобы вы что-либо дублировали, поэтому самый простой путь от ошибки - использовать вместо этого понимание списка; просто поменяйте {...}
фигурные скобки на квадратные скобки:
articles = [article for article in response_dataframe['articles'] if article['publishedAt'] >= '2019-01-04T11:30:00Z']
Однако, если вы собираетесь поместить данные в кадр данных для обработки, вам будет гораздо лучше использовать функцию pandas.io.json.json_normalize()
; он может создать для вас структуру данных из структуры списков и словарей, обычно загружаемой из источника JSON.
Начните с загрузки только данных статьи, которые вы хотите, в информационный фрейм, и вы можете отфильтровывать и переупорядочивать их оттуда; следующий код загружает все данные в один фрейм данных с новым столбцом date
, полученным из информации publishAt
:
import pandas as pd
from pandas.io.json import json_normalize
df = json_normalize(response.json(), 'articles')
# make the datetime column a native type, and add a date-only column
df['publishedAt'] = pd.to_datetime(df['publishedAt'])
df['date'] = df['publishedAt'].dt.date
# move source dictionary into separate columns rather than dictionaries
source_columns = df['source'].apply(pd.Series).add_prefix('source_')
df = pd.concat([df.drop(['source'], axis=1), source_columns], axis=1)
Это дает вам фрейм данных со всей информацией о статье, как полный фрейм данных с нативными типами, со столбцами author
, content
, description
, publishedAt
, date
, title
, url
, urlToImage
и столбцы source_id
и source_name
из сопоставления source
.
Я отмечаю, что API позволяет вам фильтровать по дате, я бы положился на нее, а не на локальную фильтрацию, поскольку вы можете сэкономить время и пропускную способность, если API предоставит вам меньший набор данных. API также позволяет применять сортировку, опять же хорошая идея.
Чтобы сгруппировать строки по дате и имени источника, вам нужно будет повернуть кадр данных ; даты должны быть индексом, столбцами имя источника и заголовки в качестве значений:
df.pivot(index='date', columns='source_name', values='title')
Однако это не удается, поскольку в этом формате не хватает места для более чем одного заголовка на источник в день:
ValueError: Index contains duplicate entries, cannot reshape
В предоставленных мне данных JSON есть только несколько статей на CNN и Fox News на сегодняшний день.
Вы можете объединять несколько заголовков в списки:
pd.pivot_table(df,
index='date', columns='source_name', values='title',
aggfunc=list)
Для результатов по умолчанию «сегодня» это дает мне:
>>> pd.pivot_table(
... df, index='date', columns='source_name', values='title',
... aggfunc=list
... )
source_name Bbc.com ... Youtube.com
date ...
2019-01-05 [Paul Whelan: Russia rules out prisoner swap f... ... [Bears Buzz: Eagles at Bears - Wildcard Round ...
[1 rows x 18 columns]
Лично я бы ограничил рамки данных датами, заголовками и именами источников с указателем даты:
>>> df[['date', 'source_name', 'title']].set_index('date').sort_values(['date', 'source_name'])
source_name title
date
2019-01-05 Bbc.com Paul Whelan: Russia rules out prisoner swap fo...
2019-01-05 Bloomberg Russia Says FBI Arrested Russian Citizen on Pa...
2019-01-05 CNN Pay raises frozen for Pence, Cabinet members u...
2019-01-05 CNN 16 big questions on Robert Mueller's Russia in...
2019-01-05 Colts.com news What They're Saying: Colts/Texans, Wild C...
2019-01-05 Engadget Pandora iOS update adds offline playback for A...
2019-01-05 Espn.com Roger Federer wins Hopman Cup with Switzerland...
2019-01-05 Fox News Japanese 'Tuna King' pays record $3M for prize...
2019-01-05 Fox News Knicks' Turkish star Enes Kanter to skip Londo...
2019-01-05 Latimes.com Flu toll mounts in California, with 42 deaths ...
2019-01-05 NBC News After the fire: Blazes pose hidden threat to t...
2019-01-05 Newser.com After Backlash, Ellen Not Ditching Support for...
2019-01-05 Npr.org Three Dead After Fight Escalates Into Shooting...
2019-01-05 Reuters French 'yellow vests' rail against unrepentant...
2019-01-05 The Hill Trump: 'I don’t care' that most federal employ...
2019-01-05 The Huffington Post 5 Children Dead After Church Van Crashes On Wa...
2019-01-05 The Verge Apple seeks to end bent iPad Pro controversy w...
2019-01-05 Thisisinsider.com Kanye West surprised Kim Kardashian with a $14...
2019-01-05 USA Today See 'Mean Girls' co-stars Lindsay Lohan and Jo...
2019-01-05 Youtube.com Bears Buzz: Eagles at Bears - Wildcard Round -...
Вышеуказанное отсортировано по дате и источнику, поэтому заголовки из нескольких источников из одного источника группируются.