Archivio

Archivio per la categoria ‘FantaLega’

FantaStat 2.0

22 Novembre 2017 Commenti chiusi

Introduzione

Fstat 2.0 è una semplice applicazione per visualizzare le statistiche
dei giocatori di fantacalcio.
La precedente versione serviva a visualizzare i file.txt veccio formato, quelli che indicavano anche i goal segnati, gli assist ecc.
I file più recenti indicano solo il fanta voto, voto senza bonus malus e la quotazione:

code|NAME|TEAM|fanta voto|voto|quotazione

Link utili

Il codice dell’applicazione è reperibile nel repo corrispondente di github.
I binari win con database players.db qui.
I file txt delle giornate di fantacampionato sono reperibili sul blog.

Moduli utilizzati
Python 2.7.8
grafica: wx 3.0.2.0
ORM: Django 1.10.1

L’utilizzo è molto semplice e di seguito viene descritto:

Creazione database

Qualora ci si dimenticasse di creare il database per primo, al lancio dell’applicazione si verrà avvisati da un messaggio.

Ogni baco segnalato sarà ben gradito.

Creare quindi il database con il seguente comando:

python manage.py makemigrations players

Le migrations iniziali dovrebbero già essere presenti nel repo di github, quindi potrebbero non risultare modifiche, procedere quindi con il secondo comando:

python manage.py migrate

Avviare Fstat2.0

Per avviare l’applicazione eseguire lo script main.py con il comando:

python main.py

Non avendo ancora importato nessun giocatore, verremo avvisati da un messaggio che è necessario importare il primo file:

Le prime giornata disputate sono già fornite con il repo in posizione players/days, oppure sono sempre reperibili qui.
Dal menu Import-> Import players importare il file desiderato, solitamente la giornata 1 (MCC1.txt)

Il file dei giocatori va importato solo la prima volta, dopodichè il menu non sarà più attivo.
Da qui in avanti si importeranno solo i file dei voti.
Il primo sarà nuovamente MCC1.txt. Dal menu Import -> Import Evaluations, procedere con l’importazione.

Finita un’importazione eseguire un refresh dall’apposito pulsante.
L’interfaccia si presenta come in figura:

I radio-buttons permettono di filtrare i giocatori per ruolo, mentre cliccando sulle colonne della lista,
l’ordinamento avverrà in base alla colonna cliccata. Ad esempio cliccando su real_team, i giocatori
saranno ordinati per ruolo e per squadra di appartenenza.

Cliccando invece sulla “riga” di un determinato giocatore, sarà possibile modificarlo.

Dal menu Player -> Summary si accede alla lista riassuntiva del giocatori, poichè la visualizzazione della schermata del frame principale, mostra le medie dei giocatori e non i valori iniziali.
Da qui cliccando sui giocatori si possono modificare come in precedenza.

Qualora nei file non risultasse un giocatore, sarà possibile crearlo dal menu Players -> New Player

Stesso discorso vale per le valutazioni; esiste un sommario accessibile dal menu Evaluations -> Summary

dove cliccando sulla riga di una valutazione, sarà possibile modificarla

Come per i giocatori, sarà possibile aggiungere una valutazione ad hoc, dal menu
Evaluations -> New Evaluation

Come ultima operazione, è possibile cancellare tutti i dati, dal menu Reset.

Fantamanager 2.2

20 Settembre 2017 Commenti chiusi

Diversamente dalla versione precedente FantaLega 2.1 e dalla versione Light, qui è possibile gestire un campionato di n.squadre, a scontri diretti (con più di 8/10 squadre).
Il giocatore non potrà più appartenere a più squadre ma è prevista un’asta.

Opzioni:
Asta
Costruzione Squadre
Generazione calendario
Modifica Squadre
Consegna formazioni
Modifica Formazioni
Importazione Giocatori e Voti Gazzetta
Modifica Giocatori
Mercato tra squadre
Calcolo punteggio formazioni
Classifica Squadre

Grafica: WX
Django per l’ORM

Utilizzare virtualenv ed installare i requirements:

pip install -r requirements.txt

Creare il database:

python manage.py makemigrations fantalega
python manage.py migrate

lanciare l’applicazione con il comando:

python main.py

Il link di github:
repo su github

Fantalega: gestore Asta

1 Settembre 2017 Commenti chiusi

Ieri è terminata ufficialmente la sessione di calciomercato.
Molti fanta-allenatori hanno rischiosamente già effettuato le loro aste,
molti altri (noi), NO.

Ecco un tool parecchio spartano che velocizzerà le annotazioni
squadra-giocatore durante l’asta.

Auction1.0 è un gestore di aste di fantacalcio scritto in python.
Per la grafica sono state utilizzate le librerie wx, mentre per la
gestione del database e l’ORM, è stato utilizzato django.

Requisiti: installare django e wxpython

Su github è presente una prima bozza di repo.

Per prima cosa creare i database con i due comandi:

python manage.py makemigrations auction
python manage.py migrate

dopo queste operazioni che creeranno il database con le relative tabelle, è
possibile avviare la app:

python main.py

per prima cosa importiamo i giocatori utilizzando i soliti file txt in
formato Gazzetta, reperibili qui:

E’ possibile importare i giocatori più e più volte in modo da aggiornare
la lista dei calciatori.
Importati i giocatori, è necessario creare le squadre.

Dopo aver creato le squadre, si comincia l’asta.

Si seleziona il giocatore per squadra reale di appartenenza,
si utilizzano i filtri di ruolo e si assegna un costo d’asta e la squadra
che si aggiudica il giocatore. Durante l’asta è possibile avere un resoconto
delle squadre, con budget rimanente e giocatori ancora da comprare

Dai menu Teams e Players è possibile editare le squadre e i giocatori
per apportare delle modifiche. E’ anche possibile aggiungere giocatori che,
in fase d’asta, non sono ancora stati ufficializzati da Gazzetta e quindi
non presenti nei file.

Terminata l’asta è possibile effettuare scambi tra fanta-allenatori con il menu
“Trades”.

Nota: la casella max trades del pannello edit-team indica le massime operazioni
di mercato concesse durante la fantalega, mutuate dall’applicazione completa.
Queste operazioni (Trades) in fase di asta, sono invece illimitate.

Come ultima operazione, è possibile esportare un file in formato csv (menu Auction).

python: calendario fantalega

1 Settembre 2014 Commenti chiusi

Ecco una applicazione per creare un calendario con n squadre Pari.
Non tiene conto della giornata di riposo in caso di squadre dispari!
Testandola, dovrebbe tenere conto anche del “casa”, “fuoricasa”.

codice view:

# -*- coding: utf-8 -*-#
'''VIEW Module for FantaCalendario:
Graphic library: wx
Bindings are defined under CONTROLLER Module.
''' 
import wx, os

class FrameCal(wx.Frame):
    '''Main frame for FantaPython application'''
    def __init__(self, *args, **kwargs):
        self.nsq = kwargs.pop('nsq')
        wx.Frame.__init__(self, *args, **kwargs)
        self.panel = wx.Panel(self)
        self.panel.SetBackgroundColour('Pink')
        sq_cont = 1
        xpos, ypos = 100, 20
        while sq_cont <= self.nsq:
            wx.StaticText(self.panel, wx.ID_NEW, 'squadra%s' % sq_cont,
                          pos = ((xpos - 85), ypos), size = (70, 25))
            wx.TextCtrl(self.panel, wx.ID_NEW,
                        pos = (xpos, ypos), size = (140, 25))
            ypos += 25
            sq_cont += 1
        
        self.btn_create = wx.Button(self.panel, wx.ID_NEW, 'Crea Calendario',
                                    size = (240, 25), pos = (0, (ypos)))
        self.SetSizeWH(250, (ypos + 65))
        self.Centre()
        self.Show()

class InfoMessage(wx.MessageDialog):
    '''Simple message Dialog'''
    def __init__(self, parent, message):
        wx.MessageDialog.__init__(self, parent, message, 'core info', wx.OK |
                                  wx.ICON_EXCLAMATION)
    def get_choice(self):
        '''get the state of the user choice'''
        if self.ShowModal() == wx.ID_OK:
            self.Destroy()

class ChoiceMessage(wx.MessageDialog):
    '''Simple choice message Dialog'''
    def __init__(self, parent, message):
        wx.MessageDialog.__init__(self, parent, message, 'Core question',
                                  wx.YES_NO | wx.ICON_QUESTION)
    def get_yes(self):
        '''get True if YES is clicked'''
        if self.ShowModal() == wx.ID_YES:
            return True
        else:
            self.Destroy()

class EntryDialog(wx.TextEntryDialog):            
    '''Simple Text Entry Dialog'''
    def __init__(self, parent, msg, value):
        wx.TextEntryDialog.__init__(self, parent, msg, 'Core request',
                                    defaultValue = value, style = wx.OK)
    def get_choice(self):
        '''get the state of the user choice'''
        if self.ShowModal() == wx.ID_OK:
            response = self.GetValue()
            self.Destroy()
            return response

class FileSaver(wx.FileDialog):
    '''Class for file Saver'''
    def __init__(self):
        self.f_save = None
        wildcard = "File Calendario (*.txt)|*.txt|" \
            "Tutti i files (*.*)|*.*"
        wx.FileDialog.__init__(self, None, "salva il file", os.getcwd(),
                               "", wildcard, wx.SAVE)
        if self.ShowModal() == wx.ID_OK:  
            print "...salvo il file in: %s" % (self.GetPath())
            self.output = self.GetPath()
            self.f_save = open(self.output, 'w')
        else:
            print "operazione salvataggio annullata"
            self.f_save = None
            self.Destroy()
        self.Destroy()

def main():
    '''app starter'''
    app = wx.PySimpleApp()
    n_sq = 8 # number of teams
    FrameCal(None, wx.ID_NEW, "Calendario 1.1", nsq = n_sq)
    app.MainLoop()

if __name__ == '__main__':
    main()

codice controller:

'''FantaCalendario v 2.0
   Controller Module for FantaCalendario Application:
   All the binding method to frame widget are defined here'''

import wx

from View import (FrameCal, EntryDialog, InfoMessage, FileSaver)
from copy import copy


class Team(object):
    '''A team class'''
    def __init__(self, name, status=True):
        self.name = name
        self.casa = status
        
    def set_casa(self):
        """set the status 'casa' to True"""
        self.casa = True

    def set_fuori(self):
        """set the status 'fuori' to True"""
        self.casa = False


class Controller(object):
    '''Controller class for MVC-like pattern'''
    def __init__(self):
        n_sq = int(EntryDialog(None, "Quante Squadre partecipano?",
                                     '8').get_choice())
        self.gui = FrameCal(None, wx.ID_NEW, "Calendario 2.0", nsq=n_sq)
        self.gui.Bind(wx.EVT_BUTTON, self.on_create)

    def on_create(self, evt):
        '''create every "team_x vs team_y" combinations possible'''
        panel = evt.GetEventObject().GetParent()
        teams = []
        err = 0
        for widget in panel.GetChildren():
            if isinstance(widget, wx.TextCtrl):
                if widget.GetValue() != '':
                    teams.append(Team(widget.GetValue()))
                else:
                    err += 1
        if err > 0:
            msg = "mancano uno o piu' nomi squadra"
            InfoMessage(panel.GetParent(), msg).get_choice()
        else:
            print teams
            crea_calendario(teams)
            self.gui.Close()


def crea_calendario(lista):
    '''crea gli accoppiamenti da una lista'''
    matrix = []
    cont = 0
    while cont < len(lista):
        matrix.append([None] * len(lista))
        cont += 1
    matrix[0] = lista  # intestazione

    # Riga Intestazione invertita meno l'ultima squadra
    row2 = copy(lista)
    row2.pop()
    row2.reverse()
    matrix[1][0:(len(lista) - 1)] = row2[0:(len(lista) - 1)]

    # Composizione tabella prima FASE
    i = 1
    while i < len(lista):
        k = 1
        for item in matrix[i]:
            try:
                matrix[i + 1][k] = item
                matrix[i + 1][0] = matrix[i + 1][(len(lista) - 1)]
                matrix[i + 1][(len(lista) - 1)] = None
                k += 1
            except IndexError:
                break
        i += 1

    # Composizione tabella seconda FASE
    row_m = 1
    while row_m < len(lista):
        for item_a in matrix[0]:
            for item_b in matrix[row_m]:
                if matrix[0].index(item_a) == matrix[row_m].index(item_b):
                    if item_a == item_b:
                        matrix[row_m][matrix[row_m].index(item_b)] = lista[-1]
                        matrix[row_m][(len(lista) - 1)] = item_b
        row_m += 1

    # Stampa giornata
    cont = 1
    fbs = FileSaver()
    outputfile = fbs.f_save
    while cont < len(lista):
        outputfile.write("\nGiornata n. " + str(cont) + "\n")
        andata = []
        for sq_a in matrix[0]:
            for sq_b in matrix[cont]:
                if matrix[0].index(sq_a) == matrix[cont].index(sq_b):
                    if sq_b not in andata or sq_a not in andata:
                        if sq_a.casa == True:
                            andata.append(sq_a)
                            andata.append(sq_b)
                            outputfile.write(sq_a.name + "-" + sq_b.name + "\n")
                            sq_a.set_fuori()
                            sq_b.set_casa()
                        else:
                            andata.append(sq_b)
                            andata.append(sq_a)
                            outputfile.write(sq_b.name + "-" + sq_a.name + "\n")
                            sq_a.set_casa()
                            sq_b.set_fuori()
        cont += 1
    outputfile.close()


def main():
    '''starter'''
    app = wx.PySimpleApp()
    Controller()
    app.MainLoop()

if __name__ == '__main__':
    main()

il funzionamento è semplicissimo:
si avvia, si sceglie il numero di squadre:
cal_1
si mettono i nomi delle squadre:
cal_2
si preme il pulsante crea e si sceglie un nome per la destinazione in txt, che poi potrà essere importata ad esempio in excel.

Giornata n. 1
A-C
B-D

Giornata n. 2
D-A
C-B

Giornata n. 3
A-B
D-C

link binario (exe)

Categorie:FantaLega, python, wxPython Tag:

Statistiche Fantacalcio: Flask-SQLAlchemy – view (parte 2)

20 Settembre 2013 Commenti chiusi

ecco una UI veloce veloce e molto migliorabile:

import model

class TextualViewer(object):
    def show_main_menu(self):
        menu = """\n
                 * Scegli un'opzione
                 ----------------------------------
                 1 - Miglior giocatore del torneo
                 2 - Miglior portiere del torneo
                 3 - Miglior difensore del torneo
                 4 - Miglior ccampista del torneo
                 5 - Miglior attaccante del torneo
                 6 - Miglior giocatore per squadra
                 7 - Media giocatori per squadra
                 8 - Trova giocatore che comincia per...
                 9 - Tutti i voti di un giocatore
                 0 - EXIT
                """
        print menu

    def show_player_result(self, player):
        obj, avg = player
        print "\n\n"
        print " ---<<<   Miglior Giocatore del torneo   >>>---\n"
        print "     {} ({})".format(obj.name, obj.team)
        print "     media voto: {}".format(avg)
        
    def show_avg_result(self, iterable):
        print "\n\n"
        print " ---<<<   Media voto Giocatori decrescente  >>>---\n"
        for player in iterable:
            print '{}  ({}) : media voto: {}'.format(player[0], player[1],
                                                     player[2])
    def show_player_grades(self, iterable, player):
        print "\n\n"
        print " ---<<<     Voti giornate %s      >>>---\n" % player.name
        for record in iterable:
            print 'giornata {}    voto: {}'.format(record[0], record[1])

    def show_player_name_starts_with(self, iterable, prefix):
        print "\n\n"
        print " ---<<<     Nomi Giocatori con '%s'     >>>---\n" % prefix
        for player in iterable:
            print '{} ({})'.format(player.name, player.team)

Poi creeremo un controller, che per ora, per una questione di debug utilizzo nello stesso
file view.py, a runtime.
La classe controller la creerò quando avrò 5 minuti.

if __name__ == '__main__':
    m = model.Model()
    cases = {1: m.get_best_player,
             2: m.get_best_role_player,
             3: m.get_best_role_player,
             4: m.get_best_role_player,
             5: m.get_best_role_player,
             6: m.get_best_team_player,
             7: m.get_avg_players,
             8: m.get_players_name_starts_with,
             9: m.get_player_fgrades,
            }
    tv = TextualViewer()
    while True:
        tv.show_main_menu()
        choice = raw_input('--> ')
        if choice == '0'.strip(): break
        elif choice == '1':
            player = cases.get(int(choice))()
            tv.show_player_result(player)
        elif choice == '2':
            player = cases.get(int(choice))('portiere')
            tv.show_player_result(player)
        elif choice == '3':
            player = cases.get(int(choice))('difensore')
            tv.show_player_result(player)
        elif choice == '4':
            player = cases.get(int(choice))('centrocampista')
            tv.show_player_result(player)
        elif choice == '5':
            player = cases.get(int(choice))('attaccante')
            tv.show_player_result(player)
        elif choice == '6':
            team = raw_input('quale squadra? ')
            player = cases.get(int(choice))(team)
            tv.show_player_result(player)
        elif choice == '7':
            team = raw_input('quale squadra? ')
            players = m.get_players_by_team(team)
            result = cases.get(int(choice))(players)
            tv.show_avg_result(result)
        elif choice == '8':
            prefix = raw_input('comincia per? ')
            result = cases.get(int(choice))(prefix)
            tv.show_player_name_starts_with(result, prefix)
        elif choice == '9':
            pl = raw_input('quale giocatore? ')
            player = m.get_player_by_name(pl)
            result = cases.get(int(choice))(player)
            tv.show_player_grades(result, player)

link utili:
model

Categorie:Fantacalcio, FantaLega, python Tag:

Statistiche Fantacalcio: la mia prima applicazione con Flask-SQLAlchemy

19 Settembre 2013 Commenti chiusi

Django ed il suo orm, già li ho usati. Stupendo, ma volendo un’applicazione
che lavori sia in locale che su web, il magnifico orm di django (e tutto il suo mondo),
mi diventa pesantuccio da portare appresso.

SQlAlchemy è comodissimo, ma non è compatibile con django (o meglio se devi usare
django e rinunciare al suo orm, lasciamo perdere).
Web2py come WF funziona nativamente con sqla, ma non mi ci trovo granchè.

Invece Flask, essendo un light-web-framework (che ancora non so utilizzare…),
dovrebbe fare a caso mio per il secondo caso… e soprattutto si
appoggia ad SQLAlchemy. Se quindi impostassi la mia app in locale
utilizzando l’estensione di Flask, appunto Flask-SQLAlchemy, nel momento
in cui dovrò trasferire il tutto su web, dovrei essere a posto e soprattutto leggero.

Cominciamo quindi con l’impostare l’applicazione dalle basi.

Come spesso accade sul mio blog, imposto i miei esercizi ed i miei esperimenti,
basandomi sul fantacalcio. Comodissimo per creare un database con più di una tabella
e soprattutto con relazioni che siano almeno di 1 a molti.

Questa volta vorrei un’applicazione che prendesse tutti i calciatori della serie A,
che immagazzinasse tutti i voti che questi prendono ogni giornata e mi restituisse la
media voto.
Mi servirò del magico sqlite per il database e di un pattern MVC per l’app vera e propria.
Inizialmente avremo una UI testuale, poi in futuro faremo anche una GUI.

Iniziamo quindi dal Model, creando un file model.py:

Ci saranno 2 classi (tabelle):

Player (calciatore)
Grade (voto)

collegate tra loro con una relazione 1-a-molti, poichè ovviamente un giocatore
alla fine del campionato riceverà un voto per ogni giornata giocata.

tables
fig.1

come da guida di Flask-SQLAlchemy, creiamo le classi:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///stat.db'
db = SQLAlchemy(app)

