У меня есть 4 таблицы, которые называются метаданными файлов, рейтинги игроков, характеристики статистики и демонстрационные функции.Метаданные одного файла могут иметь несколько рангов игрока (каждый ранг игрока представляет игрока), а ранг игрока может иметь функцию статистики или демонстрации (или оба, если is_demo true).Мне нужно эффективно читать статистику игрока, которая является либо функцией статистики, либо демонстрационной функцией (если флаг is_demo в метаданных файла имеет значение true, получить демонстрационную функцию, в противном случае функцию статистики) во фрейм данных pandas.
Вот мой запрос сейчас:
session = self.session()
query = session.query(self.db_model.file_metadata)
query = query.options(
joinedload(self.db_model.file_metadata.player_rank)
.joinedload(self.db_model.player_rank.stat_features))\
.options(joinedload(self.db_model.file_metadata.player_rank)
.joinedload(self.db_model.player_rank.demo_features))
query = query.filter(case(
[
(self.db_model.file_metadata.is_demo is True,
self.db_model.player_rank.demo_features),
],
else_=self.db_model.player_rank.stat_features
))
chunks = pd.read_sql(query.statement, con=query.session.bind,
chunksize=100)
df = pd.DataFrame()
for chunk in tqdm(chunks):
df = pd.concat([df, chunk])
session.close()
Дизайн базы данных:
class file_metadata(base):
__tablename__ = 'file_metadata'
unique_identifier = Column(BigInteger, primary_key=True)
filename = Column(String, unique=True)
date = Column(DateTime)
is_demo = Column(Boolean)
version = Column(String) # version of analyzer
server_type = Column(String)
tie_situation = Column(Boolean)
player_ranks = relationship("player_rank", lazy='subquery',
back_populates="file_metadata", uselist=True,
cascade="delete")
class player_rank(base):
__tablename__ = 'player_rank'
# id = Column(Integer, primary_key=True)
Date = Column(BigInteger, primary_key=True)
Name = Column(String, primary_key=True)
mu = Column(Float(precision=3))
sigma = Column(Float(precision=3))
Won = Column(Integer)
file_metadata_id = Column(BigInteger, ForeignKey('file_metadata.unique_identifier'))
file_metadata = relationship("file_metadata", lazy='subquery',
back_populates="player_ranks", uselist=False)
stat_features = relationship("stat_features", lazy='subquery', uselist=False,
back_populates="player_ranking")
demo_features = relationship("demo_features", lazy='subquery',
uselist=False, back_populates="player_ranking")
class stat_features(base, CommonEqualityMixin):
__tablename__ = 'stat_features'
id = Column(Integer, primary_key=True)
Name = Column(String)
Date = Column(BigInteger)
Pistol_Rounds_Won_Percentage = Column(Float(precision=3))
HS_Percentage = Column(Float(precision=3))
Clutches_Won = Column(Integer)
ADR = Column(Float(precision=3))
FPR = Column(Float(precision=3))
APR = Column(Float(precision=3))
K_D_Diff_Round = Column(Float(precision=3))
Flash_Assists_Round = Column(Float(precision=3))
Blind_Players_Killed_Round = Column(Float(precision=3))
Blind_Kills = Column(Float(precision=3))
Grenade_Damage_Round = Column(Float(precision=3))
Fire_Damage_Round = Column(Float(precision=3))
Time_Flashing_Opponents_Round = Column(Float(precision=3))
Accuracy = Column(Float(precision=3))
Num_Times_Trader = Column(Float(precision=3))
Num_Times_Tradee = Column(Float(precision=3))
KAST = Column(Float(precision=3))
Ratings = Column(Float(precision=3), default=-1)
Won = Column(Integer)
player_ranking = relationship("player_rank", foreign_keys=[Name, Date], lazy='subquery',
uselist=False, back_populates="stat_features")
__table_args__ = (ForeignKeyConstraint([Name, Date], [player_rank.Name, player_rank.Date]),)
class demo_features(base, CommonEqualityMixin):
__tablename__ = 'demo_features'
id = Column(Integer, primary_key=True)
Name = Column(String)
Date = Column(BigInteger)
Pistol_Rounds_Won_Percentage = Column(Float(precision=3))
HS_Percentage = Column(Float(precision=3))
Clutches_Won = Column(Integer)
ADR = Column(Float(precision=3))
FPR = Column(Float(precision=3))
APR = Column(Float(precision=3))
K_D_Diff_Round = Column(Float(precision=3))
Flash_Assists_Round = Column(Float(precision=3))
Blind_Players_Killed_Round = Column(Float(precision=3))
Blind_Kills = Column(Float(precision=3))
Grenade_Damage_Round = Column(Float(precision=3))
Fire_Damage_Round = Column(Float(precision=3))
Time_Flashing_Opponents_Round = Column(Float(precision=3))
Accuracy = Column(Float(precision=3))
Num_Times_Trader = Column(Float(precision=3))
Num_Times_Tradee = Column(Float(precision=3))
KAST = Column(Float(precision=3))
Ratings = Column(Float(precision=3), default=-1)
Won = Column(Integer)
player_ranking = relationship("player_rank", foreign_keys=[Name, Date], lazy='subquery',
uselist=False, back_populates="demo_features")
__table_args__ = (ForeignKeyConstraint([Name, Date], [player_rank.Name, player_rank.Date]),)