使用两个不同且独立的表进行计算的最佳方法是什么?
What is the best way to calculate with two different and independent tables?
我有两个不同的 table 位于两个独立的数据库中,我正在尝试找出进行某些计算的最佳方法。
第一个 table 包含列:站点 (varchar 256)、网站流量(整数)、站点类型 (varchar 256)。第二个 table 包含:网站 (varchar 256)、每月费用 (float)、网站类型 (varchar 256)。
到目前为止,我已经有了查询结果,但对如何进行实际分析感到困惑,这基本上包括在使用网站时将网站流量乘以每月费用(一个简化示例)和网站类型作为关键字。
现在,如果它们是同一个数据库中的两个不同的 table,我可以只进行简单的连接并继续我的快乐之路。然而,这是不可能的。因此,我想知道处理这个问题的最 pythonic 方法是什么。
我的头脑风暴包括将第一个查询导出为 csv,然后在第二个数据库中创建临时 table 并在那里进行分析。如果有更好的方法来完成 python 中的工作,请告诉我。
我的代码:
import pyodbc
conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};SERVER=xyx;DATABASE=xxy;UID=xyx;PWD=xyx')
cursor = conn.cursor()
cursor.execute("select * from sites;")
rows = cursor.fetchall()
with open('file.txt' , 'w') as f:
for row in rows:
csv.writer(f).writerows(row)
cursor.close()
del cursor
conn.close()
conn = pyodbc.connect(driver='{Vertica}', server='blah', database='yys', port=5433,
uid='zzx', pwd='zzx')
cursor = conn.cursor()
cursor.execute("select * from table1;")
with open('otherfile.txt' , 'w') as f:
for row in rows:
csv.writer(f).writerows(row)
cursor.close()
del cursor
conn.close()
考虑使用 Python 的数据分析包 pandas,它可以将来自 SQL 数据库的查询读入数据帧。然后通过唯一字段合并两个数据框,或者如果列在名称中对齐则连接两个数据框。
此外,您可以 运行 其他复杂的分析(即 groupby, pivot_table) and output dataframe with to_csv or to_sql 作为 SQL 数据库中的新 table。
import pandas as pd
import pyodbc
# FIRST DATA FRAME
conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};\
SERVER=xyx;DATABASE=xxy;UID=xyx;PWD=xyx')
ssqlsite_df = pd.read_sql("select * from sites;", conn)
conn.close()
# SECOND DATA FRAME
conn = pyodbc.connect(driver='{Vertica}', server='blah', \
database='yys', port=5433, uid='zzx', pwd='zzx')
vertsite_df = pd.read_sql("select * from table1;", conn)
conn.close()
# MERGE DATA FRAMES
finaldf = merge(ssqlsite_df, vertsite_df, on=['SiteName', 'TypeOfSite'])
# CONCATENATE/STACK DATA FRAMES
# (ASSUMING COLUMNS ARE SAME NAME, ADJUST IN QUERY FIELD ALIASES)
finaldf = concat([ssqlsite_df, vertsite_df], axis=0)
print(finaldf.head(10)) # FIRST TEN ROWS
# DATA ANALYSIS
# CALCULATED COLUMN
finaldf['SiteCost'] = finaldf['WebsiteTraffic'].convert_objects(convert_numeric=True) * \
finaldf['MonthlyCost'].convert_objects(convert_numeric=True)
...
# OUTPUT DATA FRAME
# CREATES NEW TABLE IF PERMISSION GRANTED. BE SURE TO RE-OPEN CONNECTION.
# finaldf.to_sql('SiteAnalysis', conn)
finaldf.to_csv('C:\Path\To\SiteAnalysis.csv')
我有两个不同的 table 位于两个独立的数据库中,我正在尝试找出进行某些计算的最佳方法。
第一个 table 包含列:站点 (varchar 256)、网站流量(整数)、站点类型 (varchar 256)。第二个 table 包含:网站 (varchar 256)、每月费用 (float)、网站类型 (varchar 256)。
到目前为止,我已经有了查询结果,但对如何进行实际分析感到困惑,这基本上包括在使用网站时将网站流量乘以每月费用(一个简化示例)和网站类型作为关键字。
现在,如果它们是同一个数据库中的两个不同的 table,我可以只进行简单的连接并继续我的快乐之路。然而,这是不可能的。因此,我想知道处理这个问题的最 pythonic 方法是什么。
我的头脑风暴包括将第一个查询导出为 csv,然后在第二个数据库中创建临时 table 并在那里进行分析。如果有更好的方法来完成 python 中的工作,请告诉我。
我的代码:
import pyodbc
conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};SERVER=xyx;DATABASE=xxy;UID=xyx;PWD=xyx')
cursor = conn.cursor()
cursor.execute("select * from sites;")
rows = cursor.fetchall()
with open('file.txt' , 'w') as f:
for row in rows:
csv.writer(f).writerows(row)
cursor.close()
del cursor
conn.close()
conn = pyodbc.connect(driver='{Vertica}', server='blah', database='yys', port=5433,
uid='zzx', pwd='zzx')
cursor = conn.cursor()
cursor.execute("select * from table1;")
with open('otherfile.txt' , 'w') as f:
for row in rows:
csv.writer(f).writerows(row)
cursor.close()
del cursor
conn.close()
考虑使用 Python 的数据分析包 pandas,它可以将来自 SQL 数据库的查询读入数据帧。然后通过唯一字段合并两个数据框,或者如果列在名称中对齐则连接两个数据框。
此外,您可以 运行 其他复杂的分析(即 groupby, pivot_table) and output dataframe with to_csv or to_sql 作为 SQL 数据库中的新 table。
import pandas as pd
import pyodbc
# FIRST DATA FRAME
conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};\
SERVER=xyx;DATABASE=xxy;UID=xyx;PWD=xyx')
ssqlsite_df = pd.read_sql("select * from sites;", conn)
conn.close()
# SECOND DATA FRAME
conn = pyodbc.connect(driver='{Vertica}', server='blah', \
database='yys', port=5433, uid='zzx', pwd='zzx')
vertsite_df = pd.read_sql("select * from table1;", conn)
conn.close()
# MERGE DATA FRAMES
finaldf = merge(ssqlsite_df, vertsite_df, on=['SiteName', 'TypeOfSite'])
# CONCATENATE/STACK DATA FRAMES
# (ASSUMING COLUMNS ARE SAME NAME, ADJUST IN QUERY FIELD ALIASES)
finaldf = concat([ssqlsite_df, vertsite_df], axis=0)
print(finaldf.head(10)) # FIRST TEN ROWS
# DATA ANALYSIS
# CALCULATED COLUMN
finaldf['SiteCost'] = finaldf['WebsiteTraffic'].convert_objects(convert_numeric=True) * \
finaldf['MonthlyCost'].convert_objects(convert_numeric=True)
...
# OUTPUT DATA FRAME
# CREATES NEW TABLE IF PERMISSION GRANTED. BE SURE TO RE-OPEN CONNECTION.
# finaldf.to_sql('SiteAnalysis', conn)
finaldf.to_csv('C:\Path\To\SiteAnalysis.csv')