Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy:获得每组最大n个的平均值_Python_Postgresql_Flask_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python SQLAlchemy:获得每组最大n个的平均值

Python SQLAlchemy:获得每组最大n个的平均值,python,postgresql,flask,sqlalchemy,flask-sqlalchemy,Python,Postgresql,Flask,Sqlalchemy,Flask Sqlalchemy,我正在尝试创建一个Flask应用程序(Postgresql数据库),该应用程序显示单个球员的最新得分,包括球队的平均得分和进球。因此,一名球员可以有多个得分,但在排行榜上,我只想显示她最近的得分,并根据每个球员的最新得分显示整个球队的平均进球数 我的模特 class Player(db.Model): __tablename__ = 'player' id = db.Column(db.Integer, primary_key=True) firstname = db.C

我正在尝试创建一个Flask应用程序(Postgresql数据库),该应用程序显示单个球员的最新得分,包括球队的平均得分和进球。因此,一名球员可以有多个得分,但在排行榜上,我只想显示她最近的得分,并根据每个球员的最新得分显示整个球队的平均进球数

我的模特

class Player(db.Model):
    __tablename__ = 'player'
    id = db.Column(db.Integer, primary_key=True)
    firstname = db.Column(db.String, nullable=False)
    score = db.relationship('Score', backref='player', lazy='dynamic')

    def __init__(self, firstname):
        self.firstname = firstname

    def __repr__(self):
        return '<id {}>'.format(self.id)


class Score(db.Model):
    __tablename__ = 'score'
    id = db.Column(db.Integer, primary_key=True)
    timestamp = db.Column(db.DateTime, nullable=False)
    score = db.Column(db.Integer, nullable=True)
    goals = db.Column(db.Integer, nullable=True)
    player_id = db.Column(db.Integer, db.ForeignKey('player.id'))

    def __init__(self, score, player_id):
        self.timestamp = datetime.now()
        self.score = score
        self.player_id = player_id

    def __repr__(self):
        return '<id {}>'.format(self.id)
“每位球员的最新分数”正确显示每位球员最新输入的分数。但“每位球员平均进球数”返回一个错误:

AttributeError:“BaseQuery”对象没有属性“func”

如何查询所有球员的平均进球数,仅查询每个球员最近输入的得分

更新: 我觉得我与以下方面更接近:

#Average goals per player
avarage_goals = db.session.query(Player, Score, func.avg(Score.goals)).\
  join(Score).\
  distinct(Player.id).\
  filter(Player.user_id == current_user.id).\
  order_by(Player.id, Score.timestamp.desc()).scalar()

但现在还没有。努力让func.avg与distinct和order__by一起工作。

如果我理解正确,那么您只需使用每个玩家的最新分数作为子查询并平均结果。由于您将查询对象存储为每个玩家的最新分数,因此您可以使用:

@app.route('/', methods=['GET', 'POST'])
@login_required
def home():

    # Latest score per player
    latest_scores_per_player = db.session.query(Player, Score).\
        join(Score).\
        distinct(Player.id).\
        filter(Player.user_id == current_user.id).\
        order_by(Player.id, Score.timestamp.desc())

    # Create a subquery that queries only the goals from the groups
    subq = latest_scores_per_player.\
        with_entities(Score.goals).\
        subquery()

    #Average goals *across all players*
    average_goals = db.session.query(func.avg(subq.c.goals)).scalar()

    return render_template(
        'home.html',
        latest_scores_per_player=latest_scores_per_player,
        avarage_goals=average_goals)
这将对DB进行两次跳闸。您还可以查询每个玩家最近的得分结果,并用Python计算平均值。使用最新版本的Python,您可以使用以下模块:

或者自己动手(如果使用Python 2,则添加必要的浮点转换):


太好了,谢谢Ilja!就像Python 3中的统计解决方案一样。
@app.route('/', methods=['GET', 'POST'])
@login_required
def home():

    # Latest score per player
    latest_scores_per_player = db.session.query(Player, Score).\
        join(Score).\
        distinct(Player.id).\
        filter(Player.user_id == current_user.id).\
        order_by(Player.id, Score.timestamp.desc())

    # Create a subquery that queries only the goals from the groups
    subq = latest_scores_per_player.\
        with_entities(Score.goals).\
        subquery()

    #Average goals *across all players*
    average_goals = db.session.query(func.avg(subq.c.goals)).scalar()

    return render_template(
        'home.html',
        latest_scores_per_player=latest_scores_per_player,
        avarage_goals=average_goals)
import statistics

@app.route('/', methods=['GET', 'POST'])
@login_required
def home():

    # Latest score per player
    # Materialize the results to a list here for calculating average
    latest_scores_per_player = db.session.query(Player, Score).\
        join(Score).\
        distinct(Player.id).\
        filter(Player.user_id == current_user.id).\
        order_by(Player.id, Score.timestamp.desc()).\
        all()

    average_goals = None
    if latest_scores_per_player:
        average_goals = statistics.mean(
            score.goals for player, score in latest_scores_per_player)

    return render_template(
        'home.html',
        latest_scores_per_player=latest_scores_per_player,
        avarage_goals=average_goals)
    average_goals = None
    if latest_scores_per_player:
        average_goals = sum(
            score.goals for player, score in latest_scores_per_player)
        average_goals /= len(latest_scores_per_player)