WarBot

De Wikipast
Aller à la navigation Aller à la recherche

La deuxième Guerre Mondiale est un tournant historique et le but de Warbot est d'inclure les évènements les plus marquants de la WWII dans les wikipast des endroits. Pour ce faire, à partir d'un dataset de bombardements aériens, Warbot intégre dans le wikipast une liste des bombardments aériens effectué par chaque ville et une liste des attaques subis par chaque ville. De plus, le bot ajoute une représentation graphique des attaques.


Résumé des fonctionnalités

1- Le bot intègre une entrée de bombardement dans les pages wiki de lieux contenant la date, le lieu, les parties concernées, etc. (variant selon les données disponibles). Si la page n’existe pas, il crée une nouvelle page du lieu du bombardement.

2- Le bot intègre deux histogrammes. Le premier histogramme montre la liste des attaques effectuées par la ville. Le deuxième montre la liste des attaques subies par la ville.

Données traités

Les données traitées par ce bot sont constituées de rapports de mission papier numérisés de la Seconde Guerre mondiale. Elles ont été recensées par le département de la United States Air Force. Chaque enregistrement comprend la date, le conflit, l'emplacement géographique et d'autres éléments de données pour former une séquence en direct de la guerre aérienne de 1939 à 1945. Les enregistrements comprennent des données sur les forces aériennes américaines et royales, ainsi que des missions des forces aériennes australiennes, néo-zélandaises et sud-africaines.

Description technique

Gestion des données

  • Importation des librairies utilisée : Pandas, Numpy
  • Importation du dataset.
  • Elimination des données qui n'ont pas d'entrée de pays, de longitude de la cible ou longitude du départ de mission.
  • Elimination des données null pour l'implémentation du bot.

Extraction des données

  • Uniformisation des données de date.
  • Réorganisation du dataframe selon les dates des missions.
  • Groupement des missions selon les lieux de départ.

Visualisation des données

Nous avons créé deux histogrammes basés sur les données concernant un pays spécifique :

  • Le premier histogramme montre le nombre d'attaques que le pays en question a initiée, et contre quels pays.

Warbot exemple1.png

  • Le deuxième histogramme montre le nombre d'attaques subies par un pays et par quels ennemis.

Warbot exemple2.png

Création du Bot

  • Recherche des page de lieux et implémentation des informations
  • Si la page du lieu n'existe pas, on la crée.

Discussion des performances

Code

Import the needed libraries

import numpy as np
import pandas as pd
import datetime
import matplotlib.pyplot as plt # visualization library
from plotly.offline import init_notebook_mode, iplot # plotly offline mode
import plotly.graph_objs as go # plotly graphical object

Data Import & Cleaning

#Import the data 
aerial = pd.read_csv('operations.csv')


# drop countries that are NaN
aerial = aerial[pd.isna(aerial.Country)==False]
# drop if target longitude is NaN
aerial = aerial[pd.isna(aerial['Target Longitude'])==False]
# Drop if takeoff longitude is NaN
aerial = aerial[pd.isna(aerial['Takeoff Longitude'])==False]


#used features
used_features= ['Mission ID', 'Mission Date','Country', 'Takeoff Location',
                'Takeoff Longitude','Takeoff Base','Takeoff Latitude','Target Country', 'Target City', 
                'Target Latitude', 'Target Longitude']
#drop all the features that we do not use
drop_features= [c for c in aerial.columns if not (c in used_features) ]
aerial.drop(drop_features, axis=1,inplace = True)

Data Extraction

#Change the format of the dates
aerial['Mission Date']= pd.to_datetime(aerial['Mission Date'])
#Sort the dataframe by date
aerial= aerial.sort_values(by="Mission Date")
#Groupby Takeoff Location
aerial.groupby(['Takeoff Location'])

list_location= aerial['Takeoff Location'] 

Data Vizualization

# This functions creates a histgram of all the attacked countries by a country n_country
# First, keep only the rows that n_country as an attacking country
# Second, count the occurances of the attacked country and keep most 10 attacked countries by n_country
# Plot the histogram 
def create_graph_hist_attack (n_country):
    df=aerial.loc[aerial.Country==n_country]
    data= df['Target Country'].value_counts()   
    data = [go.Bar(
            x=data[:10].index,
            y=data[:10].values,
            hoverinfo = 'text',
            marker = dict(color = 'rgba(177, 14, 22, 0.5)',
                             line=dict(color='rgb(0,0,0)',width=1.5)),
    )]

    layout = dict(
        title = 'Aircraft Series done by '+ n_country,
    )
    fig = go.Figure(data=data, layout=layout)
    iplot(fig)

create_graph_hist_attack("USA")

# This functions creates a histgram of all the countries that attackes  n_country
# First, keep only the rows that n_country as an attacked country
# Second, count the occurances of the attacking  country and keep most 10 attacking countries by n_country
# Plot the histogram 

def create_graph_hist_attacked_by (n_country):
    df=aerial.loc[aerial['Target Country']==n_country]
    data= df['Country'].value_counts()   
    data = [go.Bar(
            x=data[:10].index,
            y=data[:10].values,
            hoverinfo = 'text',
            marker = dict(color = 'rgba(177, 14, 22, 0.5)',
                             line=dict(color='rgb(0,0,0)',width=1.5)),
    )]

    layout = dict(
        title =  n_country+" was mostly attacked by "
    )
    fig = go.Figure(data=data, layout=layout)
    iplot(fig)

aerial['Target Country'].value_counts()


create_graph_hist_attacked_by('LIBYA')

Bot Creation

def createPage(page,site):
    print("creating page for ", page)
    titre = page.lower()

    site('edit', title=titre,
    text='Ceci est une page.',
    token=site.token())

def editPage(page,site,txt):
    site('edit', title=page,
     section='new',
     sectiontitle='Section',
     text=txt,
     token=site.token())

from pywikiapi import Site
pd.read_csv('aerical_cleaned.csv')

user = 'SEric'
password = 'WarBot@iung14qikg0slhjds8i9spetpdhj4fu6'

site = Site('http://wikipast.epfl.ch/wikipast/api.php') # Définition de l'adresse de l'API
site.no_ssl = True # Désactivation du https, car non activé sur wikipast
site.login(user, password) # Login du bot

# creating a page for each loaction if it does not exist
for event in set(list_location):

    e= event.lower()
    #print(e)
    results = []
    # Cherche dans toutes les pages celles commençant par Mahatma
    for res in site.query(list='allpages', apprefix=e):
        for p in res["allpages"]:
            if p["title"] == e.capitalize():
                results.append(p["title"])
    if len(results) == 0:
        createPage(e,site)

for a in aerial:
    print(a)

def initPagesAgain():
    for event in set(list_location):
        e= event.lower()
        createPage(e,site)

# for i in range(len(aerial["Takeoff Location"])):
#     print(aerial["Takeoff Location"][i])
#     s = ""
#     for a in aerial:
#         s += ",the "+a+" is "+str(aerial[a][0])
#     print(s+'\n')
desc = [[a," "]for a in aerial["Takeoff Location"]]

    
for a in aerial:
    i = 0
    for b in aerial[""+a]:
        desc[i][1] += " the "+a+" is "+str(b)
        i += 1
initPagesAgain()
for d in range(len(desc)):
    editPage(desc[d][0].lower().capitalize(),site,desc[d][1])