« WarBot » : différence entre les versions
(→Code) |
|||
(4 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 53 : | Ligne 53 : | ||
import matplotlib.pyplot as plt # visualization library | import matplotlib.pyplot as plt # visualization library | ||
from plotly.offline import init_notebook_mode, iplot # plotly offline mode | from plotly.offline import init_notebook_mode, iplot # plotly offline mode | ||
import plotly.graph_objs as go # plotly graphical object | import plotly.graph_objs as go # plotly graphical object</nowiki> | ||
=== Data Import & Cleaning === | === Data Import & Cleaning === | ||
Ligne 77 : | Ligne 75 : | ||
#drop all the features that we do not use | #drop all the features that we do not use | ||
drop_features= [c for c in aerial.columns if not (c in used_features) ] | drop_features= [c for c in aerial.columns if not (c in used_features) ] | ||
aerial.drop(drop_features, axis=1,inplace = True) | aerial.drop(drop_features, axis=1,inplace = True)</nowiki> | ||
=== Data Extraction === | |||
<nowiki> | |||
<nowiki> | |||
#Change the format of the dates | #Change the format of the dates | ||
aerial['Mission Date']= pd.to_datetime(aerial['Mission Date']) | aerial['Mission Date']= pd.to_datetime(aerial['Mission Date']) | ||
Ligne 90 : | Ligne 87 : | ||
aerial.groupby(['Takeoff Location']) | aerial.groupby(['Takeoff Location']) | ||
list_location= aerial['Takeoff Location'] | list_location= aerial['Takeoff Location'] </nowiki> | ||
=== Data Vizualization === | === Data Vizualization === | ||
<nowiki> | <nowiki> | ||
# This functions creates a histgram of all the attacked countries by a country n_country | # 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 | # First, keep only the rows that n_country as an attacking country | ||
Ligne 145 : | Ligne 140 : | ||
create_graph_hist_attacked_by('LIBYA') | create_graph_hist_attacked_by('LIBYA')</nowiki> | ||
=== Bot Creation === | |||
<nowiki> | |||
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])</nowiki> |
Dernière version du 25 mai 2021 à 10:57
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])