Убери был одним из самых обсуждаемых фильмов в 2017 году и по состоянию на апрель 2017 года Высокий дебютный фильм, основанный на оригинальном сценарии в истории Анкет Мы хотим программно выяснить, как Убери Среди других американских фильмов 2017 года, и какие фильмы получили наибольший доход в 2017 году. Этот учебник предполагает, что большинство читателей обладают базовыми рабочими знаниями о Python.
Предварительные условия
Установите следующие пакеты Python и запустите их в идеале в Virtualenv Анкет
- конфигурация
- Запросы
- локаль
- Панды
- matplotlib
В дополнение к установке вышеуказанных зависимостей, нам нужно будет запросить ключ API из Фильм DB (TMDB) Анкет У TMDB есть бесплатный API для программного доступа к информации о фильмах.
- Чтобы запросить ключ API от TMDB:
- Создать бесплатный аккаунт
- Проверьте свою электронную почту, чтобы проверить свою учетную запись.
- Посетите Страница настроек API В настройках вашей учетной записи и запросите ключ API
- Теперь у вас должен быть ключ API и быть готовым к работе!
- Чтобы запросить ключ API от TMDB:
import config # to hide TMDB API keys import requests # to make TMDB API calls import locale # to format currency as USD locale.setlocale( locale.LC_ALL, '' ) import pandas as pd import matplotlib import matplotlib.pyplot as plt from matplotlib.ticker import FuncFormatter # to format currency on charts axis api_key = config.tmdb_api_key # get TMDB API key from config.py file
Если вы планируете совершить свой проект на GitHub или другой общественный репозиторий и вам нужна помощь в настройке конфигурация
Вы должны читать Эта статья об использовании конфигурация
скрыть ключи API.
Часть 1: Определите самые высокие американские фильмы 2017 года.
В этом разделе мы запросите 2017 Данные из TMDB, сохраните данные, которые мы получаем как json
в DataFrame
а затем используйте matplotlib
Визуализировать наши данные.
Сделайте вызов API в TMDB, чтобы вернуть интересующие данные
Чтобы получить самые высокие фильмы от TMDB, необходимо построить запрос API, чтобы вернуть фильмы с Promaning_Release_year
2017 года сортируется в порядке убывания по доходам.
response = requests.get('https://api.themoviedb.org/3/discover/movie?api_key=' + api_key + '&primary_release_year=2017&sort_by=revenue.desc')
highest_revenue = response.json() # store parsed json response # uncomment the next line to get a peek at the highest_revenue json structure # highest_revenue highest_revenue_films = highest_revenue['results']
Создать DataFrame из JSON, возвращенного из вызова TMDB API
Давайте храним данные JSON, возвращаемые из нашего вызова API в DataFrame для хранения каждого фильма и связанного с ним дохода.
# define column names for our new dataframe columns = ['film', 'revenue'] # create dataframe with film and revenue columns df = pandas.DataFrame(columns=columns)
Теперь, чтобы добавить данные в наш флажок DataFrame, нам нужно будет пройти через данные.
# for each of the highest revenue films make an api call for that specific movie to return the budget and revenue for film in highest_revenue_films: # print(film['title']) film_revenue = requests.get('https://api.themoviedb.org/3/movie/'+ str(film['id']) +'?api_key='+ api_key+'&language=en-US') film_revenue = film_revenue.json() #print(locale.currency(film_revenue['revenue'], grouping=True )) df.loc[len(df)]=[film['title'],film_revenue['revenue']] # store title and revenue in our dataframe
Ниже приведено, что DataFrame голова
(5 лучших линий) Похоже, что после итерации через фильмы наш вызов API вернулся.
df.head()
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
Красавица и чудовище | 1221782049 | 0 |
Судьба яростного | 1212583865 | 1 |
Guardians of the Galaxy Vol. 2 | 744784722 | 2 |
Логан | 608674100 | 3 |
Конг: Остров Черепа | 565151307 | 4 |
Давайте на самом деле посмотрим данные с Matplotlib
Мы создадим горизонтальную гистограмму, используя Matplotlib, чтобы показать доход, полученный для каждого фильма.
matplotlib.style.use('ggplot') fig, ax = plt.subplots() df.plot(kind="barh", y='revenue', color = ['#624ea7', '#599ad3', '#f9a65a', '#9e66ab', 'purple'], x=df['film'], ax=ax) #format xaxis in terms of currency formatter = FuncFormatter(currency) ax.xaxis.set_major_formatter(formatter) ax.legend().set_visible(False) avg = df['revenue'].mean() # Add a line for the average ax.axvline(x=avg, color='b', label='Average', linestyle='--', linewidth=1) ax.set(title='American Films with Highest Revenue (2017)', xlabel='Revenue', ylabel='Film')
[, , ]
Часть 2: Определите самые высокие американские фильмы всех времен
В этом разделе мы запросите все время Данные из TMDB, сохраните данные, которые мы получаем как json
в DataFrame
а затем используйте matplotlib
Визуализировать наши данные. Наш вызов API будет похож на тот, который мы использовали в предыдущем разделе, но Sans & promaning_release_year = 2017
Анкет
Запрос, форматирование и хранение данных API
response = requests.get('https://api.themoviedb.org/3/discover/movie?api_key=' + api_key + '&sort_by=revenue.desc') highest_revenue_ever = response.json() highest_revenue_films_ever = highest_revenue_ever['results'] columns = ['film', 'revenue', 'budget', 'release_date'] highest_revenue_ever_df = pandas.DataFrame(columns=columns) for film in highest_revenue_films_ever: # print(film['title']) film_revenue = requests.get('https://api.themoviedb.org/3/movie/'+ str(film['id']) +'?api_key='+ api_key+'&language=en-US') film_revenue = film_revenue.json() # print(film_revenue) # print(locale.currency(film_revenue['revenue'], grouping=True )) # Lord of the Rings duplicate w/ bad data was being returned https://www.themoviedb.org/movie/454499-the-lord-of-the-rings # It's budget was $281 which is way too low for a top-earning film. Therefore in order to be added to dataframe the film # budget must be greater than $281. if film_revenue['budget'] > 281: # print(film_revenue['budget']) # add film title, revenue, budget and release date to the dataframe highest_revenue_ever_df.loc[len(highest_revenue_ever_df)]=[film['title'],film_revenue['revenue'], (film_revenue['budget'] * -1), film_revenue['release_date']] highest_revenue_ever_df.head()
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
Аватар | -237000000 | 2781505847 | 0 | 2009-12-10 |
Звездные войны: Пробуждение силы | -245000000 | 2068223624 | 1 | 2015-12-15 |
Титаник | -200000000 | 1845034188 | 2 | 1997-11-18 |
Мстители | -220000000 | 1519557910 | 3 | 2012-04-25 |
Мир юрского периода | -150000000 | 1513528810 | 4 | 2015-06-09 |
Рассчитайте валовую прибыль
Мы можем рассчитать валовую прибыль, вычитая общий доход от потраченной суммы. Ранее мы сделали отрицательные значения бюджета, поэтому мы должны добавить доход к (отрицательному) бюджету, чтобы получить валовую прибыль, которая эффективно вычитается.
highest_revenue_ever_df['gross'] = highest_revenue_ever_df['revenue'] + highest_revenue_ever_df['budget']
Как сейчас выглядит кафедра данных?
highest_revenue_ever_df.head()
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
Аватар | 2544505847 | -237000000 | 2781505847 | 0 | 2009-12-10 |
Звездные войны: Пробуждение силы | 1823223624 | -245000000 | 2068223624 | 1 | 2015-12-15 |
Титаник | 1645034188 | -200000000 | 1845034188 | 2 | 1997-11-18 |
Мстители | 1299557910 | -220000000 | 1519557910 | 3 | 2012-04-25 |
Мир юрского периода | 1363528810 | -150000000 | 1513528810 | 4 | 2015-06-09 |
Построение данных в matplotlib с горизонтальными схемами и графиком рассеяния
fig, ax = plt.subplots() highest_revenue_ever_df.plot(kind="barh", y='revenue', color = ['#624ea7', '#599ad3', '#f9a65a', '#9e66ab', 'purple'], x=highest_revenue_ever_df['film'], ax=ax) formatter = FuncFormatter(currency) ax.xaxis.set_major_formatter(formatter) ax.legend().set_visible(False) ax.set(title='American Films with Highest Revenue (All Time)', xlabel='Revenue', ylabel='Film')
[, , ]
fig, ax = plt.subplots() highest_revenue_ever_df.plot(kind="barh", y='gross', color = ['#624ea7', '#599ad3', '#f9a65a', '#9e66ab', 'purple'], x=highest_revenue_ever_df['film'], ax=ax) formatter = FuncFormatter(currency) ax.xaxis.set_major_formatter(formatter) ax.legend().set_visible(False) ax.set(title='Gross Profit of the American Films with Highest Revenue (All Time)', xlabel='Gross Profit', ylabel='Film')
[, , ]
fig, ax = plt.subplots() highest_revenue_ever_df.plot(kind='scatter', y='gross', x='budget', ax=ax) formatter = FuncFormatter(currency) ax.xaxis.set_major_formatter(formatter) ax.yaxis.set_major_formatter(formatter) ax.set(title='Profit vs Budget of the American Films with Highest Revenue (All Time)', xlabel='Budget', ylabel='Gross Profit')
[, , ]
# Adding release year to dataframe # highest_revenue_ever_df['year'] = pd.DatetimeIndex(highest_revenue_ever_df['release_date']).year # print(highest_revenue_ever_df)
Ограничения
Вышеуказанные данные и графики не учитывают инфляцию (доход от API TMDB по доходам, несчастным от инфляции), поэтому доходы от более поздних фильмов более взвешены, чем их более ранние аналоги. При просмотре все время Инфляция данных должна быть скорректирована для того, чтобы при рассмотрении более короткого периода времени корректировка инфляции может не потребоваться. Старые фильмы появятся выше, если инфляция была принята во внимание, как и сейчас, самым старым фильмом в этом списке был Титаник в 1997 году.
Ведущая фотография – Крис Вашингтон, которого играет Даниэль Калууйя, из «Уйти». Универсальные картинки
Версия этой статьи была первоначально опубликована Моникой Пауэлл на www.datalogues.com
Оригинал: “https://dev.to/m0nica/how-to-use-the-tmdb-api-to-find-films-with-the-highest-revenue-82p”