class Player(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    code = db.Column(db.Integer(3), unique=True)
    name = db.Column(db.String(80), unique=True)
    team = db.Column(db.String(3))

    def __init__(self, code, name, team):
        self.code = code
        self.name = name
        self.team = team

    def __repr__(self):
        return '<Player %r>' % self.name


class Grade(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    day = db.Column(db.Integer(3))
    f_grade = db.Column(db.Float(4))  # grade with bonus-malus
    grade = db.Column(db.Float(4))  # naked grade (without bonus-malus)
    value = db.Column(db.Integer(3))
    # Relationship
    player_id = db.Column(db.Integer, db.ForeignKey('player.id'))
    player = db.relationship('Player',
        backref=db.backref('grades', lazy='dynamic'))

    def __init__(self, day, f_grade, grade, value, player):
        self.day = day
        self.f_grade = f_grade
        self.grade = grade
        self.value = value
        self.player = player

    def __repr__(self):
        return '<Grade day %r: %r>' % (self.day, self.player)

per creare il database:

db.create_all()

Class Model:

Craieamo ora la classe Model, che conterrà tutte le operazioni che faremo sul database.
I print che appaiono nel codice hanno funzione di debug.
Le vere operazioni di visualizzazione, verranno inserite nel modulo view.py, come
da pattern. Il controller farà il resto.
Comunque, qui di seguito la classe Model con i suoi metodi, tutti per la verità
abbastanza autoesplicativi:

class Model(object):
    '''Model class for MVC pattern.
       It creates, destroies, fills and queries the database "stat.db".
    '''

    def __init__(self):
        self.day = None

    def _database_exist(self):
        '''Return True if database already exists'''
        return 'stat.db' in os.listdir(os.getcwd())

    def _delete_database(self):
        '''Delete database and all data'''
        ans = raw_input("I'm going to remove database, are you sure? (Y/N): ")
        if ans.upper() == 'Y':
            db.session.close()
            os.remove('stat.db')
        else:
            print 'operation canceled!'

    def _import_all_txt(self):
        pass

    def get_import_day(self, path):
        '''Get the day number from path file'''
        pattern = 'MCC(\d{2}).txt'
        try:
            day = re.compile(pattern).search(path).group(1)
        except AttributeError:
            print 'File name must follow "MCCnn_s.txt" pattern! Rename it.'
        return day

    def _import_file(self, path):
        '''Import grade records from txt file and store them in db'''
        self.day = self.get_import_day(path)
        with open(path, 'r') as input_file:
            records = input_file.readlines()

        self._import_players(records)
        self._import_grades(records)

    def _import_players(self, records):
        for record in records:
            # input pattern:  102|AGAZZI|CAG|5.0|6.0|11
            code, name, team, f_grade, grade, value = record.split('|')
            if not self._player_exists(code):
                pl = Player(code=code, name=name, team=team)
                db.session.add(pl)
                print '+++ import player {}'.format(pl)
            else:
                print '*** player {} existing...'.format(name)
        db.session.commit()

    def _import_grades(self, records):
        for record in records:
            code, name, team, f_grade, grade, value = record.split('|')
            if not self._grade_exists(int(self.day)):
                pl = self.get_player_by_code(code)
                gr = Grade(day=self.day, f_grade=f_grade, grade=grade,
                           value=value, player=pl)
                db.session.add(gr)
                print '<<< import new grade {}'.format(gr)
            else:
                print 'this day is not new'
        db.session.commit()

    def _player_exists(self, code):
        return Player.query.filter_by(code=code).first()

    def _grade_exists(self, day):
        return Grade.query.filter_by(day=day).first()

    def _get_imported_days(self):
        return db.session.query(Grade.day).distinct().all()

    def get_player_by_code(self, code):
        return Player.query.filter_by(code=code).first()

    def get_player_by_name(self, name):
        return Player.query.filter_by(name=name.upper()).first()

    def get_player_fgrades(self, player):
        return [(pl.day, pl.f_grade) for pl in player.grades.all()]

    def get_avg_player(self, player):
        ndays = len(player.grades.filter(Grade.grade > 0.0).all())
        sum_fg = sum([f_g for day, f_g in self.get_player_fgrades(player)])
        try:
            return sum_fg / ndays
        except ZeroDivisionError:
            return 0.0

    def get_players_by_team(self, team):
        return Player.query.filter_by(team=team.upper()[:3]).all()

    def get_avg_players(self, iterable):
        return [(pl.name, pl.team, self.get_avg_player(pl)) \
             for pl in iterable]
        

    def _get_best_avg(self, iterable):
        # from operator import itemgetter  # faster
        # max(list, key=itemgetter(1))
        result= [(pl.code, self.get_avg_player(pl)) \
             for pl in iterable]
        return max(result, key=lambda item: item[1])

    def get_best_player(self):
        code, grade = self._get_best_avg(Player.query.all())
        return self.get_player_by_code(code), grade

    def get_best_team_player(self, team):
        players = Player.query.filter_by(team=team.upper()[:3])
        try:
            code, grade = self._get_best_avg(players)
            return self.get_player_by_code(code), grade
        except ValueError:
            print "Error: team '%s' does not exist!" % team
            print "try one of {}".format([t[0] for t in
                    db.session.query(Player.team).distinct().all()])

    def get_best_role_player(self, role):
        lmin, lmax = 0, 0
        if role.lower() == 'portiere':
            lmin, lmax = 100, 200
        elif role.lower() == 'difensore':
            lmin, lmax = 200, 500
        elif role.lower() == 'centrocampista':
            lmin, lmax = 500, 800
        elif role.lower() == 'attaccante':
            lmin, lmax = 800, 1000
        else:
            print "role must be: 'portiere' or 'difensore'"
            print "or 'centrocampista' or 'attaccante'"
            return None

        players = Player.query.filter(Player.code > lmin).filter(
                  Player.code < lmax).all()        
        code, grade = self._get_best_avg(players)
        return self.get_player_by_code(code), grade

    def get_players_name_starts_with(self, string):
        return Player.query.filter(
            Player.name.startswith(string.upper())).all()

in fondo al file model.py, per comodità di debug, inseriamo il seguente codice:

if __name__ == '__main__':
    m = Model()
    if m._database_exist():
        print "database exists"
    else:
        print "create new database..."
        db.create_all()

eseguito il software la prima volta, verrà creato il database, la seconda volta,
tramite il metodo _database_exist() faremo un controllo di presenza del file ‘stat.db’.
Se presente, non verrà calpestato da una nuova creazione.

con il metodo _delete_database(self), è possibile cancellare tutto.

quindi, sempre da console:

>>> m._delete_database()

Questo non si dovrebbe fare (l’underscore nel prefisso del metodo parla chiaro), ma siamo
in debug…
Quando faremo la UI nel modulo view, rimarrà tutto più nascosto.

Per proseguire, dobbiamo importare i file dei voti (metodo _import_file(path)).
Ne basta uno, ma sarebbe meglio importare più file.

ad es.

>>> m._import_file('MCC01.txt')

una volta che il database è riempito, il modo di utilizzo viene da sè.
Esempio, voglio sapere il giocatore con la media più alta del campionato?

>>> m.get_best_player()
(<Player u'VIDAL'>, 12.5)
>>> 

Voglio sapere il miglior giocatore di un determinato ruolo?

>>> m.get_best_role_player('a')
role must be: 'portiere' or 'difensore'
or 'centrocampista' or 'attaccante'
>>> m.get_best_role_player('attaccante')
(<Player u'ROSSI G.'>, 11.166666666666666)
>>> 

oppure il miglior giocatore di una squadra?

>>> m.get_best_team_player('inter')
(<Player u'ICARDI'>, 10.0)
>>> 

se volessi la rosa dell’Inter?

>>> m.get_players_by_team('inter')
[<Player u'CARRIZO'>, <Player u'CASTELLAZZI'>, <Player u'HANDANOVIC'>,
 <Player u'ANDREOLLI'>, <Player u'CAMPAGNARO'>, <Player u'CHIVU'>,
 <Player u'JONATHAN'>, <Player u'JUAN JESUS'>, <Player u'NAGATOMO'>,
 <Player u'PEREIRA A.'>, <Player u'RANOCCHIA'>, <Player u'SAMUEL'>,
 <Player u'ROLANDO'>, <Player u'WALLACE'>, <Player u'ALVAREZ R.'>,
 <Player u'CAMBIASSO'>, <Player u'GUARIN'>, <Player u'KOVACIC'>,
 <Player u'KUZMANOVIC'>, <Player u'MUDINGAYI'>, <Player u'OBI'>,
 <Player u'TAIDER'>, <Player u'ZANETTI'>, <Player u'OLSEN'>,
 <Player u'MARIGA'>, <Player u'BELFODIL'>, <Player u'ICARDI'>,
 <Player u'MILITO'>, <Player u'PALACIO'>]
>>> 

se poi vuoi anche vedere la media di costoro,mandi la lista al prossimo metodo:

>>> inter = m.get_players_by_team('inter')
>>> m.get_avg_players(inter)
[(u'CARRIZO', u'INT', 0.0), (u'CASTELLAZZI', u'INT', 0.0),
 (u'HANDANOVIC', u'INT', 6.333333333333333),
 (u'ANDREOLLI', u'INT', 0.0), (u'CAMPAGNARO', u'INT', 7.0),
 (u'CHIVU', u'INT', 0.0), (u'JONATHAN', u'INT', 7.166666666666667),
 (u'JUAN JESUS', u'INT', 6.5), (u'NAGATOMO', u'INT', 8.5),
 (u'PEREIRA A.', u'INT', 0.0), (u'RANOCCHIA', u'INT', 6.333333333333333),
 (u'SAMUEL', u'INT', 0.0), (u'ROLANDO', u'INT', 0.0), (u'WALLACE', u'INT', 0.0),
 (u'ALVAREZ R.', u'INT', 9.333333333333334), (u'CAMBIASSO', u'INT', 6.0),
 (u'GUARIN', u'INT', 5.833333333333333), (u'KOVACIC', u'INT', 5.0),
 (u'KUZMANOVIC', u'INT', 0.0), (u'MUDINGAYI', u'INT', 0.0), (u'OBI', u'INT', 0.0),
 (u'TAIDER', u'INT', 6.166666666666667), (u'ZANETTI', u'INT', 0.0),
 (u'OLSEN', u'INT', 0.0), (u'MARIGA', u'INT', 0.0), (u'BELFODIL', u'INT', 6.0),
 (u'ICARDI', u'INT', 10.0), (u'MILITO', u'INT', 0.0),
 (u'PALACIO', u'INT', 9.833333333333334)]
>>> 

se volessi analizzare un giocatore?

>>> palacio = m.get_player_by_name('palacio')
>>> palacio
<Player u'PALACIO'>
>>> palacio.grades
<sqlalchemy.orm.dynamic.AppenderBaseQuery object at 0x01A22C10>
>>> palacio.grades.all()
[<Grade day 1: <Player u'PALACIO'>>, <Grade day 2: <Player u'PALACIO'>>, <Grade day 3: <Player u'PALACIO'>>]
>>> for v in palacio.grades.all():
	print v.day, v.f_grade

	
1 11.5
2 11.5
3 6.5
>>> m.get_avg_player(palacio)
9.833333333333334
>>> 

e se non conoscessi bene il nome?
come si scrive il nome dello slavo del genoa?

>>> m.get_players_name_starts_with('vr')
[<Player u'VRSALJKO'>]

bo’, non resta che creare una UI per rendere più facili, lettura ed utilizzo di
questa app.
Alla prossima.

link utili:
flask-sqlalchemy
model.py
view.py

Categorie:Fantacalcio, FantaLega, python Tag:

Python: FantaStat 1.1 Light

15 Dicembre 2011 Commenti chiusi

Nuova versione FantaStat2.0

Si sta avvicinando il mercato di riparazione, quindi ho creato un piccolo tool con Python, per tutti i FantaAllenatori, che non vogliono arrivare impreparati all’asta invernale.

download:
eseguibile win
sorgenti python

Funziona come i fratelli maggiori FantaManager Full e
FantaManager Light, cioè si importano i file MCCxx.txt,
e si consultano le varie medie voto, gol total/bancaldo.wordpress.com/2011/08/05/lista-calciatori-gazzetta-2011-2012/”>file MCCxx.txt,
e si consultano le varie medie voto, gol totali, presenze,
di ogni singolo giocatore.

L’interfaccia è semplicissima (utilizzate le solite wx):


un bottone per importare il file MCC, un bottone per uscire,
una list-control per visualizzare i dati del database ed
un radiobox per visualizzare i calciatori, per ruolo.
Le colonne della list-control, ordinano in modo di, presenze,
di ogni singolo giocatore.

L’interfaccia è semplicissima (utilizzate le solite wx):


un bottone per importare il file MCC, un bottone per uscire,
una list-control per visualizzare i dati del database ed
un radiobox per visualizzare i calciatori, per ruolo.
Le colonne della list-control, ordinano in modo decrescente i
dati, eccetto nome e squadra (che francamente non incidono
sulla qualità della ricerca)

Il database è generato e gestito con Sqlite e SqlAlchemy.
Gli oggetti riferiti al db ed sqla (tabelle, campi ecc) sono definiti
in non-declarative perchè mi piace semplificare il porting su web con
Pylons (ho trovato difficoltà quando ho definito gli oggetti in
declarative)

Come sempre, ho cercato di utilizzare il pattern MVC,
spero riducendo al minimo gli errori di stile.

NOTA:
Ricordarsi di posizionare le dirs /images e /giornate
dove si troverà l’eseguibile o i sorgenti.

Qui i codici (sicuramente migliorabili):

Model:

# -*- coding: utf-8 -*-#
# DataLight.py
'''MODEL Module for FantaStat Application:
Database engine: provided by Sqlite
Database O.R.M: provided by SqlAlchemy (no_declarative)
All data for fantapython manage are contained here.
All the O.R.M. operation on data are defined here as
Model-Class methods.
''' 

from sqlalchemy import create_engine, Column, Integer, Float
from sqlalchemy import ForeignKey, Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import aliased
from sqlalchemy.orm import sessionmaker
from sqlalchemy import orm, func, desc, asc
from sqlalchemy import MetaData
from sqlalchemy.types import Unicode

class Giocatore(object):
    '''class for sqla mapper'''
    pass

class Voto(object):
    '''class for sqla mapper'''
    pass

class Model(object): 
    '''Model class with common application data'''
    
    base = declarative_base()
    engine = create_engine('sqlite:///fantastat.db', echo = False)
    metadata = MetaData()
    
    giocatore_table = Table('giocatori', metadata,
        Column('id', Integer(), primary_key=True),
        Column('idgaz', Integer()),
        Column('nome', Unicode(255)),
        Column('squadra', Unicode(255)),
        Column('valore', Integer()),
        Column('ruolo', Unicode(255)),
    )
    
    voto_table = Table('voti', metadata,
        Column('id', Integer(), primary_key=True),
        Column('voto', Float()),
        Column('gg_', Integer()),
        Column('val', Integer()),
        Column('gol_fatti', Integer()),
        Column('pres', Integer()),
        Column('gol_sub', Integer()),
        Column('assist', Integer()),
        Column('ammo', Integer()),
        Column('esp', Integer()),
        Column('rig_tir', Integer()),
        Column('rig_ok', Integer()),
        Column('rig_no', Integer()),
        Column('voto_s', Float()),
    )
    
    # M2M relation
    giocatori_voti_table = Table('giocatori_voti', metadata,
        Column('giocatori_id', Integer, ForeignKey('giocatori.id')),
        Column('voti_id', Integer, ForeignKey('voti.id')),
    )

    # Map SQLAlchemy table definitions to python classes
    orm.mapper(Giocatore, giocatore_table, properties={
        'voti':orm.relation(Voto, secondary = giocatori_voti_table),})
    
    orm.mapper(Voto, voto_table, properties={
        'giocatori':orm.relation(Giocatore, secondary = giocatori_voti_table),})
    
    def __init__(self):
        
        Model.metadata.create_all(Model.engine)
        session = sessionmaker(bind = Model.engine)
        self.session = session()
        self.ruoli = ['portiere', 'difensore', 'ccampista', 'attaccante']
        self.value_state, self.val_right_state = 'asc', 'asc'
        self.name_state, self.name_right_state = 'asc', 'asc'
        self.player_to_change = None
        self.team_a, self.ruolo = '', ''
        self.cols = {0: Giocatore.nome, 1: Giocatore.squadra,
                     2: Voto.voto, 3: Voto.pres,
                     4: (Voto.gol_fatti + Voto.rig_ok),
                     5: Voto.gol_sub, 6: Voto.assist, 7: Voto.ammo,
                     8: Voto.esp, 9: Voto.rig_tir, 10: Voto.rig_no,
                     11: Giocatore.valore}
        
    def get_data_players(self, ruolo, item = Voto.voto):
        '''get the avg of vote and all total data by role'''
        query = self.session.query(Giocatore).filter(
                            Giocatore.ruolo == ruolo).subquery()
        adalias = aliased(Giocatore, query)

        query_p = self.session.query(adalias.nome, adalias.idgaz,
                          func.avg(Voto.voto),
                          func.sum(Voto.pres),
                          func.sum(Voto.gol_fatti+Voto.rig_ok),
                          func.sum(Voto.gol_sub),
                          func.sum(Voto.assist),
                          func.sum(Voto.ammo),
                          func.sum(Voto.esp),
                          func.sum(Voto.rig_tir),
                          func.sum(Voto.rig_no),
                          adalias.valore,
                          adalias.squadra).join( # &lt; JOIN
                            adalias, Voto.giocatori).filter(Voto.pres &gt; 0)
                            .group_by(adalias).order_by( # &lt; GROUP &amp; SORT
                                    asc(func.avg(item))).all()
        return query_p

    def get_players_sort_name(self, ruolo):
        '''Get all available goalkeeper'''
        if self.name_state == 'asc':
            query = self.session.query(Giocatore).filter(
                                        Giocatore.ruolo == '%s' % ruolo
                                        ).order_by(desc(Giocatore.idgaz)).all()
        else:
            query = self.session.query(Giocatore).filter(
                                          Giocatore.ruolo == '%s' % ruolo
                                          ).order_by((Giocatore.idgaz)).all()
        return query

    def get_inserted_days(self): # for checking days
        '''get inserted votes-days for import-votes checking'''
        ggs = [item[0] for item in self.session.query(func.distinct(Voto.gg_)).all()]
        return ggs

    def get_player_by_idgaz(self, idgaz):
        '''Get the player by idgaz'''
        player = self.session.query(Giocatore).filter(
                                    Giocatore.idgaz == idgaz).first()
        return player

    def do_players_exist(self): # check at the first time
        '''Return True if players are already imported'''
        if self.session.query(Giocatore).count() != 0:
            print &quot;Gazzetta players present in database&quot;
            return True
        else:
            print &quot;Gazzetta players must be imported first!&quot;
            return False 
        
    def import_new_player(self, idgaz, nome, squadra, valore, ruolo):
        '''Add new player on &quot;giocatori&quot; table'''
        player = Giocatore()
        player.idgaz = idgaz
        player.nome = nome
        player.squadra = squadra
        player.valore = valore
        player.ruolo = ruolo
        self.session.add(player)
        
    def upload_votes(self, item):
        '''Save the data-tuble of votes file into database'''
        print &quot;UPLOAD&quot;, item
        rig_ok = int(item[10]) - int(item[11])
        voto = Voto()
        voto.voto = item[1]
        voto.gg_ = item[2]
        voto.val = item[3]
        voto.gol_fatti = item[4]
        voto.pres = item[5]
        voto.gol_sub = item[6]
        voto.assist = item[7]
        voto.ammo = item[8]
        voto.esp = item[9]
        voto.rig_tir = item[10]
        voto.rig_ok = rig_ok
        voto.rig_no = item[11]
        voto.voto_s = item[12]
        self.session.add(voto)
        #m2m append
        voto.giocatori.append(self.get_player_by_idgaz(item[0])) # pylint: disable=E1101,C0301
        return True

    def total_commit(self):
        '''external commit to use outside loop'''
        self.session.commit()

    def update_player_by_idgaz(self, idgaz, nome, squadra, valore, ruolo):
        '''Get the player by idgaz'''
        player = self.session.query(Giocatore).filter(
                                    Giocatore.idgaz == idgaz).first()
        player.idgaz = idgaz
        player.nome = nome
        player.squadra = squadra
        player.valore = int(valore)
        player.ruolo = ruolo
        
    def get_data_players_by_value(self, ruolo, jolly):
        '''generic query that uses subquery, alias and join function:
        return the sum of a Giocatore.value itering the votes, by idgaz'''
        query = self.session.query(Giocatore).filter(
                            Giocatore.ruolo == ruolo).subquery()
        adalias = aliased(Giocatore, query)
        query_p = self.session.query(adalias.nome, adalias.idgaz,
                          func.avg(Voto.voto),
                          func.sum(Voto.pres),
                          func.sum(Voto.gol_fatti+Voto.rig_ok),
                          func.sum(Voto.gol_sub),
                          func.sum(Voto.assist),
                          func.sum(Voto.ammo),
                          func.sum(Voto.esp),
                          func.sum(Voto.rig_tir),
                          func.sum(Voto.rig_no),
                          adalias.valore,
                          adalias.squadra).join( # &lt; JOIN
                            adalias, Voto.giocatori).filter(Voto.pres &gt; 0)
                            .group_by(adalias).order_by( # &lt; GROUP &amp; SORT
                                    asc(func.sum(jolly))).all()
        return query_p

    def get_data_players_by_valore(self, ruolo):
        '''generic query that uses subquery, alias and join function:
        return all total data player sorted by value'''
        query = self.session.query(Giocatore).filter(
                            Giocatore.ruolo == ruolo).subquery()
        adalias = aliased(Giocatore, query)
        query_p = self.session.query(adalias.nome, adalias.idgaz,
                          func.avg(Voto.voto),
                          func.sum(Voto.pres),
                          func.sum(Voto.gol_fatti+Voto.rig_ok),
                          func.sum(Voto.gol_sub),
                          func.sum(Voto.assist),
                          func.sum(Voto.ammo),
                          func.sum(Voto.esp),
                          func.sum(Voto.rig_tir),
                          func.sum(Voto.rig_no),
                          adalias.valore,
                          adalias.squadra).join( # &lt; JOIN
                            adalias, Voto.giocatori).filter(Voto.pres &gt; 0)
                            .group_by(adalias).order_by( # &lt; GROUP &amp; SORT
                                    asc(adalias.valore)).all()
        return query_p

def main():
    '''test starter'''
    mod = Model()


if __name__ == '__main__':
    main()

Qui il codice relativo al View:

# -*- coding: utf-8 -*-#
# ViewLight.py
'''VIEW Module for FantaPython Application:
Graphic library: provided by wx
All the frames and their children widgets,
are defined here.
Binding are defined under CONTROLLER Module.
Every Frame as a panel child and every widgets
have panel as first parent.
''' 


import wx
import os

from wx import html as wxhtml
from wx.lib.buttons import GenBitmapTextButton

class FrameVotiPlayers(wx.Frame):
    '''Frame for votes consulting'''
    def __init__(self, *args, **kwargs):
        ruoli = ['portiere', 'difensore', 'ccampista', 'attaccante']
        wx.Frame.__init__(self, *args, **kwargs)
        self.panel = wx.Panel(self, -1)
        self.panel.SetBackgroundColour('Pink')
        self.btn_import = GenBitmapTextButton(self.panel, wx.ID_NEW,
                                            wx.Bitmap('images\import_tr.png'),
                                            'Import players/votes'.rjust(30),
                                            size = (350, 40), pos = (5, 425))
        self.btn_exit = GenBitmapTextButton(self.panel, wx.ID_ANY,
                                            wx.Bitmap('images\quit.png'),
                                            'Exit'.rjust(30), size = (335, 40),
                                            pos = (355, 425))
        self.rboxruoli = wx.RadioBox(self.panel, wx.ID_ANY, &quot;ruoli&quot;, (100, 100),
                                     wx.DefaultSize, ruoli, 4,
                                     wx.RA_SPECIFY_COLS)
        self.rboxruoli.Enable()
        self.listdati = wx.ListCtrl(self.panel, wx.NewId(), size = (690, 350),
                                  style = wx.LC_REPORT | wx.LC_HRULES |
                                  wx.LC_VRULES)
        self.listdati.Show(True)
        self.listdati.InsertColumn(0, &quot;nome&quot;, wx.LIST_AUTOSIZE, 140)
        self.listdati.InsertColumn(1, &quot;sq&quot;, wx.LIST_FORMAT_CENTER, 70)
        self.listdati.InsertColumn(2, &quot;mv&quot;, wx.LIST_FORMAT_CENTER, 70)
        self.listdati.InsertColumn(3, &quot;pr&quot;, wx.LIST_FORMAT_CENTER, 40)
        self.listdati.InsertColumn(4, &quot;gf&quot;, wx.LIST_FORMAT_CENTER, 40)
        self.listdati.InsertColumn(5, &quot;gs&quot;, wx.LIST_FORMAT_CENTER, 40)
        self.listdati.InsertColumn(6, &quot;ass&quot;, wx.LIST_FORMAT_CENTER, 40)
        self.listdati.InsertColumn(7, &quot;amm&quot;, wx.LIST_FORMAT_CENTER, 50)
        self.listdati.InsertColumn(8, &quot;esp&quot;, wx.LIST_FORMAT_CENTER, 40)
        self.listdati.InsertColumn(9, &quot;rt&quot;, wx.LIST_FORMAT_CENTER, 40)
        self.listdati.InsertColumn(10, &quot;rs&quot;, wx.LIST_FORMAT_CENTER, 40)
        self.listdati.InsertColumn(11, &quot;$&quot;, wx.LIST_FORMAT_CENTER, 35)

        # sizerize
        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(self.rboxruoli, 0, wx.CENTER, 5)
        vbox.Add(wx.StaticLine(self.panel,), 0, wx.ALL|wx.EXPAND, 5)
        vbox.Add(self.listdati, 0, wx.ALL|wx.CENTER, 5)
        vbox.Add(wx.StaticLine(self.panel,), 0, wx.ALL|wx.EXPAND, 5)

        self.panel.SetSizer(vbox)
        self.Centre()
        self.Show()

class InfoMessage(wx.MessageDialog):
    '''Simple message Dialog'''
    def __init__(self, parent, message):
        wx.MessageDialog.__init__(self, parent, message, 'core info', wx.OK |
                                  wx.ICON_EXCLAMATION)
    def get_choice(self):
        '''get the state of the user choice'''
        if self.ShowModal() == wx.ID_OK:
            self.Destroy()

class ChoiceMessage(wx.MessageDialog):
    '''Simple choice message Dialog'''
    def __init__(self, parent, message):
        wx.MessageDialog.__init__(self, parent, message, 'Core question',
                                  wx.YES_NO | wx.ICON_QUESTION)
    def get_yes(self):
        '''get True if YES is clicked'''
        if self.ShowModal() == wx.ID_YES:
            return True
        else:
            self.Destroy()

class EntryDialog(wx.TextEntryDialog):            
    '''Simple Text Entry Dialog'''
    def __init__(self, parent, msg, value):
        wx.TextEntryDialog.__init__(self, parent, msg, 'Core request',
                                    defaultValue = value, style = wx.OK)
    def get_choice(self):
        '''get the state of the user choice'''
        if self.ShowModal() == wx.ID_OK:
            response = self.GetValue()
            self.Destroy()
            return response

class FileBrowser(wx.FileDialog):
    '''Class for file browser'''
    def __init__(self):
        self.fin = None
        wildcard = &quot;File Gazzetta (*.txt)|*.txt|&quot; 
            &quot;Tutti i files (*.*)|*.*&quot;
        wx.FileDialog.__init__(self, None, &quot;scegli il file&quot;, os.getcwd(),
                               &quot;&quot;, wildcard, wx.OPEN)
        if self.ShowModal() == wx.ID_OK:  
            print(self.GetPath())
            self.file = self.GetPath()
            self.fin = open(self.file, 'r')
        else:
            print &quot;operazione apertura annullata&quot;
            self.file = None
            self.Destroy()
        self.Destroy()
def main():
    '''app starter'''
    app = wx.PySimpleApp()
    FrameVotiPlayers(None, wx.ID_NEW, &quot;FantaStat 1.1 light&quot;, size = (700, 500))
    app.MainLoop()

if __name__ == '__main__':
    main()

infine il codice relativo al COntroller:

# -*- coding: utf-8 -*-#
# ControllerLight.py
'''FantaStat v 1.1 Light
Controller Module for FantaStat Application:
Application pattern:
MODEL | VIEW | CONTROLLER
MODEL Module COntains all data for database querying
VIEW Module Contains all GUI for viewing all database data
CONTROLLER Module contains app logic.
All the binding method to frame widget are defined here''' 

import wx

from DataLight import Model
from ProgressBar import BarController
from ViewLight import FrameVotiPlayers, InfoMessage, ChoiceMessage, FileBrowser

class Controller(object):
    '''Controller class for MVC-like pattern'''
    def __init__(self):
        self.model = Model()
        self.list_voti = []
        self.ctrl = FrameVotiPlayers(None, wx.ID_NEW, &quot;FantaStat 1.1 light&quot;,
                                     size = (700, 500))
        self.ctrl.btn_exit.Bind(wx.EVT_BUTTON, _frame_exit)
        self.ctrl.btn_import.Bind(wx.EVT_BUTTON, self.import_votes)
        self.query = self.model.get_data_players(u'portiere')
        self.fill_list(self.query)
        self.ctrl.rboxruoli.Bind(wx.EVT_RADIOBOX, self.on_roles)
        self.ctrl.listdati.Bind(wx.EVT_LIST_COL_CLICK, self.on_list_column)

    def upload_players(self, file_in):
        '''upload/upgrade players in db via model'''
        def get_flag_role(idg):
            &quot;&quot;&quot;get the role, by idgaz&quot;&quot;&quot;
            if idg &lt; 200:
                role = 'portiere'
            elif idg &gt; 200 and idg &lt; 500:
                role = 'difensore'
            elif idg &gt; 500 and idg &lt; 800:
                role = 'ccampista'
            else:
                role = 'attaccante'
            return role

        if file_in != None:
            record = len(file_in.readlines()) #progress bar param
            barc = BarController(record)
            file_in.seek(0)
            for line in file_in.readlines():
                val = line.split('|')
                try:
                    idr = int(val[0])
                except ValueError:
                    idr = int(val[0].replace('xefxbbxbf', ''))
                
                role = get_flag_role(idr)
                nomev = val[2].decode('utf-8').replace('&quot;', '')
                squadrav = val[3].replace('&quot;', '')
                play_in = self.model.get_player_by_idgaz(idr)
                if play_in == None:
                    print &quot; &lt;&lt;&lt;&lt; assente giocatore con idgaz = &quot;, idr
                    self.model.import_new_player(idr, nomev, squadrav,
                                                 int(val[27].rstrip()), role)
                else:
                    print &quot; ++++ aggiorno giocatore con idgaz = &quot;, idr
                    self.model.update_player_by_idgaz(idr, nomev,
                                        squadrav, int(val[27]), role)
                barc.update_progress_bar()
            self.model.session.commit()
            barc.destroy_progress_bar()
            print &quot;core&gt; dati inseriti con successo&quot;
        else:
            print &quot;core&gt; Nessun dato da salvare&quot;
    
    def import_votes(self, evt):
        '''Import Votes from Gazzetta.com'''
        parent = evt.GetEventObject().GetParent().GetParent()
        ggs = self.model.get_inserted_days()
        mes = &quot;Inserire i voti nel database?&quot;
        if ChoiceMessage(parent, mes).get_yes() == True:
            fbr = FileBrowser()
            file_in = fbr.fin
            path = fbr.file
            if file_in != None:
                choice = int(path.partition('MCC')[-1].partition('.txt')[0])
                if choice not in ggs:
                    try:
                        self.upload_players(file_in)
                    except ValueError:
                        print &quot;core&gt; Operazione annullata&quot;
                    else:
                        self.list_voti = []
                        file_in.seek(0)
                        for line in file_in:
                            self.list_voti.append((int(line.split(&quot;|&quot;)[0]),
                                                   float(line.split(&quot;|&quot;)[7]),
                                                   int(line.split(&quot;|&quot;)[1]),
                                                   int((line.split(&quot;|&quot;)[27]
                                                        ).rstrip()),
                                                   int(line.split(&quot;|&quot;)[11]),
                                                   int(line.split(&quot;|&quot;)[6]),
                                                   int(line.split(&quot;|&quot;)[12]),
                                                   int(line.split(&quot;|&quot;)[15]),
                                                   int(line.split(&quot;|&quot;)[16]),
                                                   int(line.split(&quot;|&quot;)[17]),
                                                   int(line.split(&quot;|&quot;)[18]),
                                                   int(line.split(&quot;|&quot;)[21]),
                                                   float(line.split(&quot;|&quot;)[10])))
                        file_in.close()
                        print &quot;core&gt; pre RECORD&quot;
                        record = len(self.list_voti)
                        if record &gt; 0:
                            upbar = BarController(record)
                            for item in self.list_voti: 
                                self.model.upload_votes(item)
                                if True:
                                    upbar.update_progress_bar()
                            self.model.total_commit()
                            print &quot;core&gt; Dati Salvati con successo&quot;
                            upbar.destroy_progress_bar()
                            role = self.ctrl.rboxruoli.GetStringSelection()
                            self.ctrl.listdati.DeleteAllItems()
                            self.fill_list(self.model.get_data_players(role))
                else:
                    mes = &quot;errore file. Giornata gia' inserita!&quot;
                    InfoMessage(parent, mes).get_choice()
        else:
            print &quot;core&gt; nessun dato da salvare&quot;
    
    def fill_list(self, sqla_query):
        '''Fill the ListControl with stats data from db'''
        self.ctrl.listdati.DeleteAllItems()
        for player in sqla_query:
            nome = player[0]
            row = self.ctrl.listdati.InsertStringItem(0, nome)#ROW
            sq = player[12]
            self.ctrl.listdati.SetStringItem(row, 1, str(sq)) #1st C
            m_v = player[2]
            self.ctrl.listdati.SetStringItem(row, 2, str(&quot;%.3f&quot; % m_v))
            pres = player[3]
            self.ctrl.listdati.SetStringItem(row, 3, str(pres)) 
            g_f = player[4]
            self.ctrl.listdati.SetStringItem(row, 4, str(g_f))
            g_s = player[5]
            self.ctrl.listdati.SetStringItem(row, 5, str(g_s))
            ass = player[6]
            self.ctrl.listdati.SetStringItem(row, 6, str(ass))
            ammo = player[7]
            self.ctrl.listdati.SetStringItem(row, 7, str(ammo))
            esp = player[8]
            self.ctrl.listdati.SetStringItem(row, 8, str(esp))
            r_t = player[9]
            self.ctrl.listdati.SetStringItem(row, 9, str(r_t))
            r_s = player[10]
            self.ctrl.listdati.SetStringItem(row, 10, str(r_s))
            val = player[11]
            self.ctrl.listdati.SetStringItem(row, 11, str(val))

    def on_list_column(self, evt):
        '''get the column header for sorting database data'''
        header = evt.GetColumn()
        ruolo = self.ctrl.rboxruoli.GetStringSelection()
        if 2 &lt; header &lt; 11:
            jolly = self.model.cols[header]
            self.ctrl.listdati.DeleteAllItems()
            self.fill_list(self.model.get_data_players_by_value(ruolo, jolly))
        elif header == 2:
            jolly = self.model.cols[header]
            self.ctrl.listdati.DeleteAllItems()
            self.fill_list(self.model.get_data_players(ruolo, jolly))
        elif header == 11:
            self.ctrl.listdati.DeleteAllItems()
            self.fill_list(self.model.get_data_players_by_valore(ruolo))
        
    def on_roles(self, evt):
        '''radio box &quot;Ruolo&quot; event handler'''
        role = evt.GetEventObject().GetStringSelection()
        players = self.model.get_data_players(role)
        self.ctrl.listdati.DeleteAllItems()
        self.fill_list(players)

def _frame_exit(evt):
    '''exit from frame'''
    frame = evt.GetEventObject().GetParent().GetParent()
    frame.Close()

def main():
    '''starter'''
    app = wx.PySimpleApp()
    Controller()
    app.MainLoop()
    
if __name__ == '__main__':
    main()

Ultimo oggetto estraneo al FantaStat, è la ControlBar delle importazioni:

# ProgressBar.py
'''Module containing a Progress Bar class'''

import wx

class Data(object):
    '''Data class for M-V-C pattern'''
    def __init__(self):
        self.count = 0
        self.max_v = 0
    def add_count (self):
        '''increase the progress bar count for showing its progress'''
        self.count += 1
    def get_max(self):
        '''Get the max value of the progress bar'''
        return self.max_v
    def get_count(self):
        '''Get the current count value of the progressbar in the loop'''
        return self.count
    def set_max(self, value):
        '''set the max value of the progress bar'''
        self.max_v = int(value)

class ProgressBar(wx.ProgressDialog):
    '''Progress Dialog constructor'''
    def __init__(self, max_v):
        wx.ProgressDialog.__init__(self, &quot;&quot;, &quot;Update...&quot;, max_v,
                                   style = wx.PD_AUTO_HIDE |
                                   wx.PD_ELAPSED_TIME |
                                   wx.PD_REMAINING_TIME)
    def progress(self, progress):
        '''update the progress bar during the loops'''
        wx.MicroSleep(1) #for short processes use wx.MilliSleep(1)
        self.Update(progress)
    def destroy(self):
        '''Distruttore della progress bar'''
        self.Destroy()

class BarController(object):
    '''Progress Bar Controller Constructor'''
    def __init__(self, value = 3):
        self.data = Data()
        self.data.set_max(value)
        self.max = self.data.get_max()
        self.count = self.data.get_count()
        self.progress_bar = ProgressBar(self.max)
    def update_progress_bar(self):
        '''Aggiorna la progressBar'''
        self.data.add_count()
        self.count = self.data.get_count()
        self.progress_bar.progress(self.count) # update progressbar
    def destroy_progress_bar(self):
        '''Destroy the wx.ProgressDialog instance'''
        self.progress_bar.destroy()

def main():
    '''app starter'''
    app = wx.PySimpleApp()
    bar_c = BarController(600)
    while bar_c.count &lt; bar_c.max:
        bar_c.update_progress_bar()
    bar_c.destroy_progress_bar()
    app.MainLoop()
    
if __name__ == &quot;__main__&quot;:
    main()

Nella versione 1.2 implementerò l’ordinamento decrescente per colonna E per media_voto,
in modo da ordinare i giocatori di pari valore (es presenze), mettendo prima quello
con la media voto maggiore.

…continua

Statistiche calciatori 2011-2012

28 Settembre 2011 Commenti chiusi

Aggiornato 28 ottobre 2011
Statistiche Calciatori 2011-2012

Portieri Squadra p p% mFv gS
ABBIATI mil 8 100.00 4.19 12
AGAZZI cag 8 100.00 5.44 6
AGLIARDI bol 4 50.00 4.63 6
AMELIA mil 0 0.00 0.00 0
ANDUJAR cat 8 100.00 4.63 11
ANTONIOLI ces 3 37.50 5.17 3
AVRAMOV cag 0 0.00 0.00 0
BELARDI udi 0 0.00 0.00 0
BENASSI lec 3 37.50 3.67 6
BENUSSI pal 0 0.00 0.00 0
BERARDI laz 0 0.00 0.00 0
BIZZARRI laz 1 12.50 4.00 2
BORUC fio 8 100.00 5.13 8
BRKIC sie 7 87.50 5.50 4
BUFFON juv 6 75.00 5.58 3
CAMPAGNOLO cat 0 0.00 0.00 0
CASTELLAZZI int 2 25.00 7.00 2
COLETTA chi 0 0.00 0.00 0
COLOMBO nap 0 0.00 0.00 0
CONSIGLI ata 8 100.00 5.06 9
COSER nov 0 0.00 0.00 0
CURCI rom 0 0.00 0.00 0
DE SANCTIS nap 8 100.00 5.88 5
FARELLI sie 0 0.00 0.00 0
FONTANA nov 3 37.50 3.83 6
FREY S. gen 8 100.00 5.31 11
FREZZOLINI ata 1 12.50 6.00 0
GALLINETTA par 0 0.00 0.00 0
GILLET bol 5 62.50 5.10 6
HANDANOVIC udi 8 100.00 6.00 3
JULIO CESAR int 7 87.50 4.64 12
JULIO SERGIO lec 5 62.50 3.80 9
KOPRIVEC udi 0 0.00 0.00 0
KOSICKY cat 0 0.00 0.00 0
LOBONT rom 3 37.50 5.50 1
LUPATELLI gen 0 0.00 0.00 0
MANNINGER juv 0 0.00 0.00 0
MARCHETTI laz 7 87.50 5.50 6
MIRANTE par 8 100.00 3.75 17
NETO fio 0 0.00 0.00 0
ORLANDONI int 0 0.00 0.00 0
PAVARINI par 0 0.00 0.00 0
PEGOLO sie 0 0.00 0.00 0
PETRACHI lec 0 0.00 0.00 0
PUGGIONI chi 0 0.00 0.00 0
RAVAGLIA ces 5 62.50 4.70 7
ROMA mil 0 0.00 0.00 0
ROSATI nap 0 0.00 0.00 0
RUBINHO pal 0 0.00 0.00 0
SCARPI gen 0 0.00 0.00 0
SIMONCINI ces 0 0.00 0.00 0
SORRENTINO chi 8 100.00 5.63 7
SQUIZZI chi 0 0.00 0.00 0
STEKELENBURG rom 5 62.50 4.90 6
STORARI juv 2 25.00 4.75 3
TZORVAS pal 8 100.00 4.69 10
UJKANI nov 6 75.00 4.58 10
VIGORITO cag 0 0.00 0.00 0
PADELLI udi 0 0.00 0.00 0
PAZZAGLI fio 0 0.00 0.00 0
VIVIANO gen 0 0.00 0.00 0
difensore Squadra p p% mFv gF ass am esp rT rOk rNo
ABATE mil 7 87.50 6.29 0 1 1 0 0 0 0
ACERBI chi 0 0.00 0.00 0 0 0 0 0 0 0
AGOSTINI cag 8 100.00 6.00 0 0 0 0 0 0 0
AGUIRREGARAY pal 1 12.50 6.00 0 0 0 0 0 0 0
ALVAREZ P.S. cat 2 25.00 5.75 0 0 1 0 0 0 0
ANDREOLLI chi 1 12.50 5.00 0 0 0 0 0 0 0
ANGELLA sie 0 0.00 0.00 0 0 0 0 0 0 0
ANGELO sie 3 37.50 6.00 0 0 0 0 0 0 0
ANTONELLI gen 7 87.50 5.71 0 0 0 0 0 0 0
ANTONINI mil 5 62.50 5.50 0 0 1 0 0 0 0
ANTONSSON bol 2 25.00 5.75 0 0 0 0 0 0 0
ARIAUDO cag 2 25.00 6.00 0 0 0 0 0 0 0
ARONICA nap 8 100.00 5.88 0 0 0 0 0 0 0
ASTORI cag 7 87.50 6.07 0 0 1 0 0 0 0
AUGUSTYN cat 0 0.00 0.00 0 0 0 0 0 0 0
BALZARETTI pal 7 87.50 5.71 0 0 2 1 0 0 0
BARZAGLI juv 8 100.00 6.69 0 0 0 0 0 0 0
BASTA udi 6 75.00 7.00 1 0 0 0 0 0 0
BELLINI ata 4 50.00 6.00 0 1 1 0 0 0 0
BELLUSCI cat 8 100.00 5.94 0 0 1 0 0 0 0
BELMONTE sie 0 0.00 0.00 0 0 0 0 0 0 0
BENALOUANE ces 1 12.50 3.50 0 0 0 1 0 0 0
BENATIA udi 7 87.50 6.71 1 0 0 0 0 0 0
BIAVA laz 5 62.50 5.80 0 0 1 0 0 0 0
BONERA mil 4 50.00 5.50 0 0 0 0 0 0 0
BONUCCI juv 5 62.50 6.50 1 0 0 0 0 0 0
BOVO gen 5 62.50 5.00 0 0 2 0 0 0 0
BRANDAO par 0 0.00 0.00 0 0 0 0 0 0 0
BRITOS nap 0 0.00 0.00 0 0 0 0 0 0 0
BRIVIO lec 1 12.50 3.50 0 0 1 0 0 0 0
BURDISSO rom 7 87.50 5.93 0 0 1 0 0 0 0
CALDIROLA int 0 0.00 0.00 0 0 0 0 0 0 0
CAMPAGNARO nap 7 87.50 7.29 2 1 0 0 0 0 0
CAMPORESE fio 0 0.00 0.00 0 0 0 0 0 0 0
CANINI cag 8 100.00 5.63 0 0 2 0 0 0 0
CANNAVARO nap 6 75.00 5.92 0 0 1 0 0 0 0
CAPELLI ata 8 100.00 5.81 0 0 3 0 0 0 0
CAPUANO cat 4 50.00 5.38 0 0 1 0 0 0 0
CARROZZIERI lec 1 12.50 4.50 0 0 1 0 0 0 0
CASSANI fio 4 50.00 5.63 0 0 1 0 0 0 0
CASSETTI rom 2 25.00 5.25 0 0 2 0 0 0 0
CAVANDA laz 0 0.00 0.00 0 0 0 0 0 0 0
CECCARELLI L. ces 3 37.50 6.33 0 0 2 0 0 0 0
CENTURIONI nov 2 25.00 5.25 0 0 0 0 0 0 0
CESAR chi 8 100.00 5.44 0 0 3 0 0 0 0
CETTO pal 2 25.00 6.00 0 0 0 0 0 0 0
CHERUBIN bol 3 37.50 5.33 0 0 1 0 0 0 0
CHIELLINI juv 8 100.00 5.69 0 0 2 0 0 0 0
CHIVU int 5 62.50 5.10 0 0 3 0 0 0 0
CICINHO rom 0 0.00 0.00 0 0 0 0 0 0 0
CODA udi 0 0.00 0.00 0 0 0 0 0 0 0
COMOTTO ces 5 62.50 5.70 0 0 2 0 0 0 0
CONTINI sie 1 12.50 5.50 0 0 1 0 0 0 0
CORDOBA int 1 12.50 6.00 0 0 0 0 0 0 0
CRESPO J.A.R. bol 0 0.00 0.00 0 0 0 0 0 0 0
DAINELLI gen 6 75.00 5.58 0 0 2 1 0 0 0
DANILO udi 8 100.00 5.94 0 0 1 0 0 0 0
DE CEGLIE juv 2 25.00 4.50 0 0 0 1 0 0 0
DE SILVESTRI fio 4 50.00 4.88 0 0 0 0 0 0 0
DEL GROSSO sie 5 62.50 5.90 0 0 1 0 0 0 0
DELLAFIORE nov 5 62.50 5.60 0 0 2 0 0 0 0
DIAKITE’ laz 4 50.00 5.63 0 0 0 0 0 0 0
DIAMOUTENE lec 0 0.00 0.00 0 0 0 0 0 0 0
DIAS laz 7 87.50 5.71 0 0 4 0 0 0 0
DOMIZZI udi 6 75.00 7.00 1 0 2 0 0 0 0
DRAME’ chi 0 0.00 0.00 0 0 0 0 0 0 0
EKSTRAND udi 1 12.50 5.50 0 0 1 0 0 0 0
ESPOSITO lec 6 75.00 5.17 0 0 1 1 0 0 0
FATIC chi 0 0.00 0.00 0 0 0 0 0 0 0
FELIPE fio 0 0.00 0.00 0 0 0 0 0 0 0
FELTSCHER par 1 12.50 5.00 0 0 0 0 0 0 0
FERNANDEZ nap 2 25.00 6.25 0 0 0 0 0 0 0
FERRARIO lec 2 25.00 4.25 0 0 1 0 0 0 0
FERRI ata 0 0.00 0.00 0 0 0 0 0 0 0
FERRONETTI udi 3 37.50 5.83 0 0 0 0 0 0 0
FREY N. chi 5 62.50 6.00 0 0 0 0 0 0 0
GAMBERINI fio 8 100.00 5.81 0 0 1 0 0 0 0
GARCIA nov 2 25.00 5.00 0 0 0 0 0 0 0
GARICS bol 1 12.50 6.00 0 0 0 0 0 0 0
GARRIDO laz 0 0.00 0.00 0 0 0 0 0 0 0
GEMITI nov 8 100.00 6.00 1 0 0 0 0 0 0
GIGLIOTTI nov 0 0.00 0.00 0 0 0 0 0 0 0
GOBBI par 6 75.00 6.42 1 1 0 0 0 0 0
GOZZI cag 0 0.00 0.00 0 0 0 0 0 0 0
GRANQVIST gen 2 25.00 6.00 0 0 0 0 0 0 0
GRAVA nap 0 0.00 0.00 0 0 0 0 0 0 0
GROSSO juv 2 25.00 6.00 0 0 0 0 0 0 0
GRYGERA juv 0 0.00 0.00 0 0 0 0 0 0 0
HEINZE rom 5 62.50 6.10 0 0 0 0 0 0 0
JOKIC chi 8 100.00 5.88 0 0 1 0 0 0 0
JONATHAN int 3 37.50 5.33 0 0 0 0 0 0 0
JOSE ANGEL rom 6 75.00 5.33 0 0 0 1 0 0 0
JUAN rom 1 12.50 6.50 0 0 0 0 0 0 0
KALADZE gen 6 75.00 5.83 0 0 1 1 0 0 0
KONKO laz 8 100.00 5.81 0 0 0 0 0 0 0
KROLDRUP fio 0 0.00 0.00 0 0 0 0 0 0 0
LAURO ces 7 87.50 5.57 0 0 3 0 0 0 0
LEGROTTAGLIE cat 4 50.00 7.00 1 0 0 0 0 0 0
LICHTSTEINER juv 8 100.00 6.63 1 0 1 0 0 0 0
LISUZZO nov 3 37.50 6.50 0 0 0 0 0 0 0
LORIA bol 4 50.00 5.13 0 0 1 0 0 0 0
LUCARELLI A. par 7 87.50 5.57 0 0 3 0 0 0 0
LUCCHINI ata 5 62.50 5.80 0 0 2 0 0 0 0
LUCIO int 8 100.00 5.75 1 0 2 0 0 0 0
LUDI nov 4 50.00 5.75 0 0 0 0 0 0 0
LULIC laz 7 87.50 6.21 1 0 2 0 0 0 0
MAICON int 4 50.00 6.13 0 1 1 0 0 0 0
MANDELLI chi 2 25.00 5.50 0 0 1 0 0 0 0
MANFREDINI ata 5 62.50 6.00 0 0 1 0 0 0 0
MANTOVANI pal 2 25.00 5.50 0 0 0 0 0 0 0
MARCHESE cat 5 62.50 5.90 0 0 1 0 0 0 0
MASIELLO ata 8 100.00 5.81 0 0 3 0 0 0 0
MAZZOTTA lec 0 0.00 0.00 0 0 0 0 0 0 0
MESTO gen 4 50.00 6.38 1 0 1 0 0 0 0
MEXES mil 0 0.00 0.00 0 0 0 0 0 0 0
MILANOVIC sie 0 0.00 0.00 0 0 0 0 0 0 0
MORERO chi 7 87.50 5.86 0 0 2 0 0 0 0
MORETTI E. gen 5 62.50 5.90 0 0 0 0 0 0 0
MORGANELLA nov 3 37.50 5.33 0 0 1 0 0 0 0
MORLEO bol 6 75.00 5.50 0 0 1 1 0 0 0
MOTTA M. juv 0 0.00 0.00 0 0 0 0 0 0 0
MUNOZ pal 0 0.00 0.00 0 0 0 0 0 0 0
NAGATOMO int 8 100.00 5.44 0 0 0 0 0 0 0
NASTASIC fio 1 12.50 6.00 0 0 0 0 0 0 0
NATALI fio 8 100.00 6.00 0 0 2 0 0 0 0
NESTA mil 6 75.00 5.42 0 0 3 0 0 0 0
NEUTON udi 2 25.00 5.00 0 0 0 0 0 0 0
ODDO lec 4 50.00 5.88 0 0 2 0 1 1 0
PACI nov 8 100.00 6.38 1 0 3 0 0 0 0
PALETTA par 8 100.00 5.25 0 0 2 0 0 0 0
PASQUAL fio 8 100.00 5.88 0 1 0 0 0 0 0
PASQUALE udi 2 25.00 6.75 0 1 0 0 0 0 0
PELUSO ata 6 75.00 5.75 0 0 1 0 0 0 0
PERICO cag 1 12.50 4.50 0 0 1 0 0 0 0
PESOLI sie 1 12.50 6.00 0 0 0 0 0 0 0
PISANO E. pal 8 100.00 5.81 0 0 1 0 0 0 0
PISANO F. cag 8 100.00 5.81 0 0 1 0 0 0 0
PORTANOVA bol 8 100.00 5.81 1 0 3 0 0 0 0
POTENZA cat 3 37.50 5.67 0 0 1 0 0 0 0
RADU laz 4 50.00 5.63 0 0 0 0 0 0 0
RAGGI bol 5 62.50 5.50 0 0 1 0 0 0 0
RAIMONDI ata 0 0.00 0.00 0 0 0 0 0 0 0
RANOCCHIA int 2 25.00 4.50 0 0 0 1 0 0 0
RICKLER bol 0 0.00 0.00 0 0 0 0 0 0 0
ROMULO fio 3 37.50 5.83 0 0 0 0 0 0 0
ROSI rom 4 50.00 6.25 0 1 0 0 0 0 0
ROSSETTINI sie 6 75.00 5.75 0 0 4 0 0 0 0
ROSSI A. sie 2 25.00 6.00 0 0 1 0 0 0 0
ROSSI M. ces 4 50.00 5.38 0 0 1 0 0 0 0
RUBIN par 2 25.00 5.00 0 0 0 0 0 0 0
RUIZ nap 0 0.00 0.00 0 0 0 0 0 0 0
SAMUEL int 5 62.50 5.20 0 0 1 0 0 0 0
SANTACROCE par 0 0.00 0.00 0 0 0 0 0 0 0
SANTON int 0 0.00 0.00 0 0 0 0 0 0 0
SARDO chi 5 62.50 5.60 0 1 1 1 0 0 0
SCALONI laz 1 12.50 6.00 0 0 0 0 0 0 0
SILVESTRE pal 8 100.00 6.06 0 0 0 0 0 0 0
SORENSEN juv 0 0.00 0.00 0 0 0 0 0 0 0
SPOLLI cat 7 87.50 5.93 0 0 3 0 0 0 0
STANKEVICIUS laz 3 37.50 5.33 0 0 0 0 0 0 0
STENDARDO laz 0 0.00 0.00 0 0 0 0 0 0 0
TAIWO mil 2 25.00 5.25 0 0 1 0 0 0 0
TERZI sie 7 87.50 5.64 0 0 4 0 0 0 0
THIAGO SILVA mil 7 87.50 6.14 0 0 0 0 0 0 0
TOMOVIC lec 8 100.00 5.38 0 0 2 0 0 0 0
VITALE bol 0 0.00 0.00 0 0 0 0 0 0 0
VITIELLO sie 7 87.50 5.64 0 0 2 0 0 0 0
VON BERGEN ces 8 100.00 5.88 0 0 0 0 0 0 0
YEPES mil 2 25.00 7.25 1 0 1 0 0 0 0
ZACCARDO par 8 100.00 5.75 0 0 2 0 0 0 0
ZAMBROTTA mil 3 37.50 5.33 0 0 1 0 0 0 0
ZAURI laz 1 12.50 5.00 0 0 0 0 0 0 0
ZIEGLER juv 0 0.00 0.00 0 0 0 0 0 0 0
FIDELEFF nap 2 25.00 4.50 0 0 1 0 0 0 0
KJAER rom 3 37.50 5.00 0 0 2 1 0 0 0
RODRIGUEZ G. ces 5 62.50 6.00 0 0 0 0 0 0 0
centrocampista Squadra p p% mFv gF ass am esp rT rOk rNo
ABDI udi 4 50.00 5.88 0 0 1 0 0 0 0
ACQUAH pal 8 100.00 5.88 0 0 3 0 0 0 0
ALMIRON cat 6 75.00 6.42 1 0 1 0 0 0 0
ALVAREZ R. int 3 37.50 5.33 0 0 0 0 0 0 0
AMBROSINI mil 3 37.50 5.33 0 0 0 0 0 0 0
AQUILANI mil 7 87.50 7.00 1 3 0 0 0 0 0
ARMERO udi 6 75.00 6.08 0 1 1 0 0 0 0
ASAMOAH udi 8 100.00 6.06 0 0 2 0 0 0 0
BACINOVIC pal 1 12.50 5.50 0 0 1 0 0 0 0
BADU udi 6 75.00 5.92 0 0 1 0 0 0 0
BARRETO E. pal 8 100.00 6.19 0 1 1 0 0 0 0
BARRIENTOS cat 1 12.50 6.00 0 0 0 0 0 0 0
BEHRAMI fio 8 100.00 6.00 0 0 4 0 0 0 0
BERTOLACCI lec 6 75.00 5.67 0 0 0 0 0 0 0
BIABIANY par 8 100.00 6.38 0 2 2 0 0 0 0
BIAGIANTI cat 3 37.50 5.50 0 0 2 0 0 0 0
BIONDINI cag 8 100.00 6.31 1 0 0 0 0 0 0
BIRSA gen 2 25.00 5.00 0 0 0 1 0 0 0
BLASI par 4 50.00 5.88 0 0 0 0 0 0 0
BOATENG mil 4 50.00 8.38 3 0 1 1 0 0 0
BOGLIACINO nap 0 0.00 0.00 0 0 0 0 0 0 0
BOLZONI sie 2 25.00 5.25 0 0 0 0 0 0 0
BONAVENTURA ata 8 100.00 6.38 0 1 0 0 0 0 0
BRIGHI ata 4 50.00 5.63 0 0 2 0 0 0 0
BROCCHI laz 7 87.50 6.36 0 1 1 0 0 0 0
CAMBIASSO int 8 100.00 6.38 2 0 0 0 0 0 0
CANA laz 2 25.00 5.25 0 0 1 0 0 0 0
CANDREVA ces 8 100.00 6.13 0 0 2 0 1 1 0
CAPRARI rom 0 0.00 0.00 0 0 0 0 0 0 0
CARMONA ata 2 25.00 6.00 0 0 0 0 0 0 0
CASARINI bol 5 62.50 5.30 0 0 1 0 0 0 0
CASERTA ata 0 0.00 0.00 0 0 0 0 0 0 0
CEPPELINI cag 0 0.00 0.00 0 0 0 0 0 0 0
CERCI fio 8 100.00 7.13 3 0 0 0 0 0 0
CIGARINI ata 8 100.00 6.56 1 1 3 0 0 0 0
CODREA sie 0 0.00 0.00 0 0 0 0 0 0 0
COLUCCI ces 4 50.00 5.50 0 0 0 0 0 0 0
CONSTANT gen 6 75.00 5.83 1 0 0 0 0 0 0
CONTI cag 8 100.00 6.44 2 0 4 0 0 0 0
COSSU cag 8 100.00 6.06 0 0 2 0 0 0 0
COUTINHO int 1 12.50 5.50 0 0 1 0 0 0 0
CRUZADO chi 6 75.00 5.75 0 0 0 0 0 0 0
CUADRADO lec 8 100.00 5.75 0 0 1 0 0 0 0
D’AGOSTINO sie 6 75.00 6.17 0 1 1 0 0 0 0
DE ROSSI rom 7 87.50 7.14 1 1 2 0 0 0 0
DEL NERO laz 0 0.00 0.00 0 0 0 0 0 0 0
DELLA ROCCA pal 6 75.00 5.83 0 0 1 0 0 0 0
DI MATTEO pal 0 0.00 0.00 0 0 0 0 0 0 0
DIAMANTI bol 5 62.50 6.40 0 0 0 0 1 1 0
DONADEL nap 0 0.00 0.00 0 0 0 0 0 0 0
DONI ata 0 0.00 0.00 0 0 0 0 0 0 0
DOSSENA nap 6 75.00 5.75 0 0 1 0 0 0 0
DOUBAI udi 0 0.00 0.00 0 0 0 0 0 0 0
DZEMAILI nap 5 62.50 6.00 0 1 0 0 0 0 0
EKDAL cag 0 0.00 0.00 0 0 0 0 0 0 0
EL SHAARAWY mil 2 25.00 8.00 1 0 0 0 0 0 0
EMANUELSON mil 6 75.00 5.50 0 0 0 0 0 0 0
ERIKSSON cag 0 0.00 0.00 0 0 0 0 0 0 0
ESTIGARRIBIA juv 2 25.00 5.75 0 0 0 0 0 0 0
FABBRINI udi 2 25.00 5.00 0 0 1 0 0 0 0
FERREIRA PINTO ata 0 0.00 0.00 0 0 0 0 0 0 0
FLAMINI mil 0 0.00 0.00 0 0 0 0 0 0 0
FOGGIA laz 0 0.00 0.00 0 0 0 0 0 0 0
GALLOPPA par 4 50.00 5.13 0 0 0 0 0 0 0
GARGANO nap 6 75.00 5.92 0 1 1 0 0 0 0
GATTUSO mil 1 12.50 5.50 0 0 0 0 0 0 0
GAZZI sie 6 75.00 5.92 0 0 0 0 0 0 0
GIACOMAZZI lec 8 100.00 6.69 2 0 2 0 0 0 0
GIORGI nov 4 50.00 6.00 0 0 0 0 0 0 0
GOMEZ cat 6 75.00 6.67 1 1 0 0 0 0 0
GONZALEZ laz 4 50.00 5.88 0 0 0 0 0 0 0
GRECO rom 1 12.50 5.50 0 0 0 0 0 0 0
GRIPPO chi 0 0.00 0.00 0 0 0 0 0 0 0
GROSSI sie 2 25.00 5.50 0 0 0 0 0 0 0
GROSSMULLER lec 5 62.50 7.00 2 1 0 1 0 0 0
GUANA ces 8 100.00 6.25 1 0 3 0 0 0 0
HAMSIK nap 8 100.00 6.31 2 1 1 0 1 0 1
HERNANES laz 8 100.00 7.13 1 0 1 0 2 2 0
HETEMAJ chi 8 100.00 6.00 0 1 2 0 0 0 0
IBARBO cag 7 87.50 5.93 0 0 0 0 0 0 0
ILICIC pal 7 87.50 5.57 0 0 1 0 0 0 0
INLER nap 8 100.00 6.00 0 0 2 0 0 0 0
ISLA udi 6 75.00 6.58 1 0 0 0 0 0 0
IZCO cat 3 37.50 6.17 0 0 0 0 0 0 0
JANKOVIC gen 4 50.00 6.88 1 0 0 0 0 0 0
JORQUERA gen 5 62.50 6.40 0 2 1 0 0 0 0
JOVETIC fio 8 100.00 8.50 5 2 0 0 0 0 0
KHARJA fio 4 50.00 5.25 0 0 0 0 0 0 0
KRASIC juv 5 62.50 5.70 1 0 0 0 0 0 0
KRHIN bol 3 37.50 5.83 0 0 1 0 0 0 0
KUCKA gen 8 100.00 6.69 2 1 1 0 0 0 0
LAMELA rom 2 25.00 7.75 1 0 0 0 0 0 0
LANZAFAME cat 4 50.00 5.50 0 0 3 0 0 0 0
LAZZARI fio 3 37.50 5.50 0 0 2 0 0 0 0
LEDESMA C. laz 8 100.00 6.00 0 0 0 0 0 0 0
LEDESMA P. cat 3 37.50 5.83 0 1 1 0 0 0 0
LJAJIC fio 2 25.00 5.00 0 0 1 0 0 0 0
LLAMA cat 0 0.00 0.00 0 0 0 0 0 0 0
LODI cat 8 100.00 7.19 1 0 1 0 1 1 0
LORES VARELA pal 0 0.00 0.00 0 0 0 0 0 0 0
LUCIANO chi 0 0.00 0.00 0 0 0 0 0 0 0
MAGGIO nap 7 87.50 7.36 2 1 1 0 0 0 0
MANNINI sie 7 87.50 6.14 0 0 1 0 0 0 0
MARCHIONNI fio 0 0.00 0.00 0 0 0 0 0 0 0
MARCHISIO juv 8 100.00 7.75 3 0 3 0 0 0 0
MARIANINI nov 5 62.50 6.40 1 0 0 0 0 0 0
MARQUES par 0 0.00 0.00 0 0 0 0 0 0 0
MARRONE juv 0 0.00 0.00 0 0 0 0 0 0 0
MARTINEZ ces 4 50.00 5.63 0 0 0 0 0 0 0
MARTINHO ces 2 25.00 5.50 0 0 0 0 0 0 0
MATUZALEM laz 6 75.00 6.25 0 1 1 0 0 0 0
MAURI laz 2 25.00 6.75 0 1 0 0 0 0 0
MAZZARANI nov 4 50.00 5.63 0 0 1 0 0 0 0
MERKEL gen 3 37.50 7.00 0 2 1 0 0 0 0
MESBAH lec 8 100.00 5.69 1 0 2 0 0 0 0
MIGLIACCIO pal 8 100.00 6.63 1 0 2 0 0 0 0
MODESTO par 8 100.00 6.00 1 0 0 0 0 0 0
MONTOLIVO fio 7 87.50 5.79 0 0 4 0 0 0 0
MORALEZ ata 8 100.00 7.56 4 1 2 0 0 0 0
MORETTI F. cat 0 0.00 0.00 0 0 0 0 0 0 0
MORRONE par 8 100.00 5.94 1 0 0 0 0 0 0
MUDINGAYI bol 8 100.00 5.94 0 0 2 0 0 0 0
MUNARI fio 5 62.50 5.20 0 0 3 0 0 0 0
MUNTARI int 2 25.00 6.00 0 1 0 0 0 0 0
NAINGGOLAN cag 8 100.00 6.63 1 0 3 0 0 0 0
NOCERINO mil 8 100.00 7.44 4 0 2 0 0 0 0
NWANKWO par 1 12.50 5.00 0 0 0 0 0 0 0
OBI int 6 75.00 5.33 0 0 1 1 0 0 0
OBODO lec 8 100.00 5.44 0 0 2 0 0 0 0
OLIVERA lec 1 12.50 5.50 0 0 0 0 0 0 0
PADOIN ata 8 100.00 6.19 0 0 3 0 0 0 0
PAGLIALUNGA cat 0 0.00 0.00 0 0 0 0 0 0 0
PALLADINO par 0 0.00 0.00 0 0 0 0 0 0 0
PAONESSA par 0 0.00 0.00 0 0 0 0 0 0 0
PAROLO ces 7 87.50 5.64 0 0 1 0 0 0 0
PASQUATO lec 5 62.50 5.80 0 0 0 0 0 0 0
PAZIENZA juv 1 12.50 5.50 0 0 0 0 0 0 0
PEPE juv 8 100.00 6.94 1 1 2 0 0 0 0
PEREZ bol 6 75.00 5.00 0 0 5 0 0 0 0
PERROTTA rom 6 75.00 5.75 0 0 1 0 0 0 0
PESCE nov 2 25.00 5.25 0 0 0 0 0 0 0
PIATTI lec 5 62.50 5.70 0 0 1 0 0 0 0
PINARDI nov 6 75.00 6.08 0 0 0 0 0 0 0
PINZI udi 7 87.50 5.79 0 0 2 1 0 0 0
PIRLO juv 8 100.00 6.81 0 2 2 0 0 0 0
PISANU bol 0 0.00 0.00 0 0 0 0 0 0 0
PIZARRO rom 5 62.50 5.90 0 0 1 0 0 0 0
POLI int 0 0.00 0.00 0 0 0 0 0 0 0
PORCARI nov 8 100.00 6.19 1 1 3 0 0 0 0
PULZETTI bol 7 87.50 5.43 0 0 2 0 0 0 0
RADOVANOVIC nov 4 50.00 5.63 0 0 2 0 0 0 0
RAMIREZ bol 6 75.00 6.92 1 1 1 0 0 0 0
REGINALDO sie 3 37.50 6.00 0 0 0 0 0 0 0
RICCHIUTI cat 4 50.00 6.00 0 0 1 0 0 0 0
RIGONI L. chi 8 100.00 6.06 0 0 1 0 0 0 0
RIGONI M. nov 7 87.50 7.71 1 1 0 0 2 2 0
ROSSI M. gen 5 62.50 6.80 1 0 1 0 0 0 0
SAMMARCO chi 6 75.00 5.42 0 0 2 0 0 0 0
SANTANA nap 4 50.00 5.50 0 0 1 0 0 0 0
SCHELOTTO ata 8 100.00 6.69 1 1 3 0 0 0 0
SCIACCA cat 2 25.00 6.25 0 0 0 0 0 0 0
SCULLI laz 3 37.50 7.17 1 1 0 0 0 0 0
SEEDORF mil 4 50.00 6.25 1 0 1 0 0 0 0
SESTU sie 0 0.00 0.00 0 0 0 0 0 0 0
SEYMOUR gen 5 62.50 5.90 0 0 2 0 0 0 0
SHALA nov 0 0.00 0.00 0 0 0 0 0 0 0
SIMON pal 0 0.00 0.00 0 0 0 0 0 0 0
SIMPLICIO rom 1 12.50 9.00 1 0 1 0 0 0 0
SISSOKO A. udi 0 0.00 0.00 0 0 0 0 0 0 0
SNEIJDER int 5 62.50 7.50 1 2 0 0 0 0 0
STANKOVIC int 5 62.50 5.60 0 0 1 0 0 0 0
STRASSER lec 5 62.50 5.60 0 0 1 0 0 0 0
TADDEI rom 1 12.50 6.50 0 0 0 0 0 0 0
TAIDER bol 0 0.00 0.00 0 0 0 0 0 0 0
THIAGO MOTTA int 1 12.50 9.00 1 0 1 0 0 0 0
TORJE udi 8 100.00 5.50 0 0 1 0 0 0 0
TROIANIELLO sie 0 0.00 0.00 0 0 0 0 0 0 0
VACEK chi 3 37.50 5.33 0 0 1 0 0 0 0
VALDES par 3 37.50 7.17 1 0 0 0 0 0 0
VALIANI par 5 62.50 5.60 0 0 0 0 0 0 0
VAN BOMMEL mil 7 87.50 5.79 0 0 1 0 0 0 0
VARGAS fio 6 75.00 5.58 0 0 1 0 0 0 0
VELOSO gen 8 100.00 6.63 1 0 1 0 0 0 0
VERGASSOLA sie 6 75.00 6.00 0 0 0 0 0 0 0
VIDAL juv 7 87.50 6.43 1 0 1 0 0 0 0
VIVIANI rom 0 0.00 0.00 0 0 0 0 0 0 0
ZAHAVI pal 6 75.00 6.75 1 1 0 0 0 0 0
ZANETTI int 8 100.00 5.56 0 0 2 0 0 0 0
ZE EDUARDO par 2 25.00 6.00 0 0 0 0 0 0 0
ZUNIGA nap 6 75.00 5.75 0 0 1 0 0 0 0
ALVAREZ pal 3 37.50 5.33 0 0 0 0 0 0 0
BRADLEY chi 7 87.50 5.86 0 1 1 0 0 0 0
DJOKOVIC ces 0 0.00 0.00 0 0 0 0 0 0 0
ELIA juv 1 12.50 4.50 0 0 0 0 0 0 0
GAGO rom 5 62.50 5.90 0 0 1 0 0 0 0
GIANDONATO lec 2 25.00 5.50 0 0 0 0 0 0 0
KONE bol 8 100.00 5.25 0 0 2 0 0 0 0
PEREYRA udi 0 0.00 0.00 0 0 0 0 0 0 0
PJANIC rom 5 62.50 6.60 0 2 0 0 0 0 0
RUI SAMPAIO cag 0 0.00 0.00 0 0 0 0 0 0 0
BERTOLO pal 5 62.50 6.50 1 0 0 0 0 0 0
DELVECCHIO cat 7 87.50 6.29 1 0 2 0 0 0 0
MEZA COLLI ces 1 12.50 5.50 0 0 0 0 0 0 0
JADID par 6 75.00 5.67 0 0 1 0 0 0 0
attaccante Squadra p p% mFv gF ass am esp rT rOk rNo
ACQUAFRESCA bol 8 100.00 6.31 2 0 0 0 0 0 0
AMAURI juv 0 0.00 0.00 0 0 0 0 0 0 0
ARDEMAGNI ata 0 0.00 0.00 0 0 0 0 0 0 0
BABACAR fio 0 0.00 0.00 0 0 0 0 0 0 0
BARRETO D.S. udi 0 0.00 0.00 0 0 0 0 0 0 0
BJELANOVIC ata 0 0.00 0.00 0 0 0 0 0 0 0
BOGDANI ces 5 62.50 5.50 0 0 1 0 0 0 0
BOJAN rom 5 62.50 6.30 1 0 0 0 0 0 0
BORINI rom 4 50.00 7.00 1 0 0 0 0 0 0
BORRIELLO rom 3 37.50 6.00 0 1 0 0 0 0 0
BRIENZA sie 7 87.50 5.86 0 0 0 0 0 0 0
CALAIO’ sie 7 87.50 7.36 4 0 2 0 0 0 0
CASSANO mil 8 100.00 7.63 2 5 1 0 0 0 0
CASTAIGNOS int 2 25.00 4.50 0 0 0 0 0 0 0
CATELLANI cat 5 62.50 5.70 0 0 0 0 0 0 0
CAVANI nap 7 87.50 7.36 3 1 1 0 0 0 0
CHAVEZ nap 0 0.00 0.00 0 0 0 0 0 0 0
CISSE laz 8 100.00 6.44 1 1 1 0 0 0 0
CORVIA lec 6 75.00 5.33 0 0 2 0 0 0 0
CRESPO H. par 1 12.50 5.50 0 0 0 0 0 0 0
DEL PIERO juv 5 62.50 6.50 0 1 0 0 0 0 0
DENIS ata 8 100.00 7.81 4 1 1 0 2 1 1
DESTRO sie 3 37.50 7.00 1 1 1 0 0 0 0
DI MICHELE lec 5 62.50 5.90 0 0 1 0 0 0 0
DI NATALE udi 7 87.50 9.14 4 1 0 0 2 2 0
DI VAIO bol 8 100.00 5.25 0 1 0 0 0 0 0
EDER ces 8 100.00 5.56 0 1 1 0 0 0 0
EL KABIR cag 1 12.50 9.00 1 0 1 0 0 0 0
ESCOBAR gen 0 0.00 0.00 0 0 0 0 0 0 0
FLOCCARI par 6 75.00 5.92 0 1 0 0 0 0 0
FLORO FLORES udi 2 25.00 5.75 0 0 1 0 0 0 0
GABBIADINI ata 3 37.50 5.83 0 0 0 0 0 0 0
GIACCHERINI juv 5 62.50 5.70 0 0 1 0 0 0 0
GILARDINO fio 3 37.50 7.00 1 0 0 0 0 0 0
GIMENEZ bol 3 37.50 5.17 0 0 2 0 0 0 0
GIOVINCO par 7 87.50 9.00 4 1 1 1 2 2 0
GONZALEZ PABLO sie 5 62.50 6.20 1 0 1 0 0 0 0
GRANOCHE nov 5 62.50 5.40 0 0 0 0 0 0 0
HERNANDEZ pal 8 100.00 7.06 2 0 3 0 1 1 0
IAQUINTA juv 0 0.00 0.00 0 0 0 0 0 0 0
IBRAHIMOVIC mil 5 62.50 7.60 2 1 0 0 0 0 0
INZAGHI mil 0 0.00 0.00 0 0 0 0 0 0 0
JEDA nov 6 75.00 6.50 1 0 0 0 0 0 0
KEKO cat 0 0.00 0.00 0 0 0 0 0 0 0
KLOSE laz 8 100.00 8.56 5 1 0 0 0 0 0
KOZAK laz 1 12.50 5.50 0 0 0 0 0 0 0
LARRIVEY cag 6 75.00 6.17 1 0 0 0 0 0 0
LARRONDO sie 1 12.50 5.50 0 0 0 0 0 0 0
LAVEZZI nap 7 87.50 7.43 2 2 3 0 0 0 0
LUCARELLI C. nap 0 0.00 0.00 0 0 0 0 0 0 0
MALONGA ces 1 12.50 5.00 0 0 0 0 0 0 0
MARILUNGO ata 1 12.50 5.50 0 0 1 0 0 0 0
MASCARA nap 3 37.50 7.00 1 1 1 0 0 0 0
MATRI juv 6 75.00 8.42 4 0 0 0 0 0 0
MAXI LOPEZ cat 6 75.00 6.83 1 0 0 0 1 1 0
MEGGIORINI nov 6 75.00 6.33 1 0 2 0 0 0 0
MICCOLI pal 6 75.00 7.83 3 2 1 0 0 0 0
MILITO int 6 75.00 6.83 1 0 0 0 2 2 0
MORIMOTO nov 7 87.50 6.57 2 1 2 0 0 0 0
MOSCARDELLI chi 7 87.50 7.00 2 0 0 0 0 0 0
MOTTA S. nov 0 0.00 0.00 0 0 0 0 0 0 0
MUTU ces 6 75.00 5.17 1 0 0 1 1 0 1
NENE’ cag 7 87.50 5.86 0 0 2 0 1 1 0
OFERE lec 3 37.50 4.83 0 0 0 0 0 0 0
OKAKA rom 0 0.00 0.00 0 0 0 0 0 0 0
OSVALDO rom 7 87.50 6.93 3 0 1 0 0 0 0
PALACIO gen 8 100.00 8.94 4 3 2 0 1 1 0
PALOSCHI chi 6 75.00 6.17 1 0 0 0 0 0 0
PANDEV nap 4 50.00 5.13 0 0 0 0 0 0 0
PAOLUCCI sie 0 0.00 0.00 0 0 0 0 0 0 0
PAPONI bol 1 12.50 5.00 0 0 0 0 0 0 0
PATO mil 3 37.50 5.00 0 0 1 0 0 0 0
PAZZINI int 6 75.00 5.92 1 0 1 0 0 0 0
PELLE’ par 3 37.50 5.00 0 0 1 0 0 0 0
PELLISSIER chi 7 87.50 6.00 2 0 0 0 1 0 1
PINILLA pal 7 87.50 6.43 1 0 3 0 1 1 0
PRATTO gen 6 75.00 5.33 0 0 1 0 0 0 0
QUAGLIARELLA juv 0 0.00 0.00 0 0 0 0 0 0 0
RENNELLA ces 0 0.00 0.00 0 0 0 0 0 0 0
RIBAS gen 0 0.00 0.00 0 0 0 0 0 0 0
RISKI ces 0 0.00 0.00 0 0 0 0 0 0 0
ROBINHO mil 3 37.50 6.50 1 0 1 0 0 0 0
ROCCHI laz 0 0.00 0.00 0 0 0 0 0 0 0
RODRIGUEZ bol 0 0.00 0.00 0 0 0 0 0 0 0
RUBINO nov 0 0.00 0.00 0 0 0 0 0 0 0
RUDOLF gen 0 0.00 0.00 0 0 0 0 0 0 0
SAMB chi 0 0.00 0.00 0 0 0 0 0 0 0
SANSONE par 0 0.00 0.00 0 0 0 0 0 0 0
SUAZO cat 1 12.50 6.00 0 0 0 0 0 0 0
THEREAU chi 7 87.50 6.29 1 1 1 0 0 0 0
TIRIBOCCHI ata 1 12.50 6.50 0 0 0 0 0 0 0
TONI juv 0 0.00 0.00 0 0 0 0 0 0 0
TOTTI rom 4 50.00 6.25 0 0 0 0 0 0 0
URIBE chi 0 0.00 0.00 0 0 0 0 0 0 0
VANTAGGIATO bol 0 0.00 0.00 0 0 0 0 0 0 0
VUCINIC juv 7 87.50 6.57 1 2 0 1 0 0 0
VYDRA udi 0 0.00 0.00 0 0 0 0 0 0 0
ZARATE int 7 87.50 5.50 0 0 1 0 0 0 0
EDUARDO D.A. gen 0 0.00 0.00 0 0 0 0 0 0 0
ACOSTA sie 0 0.00 0.00 0 0 0 0 0 0 0
BERGESSIO cat 6 75.00 7.17 2 0 1 0 0 0 0
CARACCIOLO gen 7 87.50 6.00 1 0 1 0 0 0 0
FORLAN int 5 62.50 5.80 1 0 0 0 0 0 0
GHEZZAL ces 7 87.50 5.07 0 0 1 0 0 0 0
GRANDOLFO chi 0 0.00 0.00 0 0 0 0 0 0 0
MURIEL lec 1 12.50 5.00 0 0 0 0 0 0 0
SANTIAGO SILVA fio 5 62.50 5.50 0 0 0 0 0 0 0
THIAGO RIBEIRO cag 8 100.00 6.69 1 1 0 0 0 0 0
LIVAJA ces 1 12.50 5.50 0 0 0 0 0 0 0


by Bancaldo.

Categorie:Fantacalcio, FantaLega Tag:

Fantalight e Fantagazzetta: update valutazioni calciatori

27 Settembre 2011 Commenti chiusi

I file scaricati da Fantagazzetta, anche se con estensione .xls, sono in
realtà in formato html.
Per aggiornare le valutazioni dei calciatori ho scritto questo codice,
che permette l’update dei giocatori, direttamente sul database utilizzato da
Fantalight.
Ho utilizzato BeautifulSoup per il parsing del file html.

'''
Utilizzare con FantaGazzetta-Quotazioni.
Vengono aggiornate solo le valutazioni dei giocatori
pre-esistenti.
Anche se con estensione xls, il file in ingresso e'
un HTML, quindi per il parsing viene utilizzato
Beautifulsoup
'''
import wx, os
from BeautifulSoup import BeautifulSoup
from DataLight import *
from sqlalchemy import and_

class FileBrowser(wx.FileDialog):
    '''Class for file browser'''
    def __init__(self):
        self.fin = None
        wildcard = &quot;File Fantagazzetta (*.xls)|*.xls|&quot; 
            &quot;Tutti i files (*.*)|*.*&quot;
        wx.FileDialog.__init__(self, None, &quot;scegli il file&quot;, os.getcwd(),
                               &quot;&quot;, wildcard, wx.OPEN | wx.CHANGE_DIR)
        if self.ShowModal() == wx.ID_OK:  
            print(self.GetPath())
            self.file = self.GetPath()
            self.fin = open(self.file, 'r')
        else:
            print &quot;operazione apertura annullata&quot;
            self.Destroy()
        self.Destroy()

def parser():
    '''Parse the siracusa txt'''
    model = Model()
    f_b = FileBrowser()
    html = f_b.fin.read()
    soup = BeautifulSoup(''.join(html))
    soup.prettify()    
    table = soup.find('table')
    rows = table.findAll('tr')
    for tr in rows:
        columns = tr.findAll('td')
        values = []
        for td in columns:
            line = td.find(text = True)
            values.append(line)
        try: # scarto l'intestazione del file
            int(values[0])
            nome = values[2]
            sq = (values[3])[0:3]
            val = values[4]
            player = model.session.query(Giocatore).filter(and_(
                     Giocatore.nome == nome, Giocatore.squadra == sq)).one()
            player.valore = val
            model.session.commit()
            print player, &quot; ++++ value updated to %s&quot; % val
        except ValueError:
            pass #passo se il valore non e' un cod. giocatore

    f_b.fin.close()

def main():
    '''app starter'''
    app = wx.PySimpleApp()
    app.MainLoop()
    parser()

if __name__ == '__main__':
    main()

Eseguito nella stessa dir di fantalight, funziona egregiamente

&lt;Giocatore ('DI NATALE: attaccante')&gt;  ++++ value updated to 37
&lt;Giocatore ('CAVANI: attaccante')&gt;  ++++ value updated to 36
&lt;Giocatore ('IBRAHIMOVIC: attaccante')&gt;  ++++ value updated to 34
&lt;Giocatore ('PALACIO: attaccante')&gt;  ++++ value updated to 31
&lt;Giocatore ('TOTTI: attaccante')&gt;  ++++ value updated to 30
&lt;Giocatore ('PAZZINI: attaccante')&gt;  ++++ value updated to 29
&lt;Giocatore ('MATRI: attaccante')&gt;  ++++ value updated to 28
&lt;Giocatore ('FORLAN: attaccante')&gt;  ++++ value updated to 28
...

link utili:
fantalightbeautifulsoup

Categorie:FantaLega, python, sqlalchemy Tag:

Statistiche Calciatori 2010-2011

11 Gennaio 2011 Commenti chiusi

Statistiche Calciatori 2010-2011

Portieri Squadra p p% mFv gS
ABBIATI C. milan 19 90.48 5.74 13
AGAZZI M. cagliari 21 100.00 5.17 22
AMELIA M. milan 2 9.52 3.25 5
ANDUJAR M. catania 21 100.00 4.81 27
ANTONIOLI F. cesena 21 100.00 5.19 24
ARCARI M. brescia 6 28.57 5.33 5
AVRAMOV V. fiorentina 2 9.52 4.50 2
BELARDI E. udinese 0 0.00 0.00 0
BENASSI M. lecce 0 0.00 0.00 0
BENUSSI F. palermo 0 0.00 0.00 0
BERNI T. lazio 0 0.00 0.00 0
BIZZARRI B. lazio 0 0.00 0.00 0
BORUC A. fiorentina 11 52.38 5.09 9
BRICHETTO G. palermo 0 0.00 0.00 0
BUFFON G. juventus 2 9.52 5.50 1
CAMPAGNOLO A. catania 0 0.00 0.00 0
CASTELLAZZI L. inter 13 61.90 4.88 16
CURCI G. sampdoria 21 100.00 5.33 17
DE SANCTIS M. napoli 21 100.00 5.17 20
DONI A. roma 4 19.05 5.38 2
EDUARDO d. genoa 21 100.00 4.86 19
FIORILLO V. sampdoria 1 4.76 6.00 0
FREY S. fiorentina 10 47.62 5.15 10
GIANELLO M. napoli 0 0.00 0.00 0
GILLET J. bari 20 95.24 4.75 31
HANDANOVIC S. udinese 21 100.00 5.31 28
IEZZO G. napoli 0 0.00 0.00 0
JULIO CESAR S. inter 11 52.38 6.00 4
JULIO SERGIO B. roma 14 66.67 4.54 19
KOSICKY T. catania 0 0.00 0.00 0
LAMBERTI I. bari 0 0.00 0.00 0
LOBONT B. roma 5 23.81 5.70 3
LUPATELLI C. bologna 1 4.76 6.00 0
MANNINGER A. juventus 0 0.00 0.00 0
MARCHETTI F. cagliari 0 0.00 0.00 0
MIRANDA S. fiorentina 1 4.76 6.00 0
MIRANTE A. parma 21 100.00 4.86 25
MUSLERA F. lazio 21 100.00 4.90 21
ORLANDONI P. inter 2 9.52 6.00 0
PADELLI D. bari 1 4.76 5.00 1
PAVARINI N. parma 0 0.00 0.00 0
PERIN M. genoa 1 4.76 6.00 0
PETRACHI D. lecce 0 0.00 0.00 0
ROMA F. milan 0 0.00 0.00 0
ROMO R. udinese 0 0.00 0.00 0
ROSATI A. lecce 21 100.00 4.33 38
RUBINHO F. palermo 0 0.00 0.00 0
RUSSO S. parma 0 0.00 0.00 0
SCARPI A. genoa 1 4.76 6.00 0
SERENI M. brescia 15 71.43 4.90 22
SIRIGU S. palermo 21 100.00 5.33 25
SORRENTINO S. chievo 21 100.00 5.33 20
SQUIZZI L. chievo 2 9.52 6.00 0
STORARI M. juventus 19 90.48 5.26 24
TEODORANI A. cesena 1 4.76 6.00 0
TRAZZI J. chievo 0 0.00 0.00 0
VENTURI G. bologna 1 4.76 6.00 0
VIGORITO M. cagliari 0 0.00 0.00 0
VIOTTI S. brescia 0 0.00 0.00 0
VIVIANO E. bologna 21 100.00 5.07 28
LOMBARDI F. bologna 1 4.76 6.00 0
DA COSTA sampdoria 2 9.52 5.00 1
LEALI N. brescia 0 0.00 0.00 0
SILVESTRI M. chievo 1 4.76 6.00 0
PELIZZOLI I. cagliari 0 0.00 0.00 0
CAVALIERI D. cesena 1 4.76 6.00 0
BOERCHIO M. bari 0 0.00 0.00 0
COSTANTINO M. juventus 0 0.00 0.00 0
SECULIN A. fiorentina 1 4.76 6.00 0
CALDERONI A. cesena 0 0.00 0.00 0
NETO fiorentina 0 0.00 0.00 0
difensore Squadra p p% mFv gF ass am esp rT rOk rNo
ABATE I. milan 16 76.19 5.88 0 0 0 1 0 0 0
ACCARDI P. sampdoria 8 38.10 5.81 0 0 2 0 0 0 0
AGOSTINI A. cagliari 18 85.71 5.92 0 1 4 0 0 0 0
ALVAREZ P. catania 12 57.14 5.75 0 0 3 0 0 0 0
ANDREOLLI M. chievo 18 85.71 5.75 0 0 3 0 0 0 0
ANTONELLI L. parma 12 57.14 5.92 0 0 1 0 0 0 0
ANTONINI L. milan 14 66.67 5.71 0 1 2 0 0 0 0
ANTUNES V. roma 0 0.00 0.00 0 0 0 0 0 0 0
ARIAUDO L. cagliari 7 33.33 5.79 0 0 1 0 0 0 0
ARONICA S. napoli 14 66.67 5.89 0 0 5 0 0 0 0
ASTORI D. cagliari 20 95.24 5.85 0 0 5 0 0 0 0
AUGUSTYN B. catania 0 0.00 0.00 0 0 0 0 0 0 0
BALZARETTI F. palermo 21 100.00 6.62 1 5 2 0 0 0 0
BASTA D. udinese 0 0.00 0.00 0 0 0 0 0 0 0
BEGA F. brescia 12 57.14 6.13 1 0 4 0 0 0 0
BELLUSCI G. catania 7 33.33 5.86 0 0 1 0 0 0 0
BELMONTE N. bari 16 76.19 5.69 0 0 4 0 0 0 0
BENATIA M. udinese 18 85.71 6.00 2 0 4 0 0 0 0
BERARDI G. brescia 13 61.90 5.62 0 0 3 0 0 0 0
BIANCO G. sampdoria 0 0.00 0.00 0 0 0 0 0 0 0
BIASI D. cagliari 0 0.00 0.00 0 0 0 0 0 0 0
BIAVA G. lazio 19 90.48 6.24 2 0 4 1 0 0 0
BOCCHETTI S. genoa 0 0.00 0.00 0 0 0 0 0 0 0
BONERA D. milan 13 61.90 5.69 0 0 2 0 0 0 0
BONUCCI L. juventus 20 95.24 5.90 1 0 4 0 0 0 0
BOVO C. palermo 19 90.48 6.34 2 1 8 0 0 0 0
BRITOS M. bologna 21 100.00 5.83 2 1 3 0 0 0 0
BRIVIO D. lecce 7 33.33 5.36 0 0 2 0 0 0 0
BURDISSO N. roma 13 61.90 5.77 1 0 4 2 0 0 0
CACCIATORE F. sampdoria 6 28.57 5.58 0 0 1 0 0 0 0
CAMPAGNARO H. napoli 19 90.48 5.76 0 0 7 0 0 0 0
CANINI M. cagliari 20 95.24 6.05 1 0 3 0 0 0 0
CANNAVARO P. napoli 18 85.71 6.17 2 0 4 1 0 0 0
CAPUANO C. catania 14 66.67 6.11 1 1 2 0 0 0 0
CASSANI M. palermo 20 95.24 5.83 0 1 6 0 0 0 0
CASSETTI M. roma 19 90.48 5.74 0 1 7 0 0 0 0
CASTELLINI P. roma 3 14.29 5.00 0 0 0 0 0 0 0
CECCARELLI L. cesena 19 90.48 6.03 1 1 2 0 0 0 0
CESAR B. chievo 20 95.24 5.80 1 0 7 1 0 0 0
CHICO genoa 9 42.86 5.61 0 0 2 0 0 0 0
CHIELLINI G. juventus 19 90.48 6.32 1 0 2 0 0 0 0
CHIVU C. inter 17 80.95 5.53 0 0 4 0 0 0 0
CICINHO J. roma 6 28.57 5.67 0 1 2 0 0 0 0
CODA A. udinese 14 66.67 5.54 0 0 1 1 0 0 0
COMOTTO G. fiorentina 10 47.62 5.45 0 0 4 0 0 0 0
CORDOBA I. inter 16 76.19 5.91 0 0 4 0 0 0 0
CRIBARI S. napoli 4 19.05 5.75 0 0 0 0 0 0 0
CRISCITO D. genoa 21 100.00 6.21 0 0 3 0 0 0 0
CUSARO F. cesena 0 0.00 0.00 0 0 0 0 0 0 0
DAINELLI D. genoa 19 90.48 6.08 0 1 3 0 0 0 0
DALLAMANO S. brescia 14 66.67 5.93 1 0 2 0 0 0 0
DARMIAN M. palermo 0 0.00 0.00 0 0 0 0 0 0 0
DE CEGLIE P. juventus 6 28.57 6.08 0 1 0 0 0 0 0
DE MAIO S. brescia 0 0.00 0.00 0 0 0 0 0 0 0
DE SILVESTRI L. fiorentina 14 66.67 5.75 1 0 1 0 0 0 0
DIAKITE’ M. lazio 5 23.81 5.80 0 0 1 0 0 0 0
DIAMOUTENE S. lecce 2 9.52 7.75 1 0 0 0 0 0 0
DIAS A. lazio 20 95.24 5.95 1 1 4 1 0 0 0
DIEGO A. genoa 0 0.00 0.00 0 0 0 0 0 0 0
DINIZ PLONIO P. parma 0 0.00 0.00 0 0 0 0 0 0 0
DOMIZZI M. udinese 15 71.43 6.00 1 0 4 0 0 0 0
DONATI G. lecce 7 33.33 5.57 0 0 0 0 0 0 0
ESPOSITO A. bologna 6 28.57 5.42 0 0 1 0 0 0 0
FABIANO M. lecce 13 61.90 5.85 0 1 3 0 0 0 0
FATIC I. cesena 3 14.29 5.83 0 0 0 0 0 0 0
FELIPE D. fiorentina 5 23.81 5.10 0 0 1 1 0 0 0
FELTSCHER R. parma 0 0.00 0.00 0 0 0 0 0 0 0
FERRARIO S. lecce 9 42.86 5.56 0 0 3 0 0 0 0
FERRONETTI D. udinese 0 0.00 0.00 0 0 0 0 0 0 0
FREY N. chievo 14 66.67 6.04 0 2 1 0 0 0 0
GALASSO G. bari 3 14.29 5.67 0 0 0 0 0 0 0
GAMBERINI A. fiorentina 18 85.71 5.86 0 1 1 0 0 0 0
GARCIA S. palermo 0 0.00 0.00 0 0 0 0 0 0 0
GASTALDELLO D. sampdoria 18 85.71 6.06 0 1 1 1 0 0 0
GIULIATTO A. lecce 10 47.62 5.35 0 0 0 0 0 0 0
GLIK K. palermo 4 19.05 5.63 0 0 0 0 0 0 0
GOIAN D. palermo 8 38.10 5.56 0 0 3 0 0 0 0
GRAVA G. napoli 12 57.14 5.79 0 0 4 0 0 0 0
GROSSO F. juventus 11 52.38 5.64 0 1 2 0 0 0 0
GRYGERA Z. juventus 8 38.10 5.81 0 0 1 0 0 0 0
INGROSSO G. lecce 0 0.00 0.00 0 0 0 0 0 0 0
INSUA E. fiorentina 0 0.00 0.00 0 0 0 0 0 0 0
JANKULOVSKI M. milan 0 0.00 0.00 0 0 0 0 0 0 0
JOKIC B. chievo 5 23.81 5.70 0 0 0 0 0 0 0
JUAN S. roma 17 80.95 5.94 1 0 2 0 0 0 0
KALADZE K. genoa 10 47.62 6.35 0 0 1 0 0 0 0
KROLDRUP P. fiorentina 14 66.67 5.50 0 0 3 1 0 0 0
LAURO M. cesena 13 61.90 5.69 0 0 3 0 0 0 0
LEGROTTAGLIE N. juventus 3 14.29 7.17 1 0 0 0 0 0 0
LICHTSTEINER S. lazio 18 85.71 6.00 0 0 3 0 0 0 0
LOPEZ W. brescia 0 0.00 0.00 0 0 0 0 0 0 0
LORIA S. roma 0 0.00 0.00 0 0 0 0 0 0 0
LUCARELLI A. parma 17 80.95 5.74 1 1 4 1 0 0 0
LUCCHINI S. sampdoria 17 80.95 5.97 0 0 5 1 0 0 0
LUCIO inter 21 100.00 6.17 1 0 2 0 0 0 0
LUKOVIC A. udinese 0 0.00 0.00 0 0 0 0 0 0 0
MAICON D. inter 14 66.67 6.04 0 2 1 0 0 0 0
MALAGO’ M. chievo 0 0.00 0.00 0 0 0 0 0 0 0
MANDELLI D. chievo 9 42.86 6.17 1 0 1 0 0 0 0
MANTOVANI A. chievo 18 85.71 5.50 0 0 6 0 0 0 0
MARCHESE G. catania 3 14.29 5.67 0 0 0 0 0 0 0
MARECO V. brescia 3 14.29 5.83 0 0 1 0 0 0 0
MARTINEZ G. brescia 19 90.48 5.71 0 0 5 0 0 0 0
MASIELLO A. bari 20 95.24 5.80 1 0 1 1 1 1 0
MASIELLO S. bari 4 19.05 5.00 0 0 1 0 0 0 0
MATERAZZI M. inter 4 19.05 5.25 0 0 0 0 0 0 0
MEXES P. roma 14 66.67 6.07 0 1 1 1 0 0 0
MORAS V. bologna 8 38.10 5.88 0 0 1 0 0 0 0
MORERO S. chievo 1 4.76 6.00 0 0 0 0 0 0 0
MORETTI E. genoa 3 14.29 5.33 0 0 0 1 0 0 0
MORLEO A. bologna 4 19.05 6.25 0 0 0 0 0 0 0
MOTTA M. juventus 14 66.67 5.21 0 1 5 0 0 0 0
NAGATOMO Y. cesena 17 80.95 6.06 0 1 2 0 0 0 0
NATALI C. fiorentina 8 38.10 5.69 0 0 4 0 0 0 0
NESTA A. milan 16 76.19 6.06 0 0 2 0 0 0 0
ODDO M. milan 1 4.76 9.00 0 2 0 0 0 0 0
OLIVEIRA F. parma 0 0.00 0.00 0 0 0 0 0 0 0
ONYEWU O. milan 0 0.00 0.00 0 0 0 0 0 0 0
PACI M. parma 11 52.38 5.36 0 0 4 1 0 0 0
PALETTA G. parma 15 71.43 5.70 0 0 5 0 0 0 0
PAPASTATHOPOULOS S. milan 3 14.29 5.00 0 0 1 0 0 0 0
PARISI A. bari 14 66.67 5.43 1 1 4 1 1 0 1
PASQUAL M. fiorentina 19 90.48 5.58 0 0 4 0 0 0 0
PASQUALE G. udinese 8 38.10 5.56 0 1 2 0 0 0 0
PELLEGRINO M. cesena 14 66.67 5.43 0 0 0 1 0 0 0
PETRAS M. cesena 1 4.76 6.00 0 0 0 0 0 0 0
PISANO F. cagliari 12 57.14 5.83 0 0 2 0 0 0 0
PORTANOVA D. bologna 18 85.71 5.50 0 0 3 0 0 0 0
POTENZA A. catania 14 66.67 5.54 0 0 5 0 0 0 0
RADU S. lazio 18 85.71 5.61 0 0 4 0 0 0 0
RAGGI A. bari 11 52.38 5.45 0 0 3 0 0 0 0
RANOCCHIA A. genoa 17 80.95 6.59 2 0 1 0 0 0 0
RICKLER C. chievo 0 0.00 0.00 0 0 0 0 0 0 0
RIISE J. roma 15 71.43 5.87 0 2 0 0 0 0 0
RINALDI M. bari 2 9.52 5.50 0 0 1 0 0 0 0
RINAUDO L. juventus 1 4.76 5.50 0 0 1 0 0 0 0
RISPOLI A. lecce 9 42.86 5.44 0 0 2 0 0 0 0
RIVAS N. inter 2 9.52 6.00 0 0 0 0 0 0 0
ROSI A. roma 6 28.57 5.00 0 0 3 0 0 0 0
ROSSI M. bari 15 71.43 5.23 0 0 2 2 0 0 0
ROSSINI J. sampdoria 1 4.76 6.00 0 0 0 0 0 0 0
SAMUEL W. inter 10 47.62 6.15 0 0 0 0 0 0 0
SANTACROCE F. napoli 4 19.05 5.88 0 0 1 0 0 0 0
SANTON D. inter 9 42.86 5.50 0 0 1 0 0 0 0
SARDO G. chievo 10 47.62 5.70 0 0 1 0 0 0 0
SCALONI L. lazio 2 9.52 5.50 0 0 1 0 0 0 0
SCHIAVI R. lecce 0 0.00 0.00 0 0 0 0 0 0 0
SILVESTRE M. catania 21 100.00 6.38 3 0 3 0 0 0 0
SPOLLI N. catania 11 52.38 5.82 0 0 1 0 0 0 0
STANKEVICIUS M. sampdoria 0 0.00 0.00 0 0 0 0 0 0 0
STENDARDO G. lazio 3 14.29 5.00 0 0 1 0 0 0 0
TERLIZZI C. catania 7 33.33 6.71 2 0 1 0 0 0 0
THIAGO SILVA milan 16 76.19 6.31 1 1 0 0 0 0 0
TOMOVIC N. genoa 5 23.81 6.10 0 0 0 0 0 0 0
VOLTA M. sampdoria 9 42.86 5.67 0 0 2 0 0 0 0
YEPES M. milan 4 19.05 6.13 0 0 0 0 0 0 0
ZACCARDO C. parma 21 100.00 6.21 2 2 5 0 0 0 0
ZAMBROTTA G. milan 8 38.10 6.19 0 0 0 0 0 0 0
ZAPATA C. udinese 18 85.71 5.64 1 0 6 0 0 0 0
ZAURI L. sampdoria 15 71.43 5.77 0 0 1 0 0 0 0
ZEBINA J. brescia 13 61.90 5.73 0 0 4 0 0 0 0
ZIEGLER R. sampdoria 19 90.48 6.16 1 0 2 0 0 0 0
ZOBOLI D. brescia 3 14.29 5.33 0 0 1 0 0 0 0
CHERUBIN N. bologna 3 14.29 5.67 0 0 1 0 0 0 0
MAGLIOCCHETTI D. cagliari 0 0.00 0.00 0 0 0 0 0 0 0
GARRIDO J. lazio 0 0.00 0.00 0 0 0 0 0 0 0
GUSTAVO F. lecce 15 71.43 5.37 0 0 3 0 0 0 0
REGINIUSSEN T. lecce 0 0.00 0.00 0 0 0 0 0 0 0
VITALE L. napoli 3 14.29 5.50 0 0 2 0 0 0 0
MUNOZ E. palermo 19 90.48 5.87 0 0 3 0 0 0 0
PISANO M. parma 1 4.76 5.50 0 0 0 0 0 0 0
VON BERGEN S. cesena 20 95.24 5.75 0 0 1 1 0 0 0
CUADRADO J. udinese 1 4.76 6.00 0 0 1 0 0 0 0
GARICS G. bologna 16 76.19 5.66 0 0 3 0 0 0 0
PERICO G. cagliari 11 52.38 5.91 0 0 2 0 0 0 0
BURDISSO G. roma 2 9.52 5.25 0 0 0 0 0 0 0
COTTAFAVA M. chievo 0 0.00 0.00 0 0 0 0 0 0 0
MONZON L. udinese 0 0.00 0.00 0 0 0 0 0 0 0
RUBIN M. bologna 16 76.19 5.56 0 1 2 0 0 0 0
DELLAFIORE P. parma 2 9.52 6.00 0 0 0 0 0 0 0
SINI S. lecce 2 9.52 5.50 0 0 0 0 0 0 0
CAVANDA L. lazio 3 14.29 5.50 0 0 1 0 0 0 0
RINCON C. chievo 1 4.76 6.00 0 0 0 0 0 0 0
TRAORE juventus 3 14.29 5.33 0 0 1 0 0 0 0
BENALOUANE Y. cesena 10 47.62 5.20 0 0 6 0 0 0 0
ANGELLA G. udinese 3 14.29 5.67 0 0 0 0 0 0 0
DAPRELA F. brescia 5 23.81 5.60 0 0 0 0 0 0 0
MONTELONGO B. milan 0 0.00 0.00 0 0 0 0 0 0 0
ARMERO P. udinese 15 71.43 6.73 2 2 1 0 0 0 0
ANGELO parma 10 47.62 6.20 0 4 3 0 0 0 0
GULAN fiorentina 3 14.29 5.67 0 0 0 0 0 0 0
SORENSEN F. juventus 8 38.10 5.81 0 0 1 0 0 0 0
CAMPORESE M. fiorentina 5 23.81 6.50 0 0 0 0 0 0 0
NATALINO F. inter 4 19.05 5.75 0 0 0 0 0 0 0
ANDELKOVIC S. palermo 1 4.76 5.50 0 0 0 0 0 0 0
SOKRATIS P. milan 1 4.76 6.00 0 0 0 0 0 0 0
centrocampista Squadra p p% mFv gF ass am esp rT rOk rNo
ABDI A. udinese 4 19.05 6.00 0 0 1 0 0 0 0
ALLEGRETTI R. bari 0 0.00 0.00 0 0 0 0 0 0 0
ALMIRON S. bari 14 66.67 5.86 0 2 4 0 0 0 0
ALVAREZ E. bari 19 90.48 5.68 0 1 1 0 0 0 0
AMBROSINI M. milan 13 61.90 6.35 1 1 4 0 0 0 0
AMODIO N. napoli 0 0.00 0.00 0 0 0 0 0 0 0
ANTONELLI F. bari 0 0.00 0.00 0 0 0 0 0 0 0
ARIATTI L. chievo 0 0.00 0.00 0 0 0 0 0 0 0
ASAMOAH K. udinese 21 100.00 6.12 0 1 0 0 0 0 0
BADU E. udinese 3 14.29 5.33 0 0 0 0 0 0 0
BAIOCCO D. brescia 15 71.43 5.87 0 0 2 0 0 0 0
BARRIENTOS P. catania 0 0.00 0.00 0 0 0 0 0 0 0
BARUSSO M. roma 0 0.00 0.00 0 0 0 0 0 0 0
BENTIVOGLIO S. chievo 11 52.38 5.59 0 1 3 0 0 0 0
BERTOLACCI A. lecce 3 14.29 6.00 0 0 0 0 0 0 0
BERTOLO N. palermo 0 0.00 0.00 0 0 0 0 0 0 0
BIAGIANTI M. catania 13 61.90 6.08 0 0 2 0 0 0 0
BIONDINI D. cagliari 21 100.00 6.19 1 2 1 0 0 0 0
BLASI M. napoli 1 4.76 4.50 0 0 0 1 0 0 0
BOGLIACINO M. chievo 17 80.95 5.97 1 1 1 0 0 0 0
BOLATTI M. fiorentina 4 19.05 5.25 0 0 1 0 0 0 0
BRESCIANO M. lazio 6 28.57 5.50 0 0 1 0 0 0 0
BRIGHI M. roma 14 66.67 6.00 1 0 3 0 0 0 0
BROCCHI C. lazio 18 85.71 5.94 0 0 5 0 0 0 0
BUDEL A. brescia 10 47.62 5.90 0 0 0 0 0 0 0
BUSCE’ A. bologna 11 52.38 5.64 0 0 0 0 0 0 0
CAMBIASSO E. inter 17 80.95 6.97 4 0 0 0 0 0 0
CAMORANESI M. juventus 0 0.00 0.00 0 0 0 0 0 0 0
CANDREVA A. parma 18 85.71 6.25 2 1 3 0 0 0 0
CARBONI E. catania 14 66.67 5.86 0 0 2 0 0 0 0
CASARINI F. bologna 19 90.48 5.74 0 2 2 0 0 0 0
CASERTA F. cesena 9 42.86 6.06 0 0 1 0 0 0 0
CERCI A. fiorentina 15 71.43 5.97 1 1 0 0 0 0 0
CIGARINI L. napoli 0 0.00 0.00 0 0 0 0 0 0 0
COLUCCI G. cesena 19 90.48 6.03 1 0 6 1 1 1 0
CONTI D. cagliari 16 76.19 6.69 3 0 4 0 0 0 0
COPPOLA M. lecce 5 23.81 5.60 0 0 1 0 0 0 0
CORDOVA N. brescia 18 85.71 6.44 2 1 2 0 0 0 0
CORREA L. lazio 0 0.00 0.00 0 0 0 0 0 0 0
COSSU A. cagliari 20 95.24 6.40 0 8 5 0 0 0 0
COUTINHO P. inter 12 57.14 5.71 0 1 1 0 0 0 0
D’AGOSTINO G. fiorentina 13 61.90 6.35 2 1 1 0 0 0 0
D’ALESSANDRO M. bari 8 38.10 5.63 0 0 0 0 0 0 0
DE FEUDIS G. cesena 0 0.00 0.00 0 0 0 0 0 0 0
DE ROSSI D. roma 15 71.43 6.03 1 1 2 1 0 0 0
DE VEZZE D. bari 0 0.00 0.00 0 0 0 0 0 0 0
DEL NERO S. lazio 1 4.76 5.50 0 0 0 0 0 0 0
DELVECCHIO G. catania 5 23.81 5.50 0 0 0 0 0 0 0
DESSENA D. sampdoria 9 42.86 5.89 0 1 2 0 0 0 0
DIEGO R. juventus 0 0.00 0.00 0 0 0 0 0 0 0
DO PRADO G. cesena 0 0.00 0.00 0 0 0 0 0 0 0
DONADEL M. fiorentina 17 80.95 6.03 1 0 5 0 0 0 0
DONATI M. bari 17 80.95 5.76 1 1 4 1 0 0 0
DOSSENA A. napoli 18 85.71 6.00 0 4 2 0 0 0 0
DZEMAILI B. parma 14 66.67 5.82 0 0 4 1 0 0 0
EKDAL A. bologna 14 66.67 5.93 1 1 1 0 0 0 0
FATY R. roma 0 0.00 0.00 0 0 0 0 0 0 0
FELIPE MELO d. juventus 16 76.19 6.09 1 0 4 1 1 1 0
FIRMANI F. lazio 0 0.00 0.00 0 0 0 0 0 0 0
FLAMINI M. milan 8 38.10 6.44 1 0 1 0 0 0 0
FOGGIA P. lazio 5 23.81 5.80 0 0 1 0 0 0 0
FORESTIERI F. udinese 0 0.00 0.00 0 0 0 0 0 0 0
GALLOPPA D. parma 0 0.00 0.00 0 0 1 0 0 0 0
GARGANO W. napoli 20 95.24 6.05 0 2 5 0 0 0 0
GATTUSO G. milan 18 85.71 6.00 0 0 6 0 0 0 0
GAZZI A. bari 15 71.43 5.73 0 1 3 0 0 0 0
GIACCHERINI E. cesena 20 95.24 6.25 1 0 2 0 0 0 0
GIACOMAZZI G. lecce 18 85.71 6.03 1 2 3 2 0 0 0
GIMENEZ H. bologna 16 76.19 6.38 3 0 1 0 0 0 0
GIOVINCO S. parma 14 66.67 7.71 5 2 3 0 0 0 0
GOMEZ A. catania 19 90.48 6.53 2 2 1 0 0 0 0
GORZEGNO M. brescia 0 0.00 0.00 0 0 0 0 0 0 0
GUANA R. chievo 8 38.10 5.56 0 0 1 0 0 0 0
GUBERTI S. sampdoria 20 95.24 6.53 5 0 1 0 0 0 0
HAMSIK M. napoli 20 95.24 6.95 7 3 3 0 2 1 1
HETEMAJ P. brescia 16 76.19 6.06 1 0 6 0 0 0 0
INLER G. udinese 21 100.00 6.33 0 1 3 0 0 0 0
IORI M. chievo 0 0.00 0.00 0 0 0 0 0 0 0
ISLA M. udinese 18 85.71 6.50 1 4 1 0 0 0 0
IZCO M. catania 14 66.67 5.93 0 0 0 0 0 0 0
JANKOVIC B. genoa 5 23.81 5.80 0 0 0 0 0 0 0
JOVETIC S. fiorentina 1 4.76 6.00 0 0 0 0 0 0 0
KASAMI P. palermo 4 19.05 6.38 0 1 0 0 0 0 0
KHARJA H. genoa 13 61.90 5.85 0 0 0 0 0 0 0
KOMAN V. sampdoria 18 85.71 5.69 0 0 0 0 0 0 0
KONE P. brescia 17 80.95 6.15 1 0 3 0 0 0 0
KRHIN R. bologna 3 14.29 5.83 0 0 0 0 0 0 0
LANGELLA A. bari 0 0.00 0.00 0 0 0 0 0 0 0
LANZAFAME D. juventus 6 28.57 5.50 0 0 2 0 0 0 0
LAZZARI A. cagliari 12 57.14 6.38 1 3 2 0 0 0 0
LEDESMA C. lazio 18 85.71 6.44 1 2 0 0 0 0 0
LEDESMA P. catania 17 80.95 5.82 0 0 1 1 0 0 0
LIVERANI F. palermo 5 23.81 5.70 0 0 0 0 0 0 0
LJAJIC A. fiorentina 17 80.95 6.26 3 1 2 0 3 2 1
LLAMA C. catania 8 38.10 6.31 0 3 1 0 0 0 0
LUCIANO S. chievo 3 14.29 6.67 0 1 0 0 0 0 0
LUNARDINI F. parma 0 0.00 0.00 0 0 0 0 0 0 0
MAGGIO C. napoli 17 80.95 6.15 2 1 2 0 0 0 0
MANCINI A. inter 2 9.52 6.00 0 0 0 0 0 0 0
MANFREDINI C. lazio 0 0.00 0.00 0 0 0 0 0 0 0
MANNINI D. sampdoria 13 61.90 5.69 0 1 3 0 0 0 0
MANZONI A. parma 0 0.00 0.00 0 0 0 0 0 0 0
MARCHIONNI M. fiorentina 15 71.43 5.70 1 0 2 0 0 0 0
MARCHISIO C. juventus 17 80.95 6.41 2 2 5 0 0 0 0
MARCOLINI M. chievo 15 71.43 5.63 1 0 4 0 1 0 1
MARIGA M. inter 5 23.81 5.50 0 0 1 0 0 0 0
MARQUES J. parma 13 61.90 5.92 0 1 1 0 0 0 0
MARTINEZ J. juventus 4 19.05 6.25 0 0 0 0 0 0 0
MATUZALEM F. lazio 11 52.38 6.05 0 0 1 0 0 0 0
MAURI S. lazio 19 90.48 7.08 4 4 2 0 0 0 0
MEGHNI M. lazio 0 0.00 0.00 0 0 0 0 0 0 0
MENEZ J. roma 17 80.95 6.41 2 1 2 0 0 0 0
MESBAH D. lecce 18 85.71 5.75 0 1 4 0 0 0 0
MESTO G. genoa 19 90.48 6.05 2 0 0 0 0 0 0
MIGLIACCIO G. palermo 20 95.24 6.20 1 0 2 0 0 0 0
MILANETTO O. genoa 19 90.48 6.21 2 1 5 0 0 0 0
MODESTO F. napoli 2 9.52 5.75 0 0 0 0 0 0 0
MONTOLIVO R. fiorentina 13 61.90 5.85 0 1 0 1 0 0 0
MOROSINI P. udinese 0 0.00 0.00 0 0 0 0 0 0 0
MORRONE S. parma 19 90.48 6.08 1 0 3 0 0 0 0
MUDINGAYI G. bologna 17 80.95 6.15 1 1 4 1 0 0 0
MUNARI G. lecce 18 85.71 5.69 0 1 3 1 0 0 0
MUNTARI S. inter 6 28.57 6.25 1 0 2 0 0 0 0
MUTARELLI M. bologna 3 14.29 6.17 0 1 2 0 0 0 0
NAINGGOLAN R. cagliari 21 100.00 6.19 1 0 4 0 0 0 0
NOCERINO A. palermo 21 100.00 6.29 1 3 0 0 0 0 0
OBODO C. udinese 0 0.00 0.00 0 0 0 0 0 0 0
OLIVERA R. lecce 16 76.19 6.47 3 3 6 1 0 0 0
PADALINO M. sampdoria 2 9.52 6.00 0 0 0 0 0 0 0
PALACIO R. genoa 11 52.38 6.50 1 1 1 0 0 0 0
PALLADINO R. genoa 10 47.62 6.00 1 0 0 0 0 0 0
PALOMBO A. sampdoria 19 90.48 6.24 0 1 1 0 0 0 0
PAONESSA G. cesena 1 4.76 6.00 0 0 0 0 0 0 0
PAROLO M. cesena 21 100.00 6.26 2 0 2 0 0 0 0
PASTORE J. palermo 21 100.00 7.67 8 2 2 0 0 0 0
PAZIENZA M. napoli 17 80.95 5.94 1 1 3 2 0 0 0
PEDRO O. sampdoria 5 23.81 6.00 0 0 0 0 0 0 0
PEPE S. juventus 18 85.71 6.25 3 1 7 0 0 0 0
PERROTTA S. roma 13 61.90 6.27 2 0 3 0 0 0 0
PESCE S. catania 4 19.05 5.50 0 0 0 0 0 0 0
PIANGERELLI L. cesena 2 9.52 5.75 0 0 1 0 0 0 0
PINARDI A. cagliari 7 33.33 5.50 0 0 2 0 0 0 0
PINZI G. udinese 18 85.71 5.94 0 3 6 1 0 0 0
PIRLO A. milan 13 61.90 6.46 1 2 3 0 0 0 0
PISANU A. bologna 1 4.76 6.00 0 0 0 0 0 0 0
PIZARRO D. roma 9 42.86 5.78 0 0 1 0 0 0 0
POLI A. sampdoria 9 42.86 5.78 0 0 2 0 0 0 0
POULSEN C. juventus 0 0.00 0.00 0 0 0 0 0 0 0
PULZETTI N. bari 12 57.14 5.21 0 0 2 0 0 0 0
RAJCIC I. bari 0 0.00 0.00 0 0 0 0 0 0 0
RICCHIUTI A. catania 13 61.90 6.23 1 1 0 0 0 0 0
RIGONI L. chievo 17 80.95 5.68 0 1 4 0 0 0 0
RIVAS E. bari 11 52.38 5.86 1 2 0 0 0 0 0
ROMERO G. bari 4 19.05 5.38 0 0 0 0 0 0 0
ROSSI M. genoa 18 85.71 6.25 2 0 2 0 0 0 0
SALAMON B. brescia 0 0.00 0.00 0 0 0 0 0 0 0
SALIHAMIDZIC H. juventus 3 14.29 6.33 0 1 0 0 0 0 0
SAMMARCO P. sampdoria 5 23.81 6.00 0 0 0 0 0 0 0
SANCHEZ A. udinese 20 95.24 7.38 5 2 3 0 0 0 0
SANTANA M. fiorentina 16 76.19 6.69 3 1 1 0 0 0 0
SBAFFO A. chievo 0 0.00 0.00 0 0 0 0 0 0 0
SCAGLIA L. brescia 0 0.00 0.00 0 0 0 0 0 0 0
SCHELOTTO M. cesena 15 71.43 5.93 0 2 1 0 0 0 0
SCIACCA F. catania 2 9.52 5.75 0 0 1 0 0 0 0
SCULLI G. genoa 10 47.62 5.85 0 1 4 0 0 0 0
SEEDORF C. milan 18 85.71 6.19 0 3 0 0 0 0 0
SEMIOLI F. sampdoria 7 33.33 5.79 0 0 0 0 0 0 0
SILIGARDI L. bologna 8 38.10 5.94 0 0 0 0 0 0 0
SIMPLICIO F. roma 14 66.67 6.50 3 0 1 0 0 0 0
SISSOKO M. juventus 11 52.38 5.86 0 1 3 0 0 0 0
SIVAKOV M. cagliari 1 4.76 6.00 0 0 0 0 0 0 0
SNEIJDER W. inter 15 71.43 5.70 0 0 1 0 0 0 0
STANKOVIC D. inter 16 76.19 7.53 5 4 4 0 0 0 0
TADDEI R. roma 5 23.81 6.10 0 0 1 0 0 0 0
THIAGO MOTTA inter 9 42.86 7.28 3 1 1 0 0 0 0
TIAGO M. juventus 0 0.00 0.00 0 0 0 0 0 0 0
TISSONE F. sampdoria 14 66.67 5.89 0 0 1 0 0 0 0
VALIANI F. parma 19 90.48 5.79 0 0 5 0 0 0 0
VANDEN BORRE A. genoa 1 4.76 6.00 0 0 0 0 0 0 0
VARGAS J. fiorentina 13 61.90 5.77 0 1 1 1 0 0 0
VASS A. brescia 10 47.62 5.45 0 0 4 0 0 0 0
VELOSO M. genoa 14 66.67 6.21 0 4 2 0 0 0 0
VERACHI E. cagliari 0 0.00 0.00 0 0 0 0 0 0 0
VIVES G. lecce 17 80.95 5.82 0 2 1 0 0 0 0
ZAMBELLI M. brescia 11 52.38 5.73 0 0 0 0 0 0 0
ZANETTI C. fiorentina 7 33.33 5.57 0 0 1 0 0 0 0
ZANETTI J. inter 18 85.71 5.86 0 0 2 0 0 0 0
ZAPATER A. genoa 0 0.00 0.00 0 0 0 0 0 0 0
ZUCULINI F. genoa 4 19.05 6.00 0 0 0 0 0 0 0
ZUNIGA J. napoli 11 52.38 5.73 0 1 1 0 0 0 0
MARTINHO R. catania 8 38.10 5.56 0 0 1 1 0 0 0
GONZALEZ A. lazio 3 14.29 5.67 0 0 0 0 0 0 0
GROSSMULLER C. lecce 12 57.14 5.88 1 0 3 0 0 0 0
PIATTI I. lecce 15 71.43 6.50 2 2 1 0 0 0 0
RAFINHA genoa 19 90.48 6.00 0 1 5 0 0 0 0
APPIAH S. cesena 14 66.67 5.68 0 0 4 0 0 0 0
HERNANES lazio 20 95.24 7.10 5 4 1 0 1 1 0
GAVILAN M. bologna 1 4.76 6.00 0 0 0 0 0 0 0
LANER S. cagliari 6 28.57 5.75 0 0 0 0 0 0 0
MEMUSHAJ L. chievo 1 4.76 6.00 0 0 0 0 0 0 0
RAMIREZ G. bologna 14 66.67 6.14 1 1 3 0 0 0 0
BOATENG milan 12 57.14 6.46 2 1 5 0 0 0 0
GOBBI M. parma 20 95.24 5.72 0 1 2 0 0 0 0
DANILO P. parma 0 0.00 0.00 0 0 0 0 0 0 0
KRASIC M. juventus 17 80.95 7.12 5 4 2 0 0 0 0
AQUILANI A. juventus 18 85.71 6.61 2 3 0 0 0 0 0
DIAMANTI A. brescia 16 76.19 6.78 4 1 4 1 0 0 0
RIGONI N. palermo 3 14.29 6.00 0 0 0 0 0 0 0
JADID A. parma 0 0.00 0.00 0 0 0 0 0 0 0
BACINOVIC A. palermo 19 90.48 6.18 2 0 6 0 0 0 0
ILICIC J. palermo 20 95.24 7.50 7 3 2 0 0 0 0
YEBDA H. napoli 13 61.90 5.69 0 0 2 0 0 0 0
SOSA J. napoli 10 47.62 5.60 0 1 1 0 0 0 0
FERNANDES G. chievo 18 85.71 5.83 1 0 6 1 0 0 0
PEREZ D. bologna 14 66.67 5.57 0 0 8 0 0 0 0
JIMENEZ L. cesena 14 66.67 6.64 3 1 2 0 0 0 0
GOROBSOV N. cesena 1 4.76 6.00 0 0 0 0 0 0 0
RADOVANOVIC I. bologna 6 28.57 5.25 0 0 2 0 0 0 0
CONSTANT K. chievo 17 80.95 6.06 0 1 4 0 0 0 0
DELLA ROCCA F. bologna 11 52.38 5.86 0 0 2 0 0 0 0
FILIPPINI A. brescia 5 23.81 6.40 0 1 1 0 0 0 0
OBI J. inter 6 28.57 5.92 0 0 0 0 0 0 0
GRECO L. roma 8 38.10 5.81 0 0 3 0 0 0 0
NWANKWO O. inter 3 14.29 5.67 0 0 0 0 0 0 0
MAIELLO R. napoli 2 9.52 5.75 0 0 0 0 0 0 0
CRIMI M. bari 1 4.76 6.50 0 0 0 0 0 0 0
STRASSER milan 3 14.29 7.33 1 0 0 0 0 0 0
STRAMBELLI N. bari 1 4.76 6.50 0 0 0 0 0 0 0
GIANDONATO M. juventus 1 4.76 5.00 0 0 0 1 0 0 0
CALVO T. parma 1 4.76 5.00 0 0 1 0 0 0 0
MERKEL A. milan 2 9.52 6.00 0 0 0 0 0 0 0
KURTIC J. palermo 0 0.00 0.00 0 0 0 0 0 0 0
KUCKA J. genoa 2 9.52 5.75 0 0 1 0 0 0 0
JOAO PEDRO palermo 1 4.76 5.50 0 0 0 0 0 0 0
attaccante Squadra p p% mFv gF ass am esp rT rOk rNo
ACOSTY B. fiorentina 1 4.76 6.00 0 0 0 0 0 0 0
ACQUAFRESCA R. cagliari 16 76.19 6.38 3 0 0 0 0 0 0
ADIYIAH D. milan 0 0.00 0.00 0 0 0 0 0 0 0
ADRIANO L. roma 5 23.81 6.00 0 0 0 0 0 0 0
ALEMAO J. udinese 0 0.00 0.00 0 0 0 0 0 0 0
AMAURI C. juventus 8 38.10 5.63 0 0 0 0 0 0 0
ANTENUCCI M. catania 11 52.38 6.09 1 0 0 0 1 1 0
BABACAR K. fiorentina 6 28.57 5.83 0 0 0 0 0 0 0
BALOTELLI M. inter 0 0.00 0.00 0 0 0 0 0 0 0
BAPTISTA J. roma 5 23.81 5.30 0 0 1 0 0 0 0
BARRETO D. bari 13 61.90 6.65 4 0 0 0 3 2 1
BARRETO G. lazio 0 0.00 0.00 0 0 0 0 0 0 0
BERGOUGNOUX B. lecce 0 0.00 0.00 0 0 0 0 0 0 0
BERNACCI M. bologna 0 0.00 0.00 0 0 0 0 0 0 0
BIABIANY J. inter 13 61.90 5.62 0 2 0 0 0 0 0
BOAKYE Y. genoa 2 9.52 5.75 0 0 1 0 0 0 0
BOGDANI E. cesena 20 95.24 6.22 4 1 3 0 0 0 0
BOJINOV V. parma 15 71.43 5.97 2 1 1 0 0 0 0
BORRIELLO M. roma 21 100.00 7.52 9 0 1 0 1 1 0
BUCCHI C. napoli 0 0.00 0.00 0 0 0 0 0 0 0
CAPUTO F. bari 11 52.38 5.59 1 0 1 0 0 0 0
CARACCIOLO A. brescia 19 90.48 6.79 5 1 2 0 3 3 0
CASSANO A. sampdoria 12 57.14 7.58 4 3 1 0 2 2 0
CASTILLO J. bari 7 33.33 6.00 1 0 2 0 0 0 0
CATELLANI A. catania 0 0.00 0.00 0 0 0 0 0 0 0
CAVANI E. napoli 21 100.00 8.55 14 3 2 0 0 0 0
CHIAVARINI F. cesena 1 4.76 6.00 0 0 0 0 0 0 0
CORRADI B. udinese 4 19.05 6.75 1 0 1 0 0 0 0
CORVIA D. lecce 13 61.90 6.19 2 0 4 0 0 0 0
CRESPO H. parma 20 95.24 6.95 7 0 0 0 2 2 0
DE PAULA M. chievo 4 19.05 5.38 0 0 0 0 0 0 0
DEL PIERO A. juventus 18 85.71 6.81 4 0 0 0 1 1 0
DENIS G. udinese 12 57.14 6.58 3 1 1 0 0 0 0
DESTRO M. genoa 12 57.14 6.38 2 1 3 0 0 0 0
DI NATALE A. udinese 20 95.24 8.50 15 2 1 0 3 2 1
DI VAIO M. bologna 21 100.00 7.69 12 2 3 0 2 0 2
DJURIC M. cesena 0 0.00 0.00 0 0 0 0 0 0 0
ETO’O S. inter 18 85.71 8.36 11 3 1 0 4 3 1
FARIAS D. chievo 1 4.76 6.00 0 0 0 0 0 0 0
FECZESIN R. brescia 1 4.76 5.00 0 0 0 0 0 0 0
FLOCCARI S. lazio 18 85.71 6.97 6 0 0 0 0 0 0
FLORO FLORES A. udinese 13 61.90 6.73 3 2 0 0 0 0 0
FOTI S. sampdoria 0 0.00 0.00 0 0 0 0 0 0 0
GASPARETTO M. chievo 1 4.76 6.00 0 0 0 0 0 0 0
GHEZZAL A. bari 9 42.86 5.44 0 0 1 0 0 0 0
GILARDINO A. fiorentina 19 90.48 7.08 7 2 1 0 0 0 0
GIRARDI D. chievo 1 4.76 6.00 0 0 0 0 0 0 0
GRANOCHE P. chievo 14 66.67 5.93 1 1 2 0 0 0 0
HERNANDEZ A. palermo 6 28.57 5.67 0 0 1 0 0 0 0
HUNTELAAR K. milan 0 0.00 0.00 0 0 0 0 0 0 0
IAQUINTA V. juventus 14 66.67 6.68 4 1 1 0 1 0 1
IGHALO O. cesena 3 14.29 5.83 0 0 0 0 0 0 0
INZAGHI F. milan 4 19.05 7.75 2 0 0 0 0 0 0
JEDA C. lecce 11 52.38 5.73 1 0 3 0 1 1 0
KERLON F. inter 2 9.52 6.00 0 0 0 0 0 0 0
KUTUZOV V. bari 13 61.90 5.69 1 0 0 0 0 0 0
LARRIVEY J. cagliari 0 0.00 0.00 0 0 0 0 0 0 0
LAVEZZI E. napoli 19 90.48 7.42 5 7 3 0 0 0 0
LUCARELLI C. napoli 0 0.00 0.00 0 0 0 0 0 0 0
MACCARONE M. palermo 14 66.67 6.21 2 1 0 0 0 0 0
MALONGA D. cesena 6 28.57 5.92 0 0 0 0 0 0 0
MARILUNGO G. sampdoria 16 76.19 5.91 0 2 3 0 0 0 0
MASCARA G. catania 16 76.19 6.28 1 2 2 0 1 1 0
MATRI A. cagliari 21 100.00 7.07 9 0 3 0 1 1 0
MAXI LOPEZ catania 19 90.48 6.42 5 0 4 1 1 1 0
MEGGIORINI R. bologna 14 66.67 5.89 1 1 2 0 0 0 0
MICCOLI F. palermo 9 42.86 7.78 4 1 0 0 0 0 0
MILITO D. inter 14 66.67 6.50 4 1 1 0 0 0 0
MORIMOTO T. catania 3 14.29 6.17 1 0 1 1 0 0 0
MUTU A. fiorentina 7 33.33 6.43 1 0 2 0 0 0 0
NENE’ A. cagliari 19 90.48 6.29 4 0 5 0 0 0 0
OKAKA S. roma 6 28.57 6.33 1 0 1 0 0 0 0
ORELLANA F. udinese 0 0.00 0.00 0 0 0 0 0 0 0
PALOSCHI A. parma 1 4.76 6.00 0 0 0 0 0 0 0
PANDEV G. inter 18 85.71 5.69 1 2 2 0 0 0 0
PAPA WAIGO N. fiorentina 2 9.52 6.00 0 0 0 0 0 0 0
PAPONI D. bologna 5 23.81 5.50 0 0 0 0 0 0 0
PATO A. milan 11 52.38 7.95 8 0 0 0 0 0 0
PAZZINI G. sampdoria 20 95.24 6.63 6 0 3 0 2 2 0
PELLISSIER S. chievo 18 85.71 7.39 7 2 0 0 1 1 0
PIA’ I. napoli 0 0.00 0.00 0 0 0 0 0 0 0
PINILLA M. palermo 9 42.86 8.11 5 0 1 0 0 0 0
POSSANZINI D. brescia 9 42.86 5.83 0 0 0 0 0 0 0
POZZI N. sampdoria 13 61.90 6.54 3 0 1 0 1 1 0
QUAGLIARELLA F. juventus 16 76.19 7.91 9 0 0 0 0 0 0
RAGATZU D. cagliari 2 9.52 6.00 0 0 0 0 0 0 0
ROCCHI T. lazio 8 38.10 6.44 1 1 0 0 0 0 0
RONALDINHO R. milan 8 38.10 6.69 0 3 0 0 0 0 0
RUDOLF G. genoa 12 57.14 6.29 2 0 0 0 0 0 0
SFORZINI F. udinese 0 0.00 0.00 0 0 0 0 0 0 0
SUAZO D. inter 2 9.52 6.00 0 0 0 0 0 0 0
SUCCI D. palermo 0 0.00 0.00 0 0 0 0 0 0 0
TADDEI R. brescia 1 4.76 6.00 0 0 0 0 0 0 0
TONI L. genoa 18 85.71 6.31 3 1 2 0 1 1 0
TOTTI F. roma 16 76.19 6.53 3 4 1 1 3 2 1
TREZEGUET D. juventus 0 0.00 0.00 0 0 0 0 0 0 0
VARGA R. brescia 0 0.00 0.00 0 0 0 0 0 0 0
VOLPATO R. bari 0 0.00 0.00 0 0 0 0 0 0 0
VUCINIC M. roma 13 61.90 7.50 6 1 3 0 1 1 0
ZALAYETA M. napoli 0 0.00 0.00 0 0 0 0 0 0 0
ZARATE M. lazio 19 90.48 6.76 4 2 0 0 0 0 0
ZIGONI G. genoa 1 4.76 6.00 0 0 0 0 0 0 0
OBINNA V. inter 0 0.00 0.00 0 0 0 0 0 0 0
KOZAK L. lazio 6 28.57 7.08 2 0 1 0 0 0 0
MOSCARDELLI D. chievo 17 80.95 6.62 4 0 1 0 0 0 0
EDER C. brescia 19 90.48 6.08 2 0 2 0 0 0 0
CHEVANTON E. lecce 5 23.81 5.10 0 0 0 1 0 0 0
THEREAU C. chievo 12 57.14 6.17 1 0 1 0 0 0 0
IBRAHIMOVIC Z. milan 19 90.48 8.50 12 8 4 0 3 2 1
HALLENIUS L. genoa 0 0.00 0.00 0 0 0 0 0 0 0
OFERE E. lecce 11 52.38 6.59 3 1 2 0 0 0 0
ROBINHO milan 16 76.19 7.22 6 1 1 0 0 0 0
BUDAN I. catania 8 38.10 5.44 0 0 0 0 0 0 0
DI MICHELE D. lecce 14 66.67 6.61 5 1 3 0 3 0 3
DIMITRU N. napoli 3 14.29 5.50 0 0 0 0 0 0 0
RODRIGUEZ DE M. cesena 2 9.52 5.75 0 0 0 0 0 0 0
ALIBEC D. inter 4 19.05 5.75 0 0 0 0 0 0 0
RANA L. bari 2 9.52 5.25 0 0 0 0 0 0 0
MACHEDA F. sampdoria 3 14.29 5.67 0 0 0 0 0 0 0
GIANNETTI N. juventus 1 4.76 5.50 0 0 0 0 0 0 0
BOSELLI genoa 0 0.00 0.00 0 0 0 0 0 0 0

by Bancaldo.

Categorie:FantaLega Tag: