### 1. Winter is Coming. Let's load the dataset ASAP!

If you haven't heard of *Game of Thrones*, then you must be really good at hiding. Game of Thrones is the hugely popular television series by HBO based on the (also) hugely popular book series *A Song of Ice and Fire* by George R.R. Martin. In this notebook, we will analyze the co-occurrence network of the characters in the Game of Thrones books. Here, two characters are considered to co-occur if their names appear in the vicinity of 15 words from one another in the books.

This dataset constitutes a network and is given as a text file describing the *edges* between characters, with some attributes attached to each edge. Let's start by loading in the data for the first book *A Game of Thrones* and inspect it.

```
# Importing modules
# ... YOUR CODE FOR TASK 1 ...
import pandas as pd
# Reading in datasets/book1.csv
book1 = pd.read_csv('datasets/book1.csv')
# Printing out the head of the dataset
# ... YOUR CODE FOR TASK 1 ...
book1.head()
```

### 2. Time for some Network of Thrones

The resulting DataFrame `book1`

has 5 columns: `Source`

, `Target`

, `Type`

, `weight`

, and `book`

. Source and target are the two nodes that are linked by an edge. A network can have directed or undirected edges and in this network all the edges are undirected. The weight attribute of every edge tells us the number of interactions that the characters have had over the book, and the book column tells us the book number.

Once we have the data loaded as a pandas DataFrame, it's time to create a network. We will use `networkx`

, a network analysis library, and create a graph object for the first book.

```
# Importing modules
# ... YOUR CODE FOR TASK 2 ...
import networkx as nx
# Creating an empty graph object
G_book1 = nx.Graph()
```

### 3. Populate the network with the DataFrame

Currently, the graph object `G_book1`

is empty. Let's now populate it with the edges from `book1`

. And while we're at it, let's load in the rest of the books too!

`G_book1`

```
# Iterating through the DataFrame to add edges
# ... YOUR CODE FOR TASK 3 ...
for _,edge in book1.iterrows():
G_book1.add_edge(edge['Source'],edge['Target'],weight=edge['weight'])
# Creating a list of networks for all the books
books = [G_book1]
book_fnames = ['datasets/book2.csv', 'datasets/book3.csv', 'datasets/book4.csv', 'datasets/book5.csv']
for book_fname in book_fnames:
book = pd.read_csv(book_fname)
G_book = nx.Graph()
for _, edge in book.iterrows():
G_book.add_edge(edge['Source'], edge['Target'], weight=edge['weight'])
books.append(G_book)
```

### 4. The most important character in Game of Thrones

Is it Jon Snow, Tyrion, Daenerys, or someone else? Let's see! Network science offers us many different metrics to measure the importance of a node in a network. Note that there is no "correct" way of calculating the most important node in a network, every metric has a different meaning.

First, let's measure the importance of a node in a network by looking at the number of neighbors it has, that is, the number of nodes it is connected to. For example, an influential account on Twitter, where the follower-followee relationship forms the network, is an account which has a high number of followers. This measure of importance is called *degree centrality*.

Using this measure, let's extract the top ten important characters from the first book (`book[0]`

) and the fifth book (`book[4]`

).

`books[0]`

```
deg_cen = nx.degree_centrality(books[0])
sorted(deg_cen.items(),key=lambda x:x[1],reverse=True)[:10]
```

```
# Calculating the degree centrality of book 1
deg_cen_book1 = nx.degree_centrality(books[0])
# Calculating the degree centrality of book 5
deg_cen_book5 = nx.degree_centrality(books[4])
# Sorting the dictionaries according to their degree centrality and storing the top 10
sorted_deg_cen_book1 = sorted(deg_cen_book1.items(),key=lambda x:x[1],reverse=True)[:10]
# Sorting the dictionaries according to their degree centrality and storing the top 10
sorted_deg_cen_book5 = sorted(deg_cen_book5.items(),key=lambda x:x[1],reverse=True)[:10]
# Printing out the top 10 of book1 and book5
# ... YOUR CODE FOR TASK 4 ...
print(sorted_deg_cen_book1)
print(sorted_deg_cen_book5)
```

### 5. The evolution of character importance

According to degree centrality, the most important character in the first book is Eddard Stark but he is not even in the top 10 of the fifth book. The importance of characters changes over the course of five books because, you know, stuff happens… ;)

Let's look at the evolution of degree centrality of a couple of characters like Eddard Stark, Jon Snow, and Tyrion, which showed up in the top 10 of degree centrality in the first book.

```
evol = [nx.degree_centrality(book) for book in books]
# Creating a DataFrame from the list of degree centralities in all the books
degree_evol_df = pd.DataFrame.from_records(evol)
degree_evol_df
```

```
%matplotlib inline
# Creating a list of degree centrality of all the books
evol = [nx.degree_centrality(book) for book in books]
# Creating a DataFrame from the list of degree centralities in all the books
degree_evol_df = pd.DataFrame.from_records(evol)
# Plotting the degree centrality evolution of Eddard-Stark, Tyrion-Lannister and Jon-Snow
# ... YOUR CODE FOR TASK 5 ...
#degree_evol_df.plot(['Eddard-Stark','Tyrion-Lannister','Jon-Snow'])
degree_evol_df[['Eddard-Stark','Tyrion-Lannister','Jon-Snow']].plot()
```

### 6. What's up with Stannis Baratheon?

We can see that the importance of Eddard Stark dies off as the book series progresses. With Jon Snow, there is a drop in the fourth book but a sudden rise in the fifth book.

Now let's look at various other measures like *betweenness centrality* and *PageRank* to find important characters in our Game of Thrones character co-occurrence network and see if we can uncover some more interesting facts about this network. Let's plot the evolution of betweenness centrality of this network over the five books. We will take the evolution of the top four characters of every book and plot it.