WarBot
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.
- Le deuxième histogramme montre le nombre d'attaques subies par un pays et par quels ennemis.
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])