In [19]:
# -*- coding: cp1252 -*-
from mechanize import Browser
import os
import pandas as pd
import html5lib
from bs4 import BeautifulSoup
#os.chdir(r"E:\Dropbox\Dropbox\0_DB\A_Elaborazioni\Coeweb")
class coeweb(object):
def __init__(self, link):
self.pandas_db = pd.DataFrame()
self.link = link
br = Browser()
br.open(self.link)
br.select_form(nr=0)
self.paesi = []
self.paesi_descizione = []
control = br.form.find_control("PAESE")
if control.type == "select":
for item in control.items:
self.paesi.append(item.name)
self.paesi_descizione.append((item.name, str([label.text for label in item.get_labels()])))
self.territori = []
self.territori_descrizione = []
control = br.form.find_control("CODTERRITORIO")
if control.type == "select":
for item in control.items:
self.territori.append((item.name, str([label.text for label in item.get_labels()])))
self.territori_descrizione.append((item.name, str([label.text for label in item.get_labels()])))
self.anni = []
control = br.form.find_control("ANNO")
if control.type == "select":
for item in control.items:
self.anni.append((item.name, str([label.text for label in item.get_labels()])))
self.mese = []
control = br.form.find_control("MESE")
if control.type == "select":
for item in control.items:
self.mese.append((item.name, str([label.text for label in item.get_labels()])))
self.cumulato = []
control = br.form.find_control("TIPOVALORE")
for item in control.items:
self.cumulato.append((item.name, str([label.text for label in item.get_labels()])))
self.bric = ['508', '720', '664', '75']
#[('508', "['508 - Brasile']"), ('720', "['720 - Cina']"), ('664', "['664 - India']"), ('75', "['75 - Russia']")]
def convert_string_euro(self,x):
'''questa funzione rimuove la formattazione dei numeri di coeweb, trasformando il testo in numeri'''
try:
return float(x.replace(".", ""))
except:
pass
def scarica_uno(self, territorio = ["309048"], paese = ["1033"], cumulato = ['M'], anno = ["2013"], mese = ["4"] ):# , paese, anno, trimestre, modalita)
br = Browser()
br.open(self.link)
br.select_form(nr=0)
control_territorio = br.form.find_control("CODTERRITORIO")
br[control_territorio.name] = territorio #["309048"]
control_paese = br.form.find_control("PAESE")
br[control_paese.name] = paese #["309048"]
control_anno = br.form.find_control("ANNO")
br[control_anno.name] = anno #["309048"]
control_mese = br.form.find_control("MESE")
br[control_mese.name] = mese #["309048"]
control_cumulato = br.form.find_control("TIPOVALORE")
br[control_cumulato.name] = cumulato #["309048"]
nome_stringa = territorio[0] + "_" + paese[0] + "_" + anno[0] + "_" + mese[0] + "_" + cumulato[0]
response = br.submit()
out_file = open(os.path.join(os.getcwd(), "scaricati", nome_stringa +".html"), "w")
out_file.write(response.read())
out_file.close()
#os.system("start " + nome_stringa +".html")
self.dati = pd.read_html(os.path.join(os.getcwd(), "scaricati", nome_stringa +".html"), header= 0, index_col=0, encoding = "cp1252")#'utf8'
#os.remove(territorio[0] +".html")
print "download_" + nome_stringa
br.close()
return self.dati
# i dati dovrebbero essere raccolti in un pandas
def scarica_molti(self, territorio = ["309048"], lista_paesi = None, lista_anni = None, lista_mesi = None, lista_cumulato = ["M"]):
''' questa funzione permette di scaricare per uno o più territori uno o più settori, per uno o più periodi di tempo'''
#self.pandas_db = pd.DataFrame()
def nome_paese(dati, codice):
for item in dati:
if item[0] == codice:
pulito1= item[1].split("'",)[1]
pulito2 = pulito1.split(" - ",)[1]
print pulito2
return pulito2
def nome_territorio(dati, codice):
for item in dati:
if item[0] == codice:
try:
pulito1= item[1].split("'")[1]
pulito1 = pulito1.replace("-","")
pulito1 = pulito1.replace("'","")
return pulito1
except:
pass
for item_territori in territorio:
for item_paesi in lista_paesi:
for item_anni in lista_anni:
for item_mesi in lista_mesi:
dataset = self.scarica_uno([item_territori], paese = [str(item_paesi)], anno = [str(item_anni)], mese = [str(item_mesi)], cumulato = lista_cumulato)
dataset = dataset[1]#.set_index(territorio, str(item_paesi), str(item_anni), str(item_mesi)])
dataset["territorio"] = nome_territorio(self.territori_descrizione, item_territori)
#dataset["territorio"] = item_territori
#nome_paese(self.paesi_descizione, str(item_paesi))
dataset["paese"] = nome_paese(self.paesi_descizione, str(item_paesi))
dataset["anno"] = str(item_anni)
dataset["mese"] = str(item_mesi)
dataset["cumulato"] = lista_cumulato[0]
dataset.set_index(["territorio","paese","anno","mese","cumulato"], append = True, inplace = True)
dataset["DATI EXPORT"] = dataset["EXP" + str(item_anni)]
dataset = dataset["DATI EXPORT"].apply(lambda x: self.convert_string_euro(x))
# datasetcompleto
self.pandas_db = pd.concat([self.pandas_db, pd.DataFrame(dataset)])
# settori ateco disponibili
self.pandas_db.settori = set(self.pandas_db.reset_index()["Divisioni"])
#print "errore_" + territorio[0] + "_" + str(item_paesi) + "_" + str(item_anni) + "_" + str(item_mesi) + "_" + lista_cumulato[0]
for scaricato in os.listdir(os.path.join(os.getcwd(), "scaricati")):
os.remove(os.path.join(os.getcwd(), "scaricati", scaricato))
print "eseguito"
def analizza_settori(self, settori, interpolazione = "no"):
''' questa funzione restituisce un dataframe e un dizionario contenente le serie storiche per i settori inseriti come argomento [lista].
Effettua anche l'interpolazione dei dati mancanti'''
self.dict_settore = {}
for item in settori:
dati_settore = self.pandas_db.xs(item, level=0)
if interpolazione == "yes":
dati_settore["DATI EXPORT"] = dati_settore["DATI EXPORT"].apply(lambda x: convert_string_euro(x)).interpolate()
else:
dati_settore["DATI EXPORT"] = dati_settore["DATI EXPORT"].apply(lambda x: convert_string_euro(x))
self.dict_settore[item] = dati_settore["DATI EXPORT"]
self.dataframe_settori = pd.DataFrame(self.dict_settore)
return self.dataframe_settori
In [20]:
def convert_string_euro(x):
try:
return float(x.replace(".", ""))
except:
pass
In [ ]:
In [21]:
os.getcwd()
Out[21]:
In [22]:
lista_anni = [str(i) for i in range(2009,2016)]
In [97]:
lista_anni
Out[97]:
In [23]:
Firenze = coeweb("http://www.coeweb.istat.it/predefinite/tutto_paese_merce.asp?livello=ATE07_AT2&riga=MERCE&territorio=S&AG=S")
In [ ]:
In [24]:
metropolitana = [('309', "['---Toscana']"),
('309047', "['------Pistoia']"),
('309048', "['------Firenze']"),
('309100', "['------Prato']")]
In [25]:
CodiciMetropolitana = []
for item in metropolitana:
CodiciMetropolitana.append(item[0])
In [90]:
CodiciMetropolitana
Out[90]:
In [26]:
Firenze.scarica_molti(territorio = CodiciMetropolitana, lista_paesi = ['6'], lista_anni = lista_anni, lista_mesi = ["9"], lista_cumulato = ['C'])
In [27]:
dati_toscana_completi = Firenze.pandas_db
In [71]:
dati_toscana_completi = dati_toscana_completi.reset_index()
In [86]:
dati_toscana_completi["anno"] = pd.to_datetime(dati_toscana_completi.anno, format="%Y")
In [87]:
dati_toscana_completi.drop(["paese", "mese", "cumulato"], axis = 1, inplace = True)
In [85]:
Out[85]:
In [88]:
dati_toscana_completi.to_excel("dati_metropolitana_completi.xlsx")
In [29]:
Firenze
Out[29]:
In [34]:
serie_storica = dati_toscana_completi[dati_toscana_completi.index.get_level_values('Divisioni').isin(['Totale'])].unstack("anno")
In [41]:
#["2015"]
Out[41]:
In [58]:
%matplotlib inline
serie_storica["DATI EXPORT"].divide(serie_storica["DATI EXPORT"]["2009"], axis = 0) * 100
Out[58]:
In [89]:
Italia = coeweb("http://www.coeweb.istat.it/predefinite/tutto_paese_merce.asp?livello=ATE07_AT2&riga=MERCE&territorio=S&AG=S")
In [99]:
italia_province = []
for item in Italia.territori:
if len(item[0]) == 6:
italia_province.append(item[0])
In [137]:
#italia_province
In [101]:
Italia.scarica_molti(territorio = italia_province, lista_paesi = ['6'], lista_anni = ["2015"], lista_mesi = ["9"], lista_cumulato = ['C'])
In [103]:
Italia_df = Italia.pandas_db
In [106]:
Italia_df = Italia_df.reset_index()
In [141]:
key = pd.read_excel("aggancio_nuts_ok.xlsx")
In [143]:
key
Out[143]:
In [146]:
pd.merge(Italia_df, key, left_on = "territorio", right_on ="COEWEB")
Out[146]:
In [115]:
Italia_df[Italia_df["Divisioni"] == "Totale"].sort_values("DATI EXPORT", ascending = False).to_excel("classifica.xlsx")#["territorio"].unique()
In [138]:
#Italia_df[Italia_df["Divisioni"] == "Totale"].sort_values("DATI EXPORT", ascending = False)
In [128]:
Divisioni = Italia_df.groupby("Divisioni").sum()
In [ ]:
Divisioni.drop("Totale",axis =0, inplace = True)
In [132]:
Divisioni["%"] = Divisioni["DATI EXPORT"] / Divisioni["DATI EXPORT"].sum() * 100 #
In [142]:
Italia_df
Out[142]:
In [135]:
Divisioni.sort_values("DATI EXPORT", ascending = False)
Out[135]:
In [ ]: