2013-09-21 10 views
1

J'essaie de déterminer la variance de la longueur des valeurs de paramètres et d'imprimer la valeur de la variance après l'ensemble des combinaisons de paramètres/valeurs respectives.Détermination de la variance de la longueur

Par exemple, la valeur de la variance de date dans date=2007-04-14 et date=2007-08-19 serait 0. La valeur de id_eve dans id_eve=479989, id_eve=47 et id_eve=479 serait 2,88.

A partir de Group values with common domain and page values, nous avons un ensemble d'URL qui sont analysées pour fournir les paramètres/valeurs pour un ensemble d'URL.

Exemple ensemble de données:

www.domain.com/page?id_eve=479989&adm=no 
www.domain.com/page?id_eve=47&adm=yes 
www.domain.com/page?id_eve=479 
domain.com/cal?view=month 
domain.com/cal?view=day 
ww2.domain.com/cal?date=2007-04-14 
ww2.domain.com/cal?date=2007-08-19 
www.domain.edu/some/folder/image.php?l=adm&y=5&id=2&page=http%3A//support.domain.com/downloads/index.asp&unique=12345 
blog.news.org/news/calendar.php?view=day&date=2011-12-10 
www.domain.edu/some/folder/image.php?l=adm&y=5&id=2&page=http%3A//.domain.com/downloads/index.asp&unique=12345 
blog.news.org/news/calendar.php?view=month&date=2011-12-10 

est analysé par le code Python suivant:

from collections import defaultdict 
from urllib import quote 
from urlparse import parse_qsl, urlparse 

urls = defaultdict(list) 
with open('links.txt') as f: 
    for url in f: 
     parsed_url = urlparse(url.strip()) 
     params = parse_qsl(parsed_url.query, keep_blank_values=True) 
     for key, value in params: 
      urls[parsed_url.path].append("%s=%s" % (key, quote(value))) 

# printing results 
for url, params in urls.iteritems(): 
    print url 
    for param in params: 
     print param 

Fournir:

ww2.domain.com/cal 
date=2007-04-14 
date=2007-08-19 
www.domain.edu/some/folder/image.php 
l=adm 
y=5 
id=2 
page=http%3A//support.domain.com/downloads/index.asp 
unique=12345 
l=adm 
y=5 
id=2 
page=http%3A//.domain.com/downloads/index.asp 
unique=12345 
domain.com/cal 
view=month 
view=day 
www.domain.com/page 
id_eve=479989 
adm=no 
id_eve=47 
adm=yes 
id_eve=479 
blog.news.org/news/calendar.php 
view=day 
date=2011-12-10 
view=month 
date=2011-12-10 

La pièce supplémentaire nécessaire est pour chaque paramètre/combinaison de valeurs pour imprimer la variation de longueur des valeurs de paramètre pour les paramètres correspondants avec un U similaire RL tel que défini dans la sortie ci-dessus (espérons que lire clairement).

  • paramètres de groupe pour le regroupement des URL
  • calculer la longueur des valeurs de paramètres
  • déterminer la variation de longueur

Ainsi, la sortie désirée serait:

ww2.domain.com/cal 
date=2007-04-14 
date=2007-08-19 
0 
www.domain.edu/some/folder/image.php 
l=adm 
l=adm 
0 
y=5 
y=5 
0 
id=2 
id=2 
0 
page=http%3A//support.domain.com/downloads/index.asp 
0 
unique=12345 
0  
page=http%3A//.domain.com/downloads/index.asp 
unique=12345 
0 
domain.com/cal 
0 
view=month 
view=day 
1 
www.domain.com/page 
id_eve=479989 
id_eve=47 
id_eve=479 
2.88 
adm=no 
adm=yes 
0.25 
blog.news.org/news/calendar.php 
view=day 
view=month 
1 
date=2011-12-10 
date=2011-12-10 
0 
+0

Pouvez-vous expliquer pourquoi votre exemple serait 2,88? –

Répondre

3
from collections import defaultdict 
from urllib import quote 
from urlparse import parse_qsl, urlparse 

Nous devons être en mesure de calculer écart:

def variance(values): 
    mean = sum(values)/float(len(values)) 
    return sum((elem - mean)**2 for elem in values)/float(len(values)) 

Nous voulons groupe par « clé », donc au lieu de mettre "%s=%s" nous allons ajouter une autre couche à la defaultdict.

urls = defaultdict(lambda: defaultdict(list)) 
with open('links.txt') as f: 
    for url in f: 
     parsed_url = urlparse(url.strip()) 
     params = parse_qsl(parsed_url.query, keep_blank_values=True) 
     for key, value in params: 
      urls[parsed_url.path][key].append(quote(value)) 

alors nous pouvons simplement passer par et d'autres choses imprimer

for domain, keys in urls.items(): 
    print domain 
    for key, values in keys.items(): 
     for value in values: 
      print "%s=%s" % (key, value) 

     if len(values) > 1: 
      print variance(map(len, values)) 
Questions connexes