python - mysql上的表关系以计算新字段
问题描述
我将解释我的结构,但首先我会告诉我需要什么。我有一张带有预测的表格,还有一张带有真实情况数据的表格。我需要计算forecast - happened
场。两个表都有坐标字段(经度、纬度)、日期和降水。预测还有一个字段,即进行预测的日期。
class Real(Base):
__tablename__ = 'tbl_real'
id = Column(Integer, primary_key=True, autoincrement=True)
lon = Column(Integer,index=True)
lat = Column(Integer,index=True)
date = Column(DATE,index=True)
prec = Column(Integer)
class Forecast(Base):
__tablename__ = 'tbl_forecast'
id = Column(Integer, primary_key=True, autoincrement=True)
real_id = Column(Integer,ForeignKey('tbl_real.id'))
date_pub = Column(DATE,index=True)
date_prev = Column(DATE,index=True)
lon = Column(Integer,index=True)
lat = Column(Integer,index=True)
prec = Column(Integer,)
class Error(Base):
__tablename__ = 'tbl_error'
id = Column(Integer, primary_key=True)
forecast_id = Column(Integer,ForeignKey('tbl_forecast.id'))
real_id = Column(Integer,ForeignKey('tbl_realizado.id'))
error = Column(Integer)
要插入Error
我正在使用的数据:
def insert_error_by_coord_data(self,real_id,lon,lat,date,prec,session):
ec_ext = session.query(Forecast.id,Forecast.prec).filter((Forecast.lon == lon)&
(Extendido.lat == lat)&
(Extendido.date_prev == date)).all()
data = list()
for row in ec_ext:
id = row[0]
if session.query(Erro).get(id) is None:
prev = comb[1]
error = prev - prec
data.append(Erro(id = id,
ext_id = id,
real_id = real_id,
error= error))
if len(data) > 0:
session.bulk_save_objects(objects=data)
session.commit()
session.close()
每个预测文件有 40 个data_prev
和 25000 个坐标。每个真实文件有 25000 个坐标。我想了大约 2 个小时,但我只有 80000 行Error
。插入记录开始需要 1.03 秒,现在是 3.04 秒。我正在使用 12 cpu multiprocessing
,如果您认为错误在这里,请指出,我可以显示代码,但我认为不是。问题是我应该做些什么不同的事情?
解决方案
推荐阅读
- css - 在 Shopify 的主页上添加横幅
- html - 为什么选中复选框时图像不滑动?
- node.js - Expressjs - 发送后无法设置标题
- flutter - 如何在 dio resquest 中传递 cookie/会话 ID?
- apache-spark - Spark:编码器的默认值
- java - 在 Spring Boot 中从项目 a-> 项目 b 中分级导入类
- r - R NLS 收敛问题
- qt - 为什么 Qt Creator 看不到 QCoreApplication
- flutter - 在颤振中通过 BlocProvider 在 initState 中创建 Bloc 的实例
- java - 如何在java中获取JSONObject的键和值