我认为最好的方法是为关系(别名 -> 目标列)或config file 创建一个表。这里只是一个例子,但我想你可以理解我的做法:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base(bind=engine)
class ClientAlias(Base):
# table for dynamic aliases
__tablename__ = 'client_alias'
id = Column(Integer, primary_key=True)
alias = Column(String)
target = Column(String)
class FinalTable(Base):
# result table with standardized columns - for all clients
__tablename__ = 'final_table'
id = Column(Integer, primary_key=True)
client_id = Column(Integer)
source = Column(String)
medium = Column(String)
Base.metadata.create_all(engine)
def prepare_aliases():
"""
insert default mapping:
Src -> source, Came From -> source, Med -> medium, etc...
"""
for target, aliases in (
('source', ('Source', 'Src', 'Came From'), ),
('medium', ('Medium', 'Med', 'Format'), ),
):
for alias in aliases:
session.add(ClientAlias(target=target, alias=alias))
session.commit()
# insert a few records with client column aliases
prepare_aliases()
# example processing
dfs = (
# first client with specific columns
pd.DataFrame.from_dict({
'client_id': (1, 1, ),
'Source': ('Source11', 'Source12'),
'Medium': ('Medium11', 'Medium12'),
}),
# second client with specific columns
pd.DataFrame.from_dict({
'client_id': (2, 2, ),
'Src': ('Source12', 'Source22'),
'Med': ('Medium12', 'Medium22'),
}),
# one more client with specific columns
pd.DataFrame.from_dict({
'client_id': (3, 3, ),
'Came From': ('Source13', 'Source23'),
'Format': ('Medium13', 'Medium23'),
}),
# etc...
)
# create columns map {Src -> source, Came From -> source, ect...}
columns = {c.alias: c.target for c in session.query(ClientAlias).all()}
for df in dfs:
df.rename(columns=columns, inplace=True)
# union and insert into final table
df = pd.concat(dfs, sort=False, ignore_index=True)
df.to_sql(
con=engine,
name=FinalTable.__tablename__,
index=False,
if_exists='append'
)
因此,如果您有新客户或会有一些变化,您可以在client_alias(或config file)中添加新记录。无需更改代码和部署,一切都可以正常工作。无论如何,这只是示例 - 您可以根据需要自定义它。