Рубрики
Без рубрики

Как использовать API TMDB, чтобы найти фильмы с самым высоким доходом

Руководство по использованию базы данных фильмов для программно Получить информацию о фильме. Tagged с API, Python, Culture, WebDev.

Убери был одним из самых обсуждаемых фильмов в 2017 году и по состоянию на апрель 2017 года Высокий дебютный фильм, основанный на оригинальном сценарии в истории Анкет Мы хотим программно выяснить, как Убери Среди других американских фильмов 2017 года, и какие фильмы получили наибольший доход в 2017 году. Этот учебник предполагает, что большинство читателей обладают базовыми рабочими знаниями о Python.

Предварительные условия

  • Установите следующие пакеты Python и запустите их в идеале в Virtualenv Анкет

    • конфигурация
    • Запросы
    • локаль
    • Панды
    • matplotlib
  • В дополнение к установке вышеуказанных зависимостей, нам нужно будет запросить ключ API из Фильм DB (TMDB) Анкет У TMDB есть бесплатный API для программного доступа к информации о фильмах.

    • Чтобы запросить ключ API от TMDB:
      1. Создать бесплатный аккаунт
      2. Проверьте свою электронную почту, чтобы проверить свою учетную запись.
      3. Посетите Страница настроек API В настройках вашей учетной записи и запросите ключ API
      4. Теперь у вас должен быть ключ API и быть готовым к работе!
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”