在 SQL Alchemy 中创建交叉表查询
Creating a Cross Tab Query in SQL Alchemy
我正在阅读 google 和 sqlalchmey 文档,但找不到任何类型的内置功能可以采用标准 sequel 格式 table 并将其转换为像 Microsoft Access 这样的交叉表查询。
我过去曾在使用 excel 和 Microsoft Access 时创建过“交叉表”查询。下面是示例中的 sequel 代码:
TRANSFORM Min([Fixed Day-19_Month-8_142040].VoltageAPhase) AS MinOfVoltageAPhase
SELECT [Fixed Day-19_Month-8_142040].Substation, [Fixed Day-19_Month-8_142040].Feeder, [Fixed Day-19_Month-8_142040].MeterID
FROM [Fixed Day-19_Month-8_142040]
GROUP BY [Fixed Day-19_Month-8_142040].Substation, [Fixed Day-19_Month-8_142040].Feeder, [Fixed Day-19_Month-8_142040].MeterID
PIVOT [Fixed Day-19_Month-8_142040].Date;
我在 sequel 方面非常不熟练,我能够编写它的唯一方法是在访问中生成它。
我的问题是:“因为 SQL alchemy python 代码实际上只是使用 python functions/methods 调用或生成 sequel 代码的好方法, 有没有办法我可以使用 SQL 炼金术调用生成 sequel 代码(在上面的块中)的自定义查询来进行交叉表查询?显然,我将不得不更改一些sequel 用正确的字段和名称插入它的代码,但关键字应该相同对吗?
另一个问题是...除了 returning table 中每个条目的对象之外,我还需要字段名称...我认为这称为“元-数据”?最终目标是一旦我有了这些信息,我想使用另一个包输出到 excel 或 csv。
已更新
好的,Van 建议使用 pandas 我认为是可行的方法,我目前正在弄清楚如何创建交叉表:
def OnCSVfile(self,event):
query = session.query(Exception).filter_by(company = self.company)
data_frame = pandas.read_sql(query.statement,query.session.bind) ## Get data frame in pandas
pivot = data_frame.crosstab()
所以我一直在阅读您提供的 pandas link 并且对参数有疑问。
pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True)
因为我在数据框对象之外调用“交叉表”,所以我假设数据框必须有某种内置方式来识别列名和行名。对于 index,我会传入一个字符串列表,指定要在行中列出哪些字段? 列 我会传入一个字符串列表,指定我想要列中的哪个字段?根据我对交叉表查询的了解,列 应该只有一个规范字段,对吗?对于值,我想要最小函数,所以我必须将一些参数传递给 return 最小值。目前正在寻找答案。
所以如果我的平面数据框中有以下字段(我的原始 Sequel 查询)。
Name, Date and Rank
我想按如下方式旋转数据:
Name = Row of Crosstab
Date = Column of Crosstab
Rank = Min Value of Crosstab
函数调用是否类似于:
data_frame.crosstab(['Name'], ['Date'], values=['Rank'],aggfunc = min)
我试过下面这段代码:
query = session.query(Exception)
data_frame = pandas.read_sql(query.statement,query.session.bind)
row_list = pandas.Series(['meter_form'])
col_list = pandas.Series(['company'])
print row_list
pivot = data_frame.crosstab(row_list,col_list)
但是我收到关于 data_frame 没有属性交叉表的错误:
我想这对您来说可能是一次太多的新信息。尽管如此,我会以完全不同的方式处理它。我基本上会使用 pandas python 库来完成所有任务:
检索数据:由于您已经在使用sqlalchemy
,您可以简单地查询数据库以获取您需要的数据(扁平,没有任何 CROSSTAB/PIVOT)
变换:把它变成pandas.DataFrame
。例如,像这样:
import pandas as pd
query = session.query(FixedDay...)
df = pd.read_sql(query.statement, query.session.bind)
Pivot:调用pivot = df.crosstab(...)
在内存中创建一个pivot。有关详细信息,请参阅 pd.crosstab。
导出:使用DataFrame.to_excel
将其保存到Excel/csv
我正在阅读 google 和 sqlalchmey 文档,但找不到任何类型的内置功能可以采用标准 sequel 格式 table 并将其转换为像 Microsoft Access 这样的交叉表查询。
我过去曾在使用 excel 和 Microsoft Access 时创建过“交叉表”查询。下面是示例中的 sequel 代码:
TRANSFORM Min([Fixed Day-19_Month-8_142040].VoltageAPhase) AS MinOfVoltageAPhase
SELECT [Fixed Day-19_Month-8_142040].Substation, [Fixed Day-19_Month-8_142040].Feeder, [Fixed Day-19_Month-8_142040].MeterID
FROM [Fixed Day-19_Month-8_142040]
GROUP BY [Fixed Day-19_Month-8_142040].Substation, [Fixed Day-19_Month-8_142040].Feeder, [Fixed Day-19_Month-8_142040].MeterID
PIVOT [Fixed Day-19_Month-8_142040].Date;
我在 sequel 方面非常不熟练,我能够编写它的唯一方法是在访问中生成它。
我的问题是:“因为 SQL alchemy python 代码实际上只是使用 python functions/methods 调用或生成 sequel 代码的好方法, 有没有办法我可以使用 SQL 炼金术调用生成 sequel 代码(在上面的块中)的自定义查询来进行交叉表查询?显然,我将不得不更改一些sequel 用正确的字段和名称插入它的代码,但关键字应该相同对吗?
另一个问题是...除了 returning table 中每个条目的对象之外,我还需要字段名称...我认为这称为“元-数据”?最终目标是一旦我有了这些信息,我想使用另一个包输出到 excel 或 csv。
已更新
好的,Van 建议使用 pandas 我认为是可行的方法,我目前正在弄清楚如何创建交叉表:
def OnCSVfile(self,event):
query = session.query(Exception).filter_by(company = self.company)
data_frame = pandas.read_sql(query.statement,query.session.bind) ## Get data frame in pandas
pivot = data_frame.crosstab()
所以我一直在阅读您提供的 pandas link 并且对参数有疑问。
pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True)
因为我在数据框对象之外调用“交叉表”,所以我假设数据框必须有某种内置方式来识别列名和行名。对于 index,我会传入一个字符串列表,指定要在行中列出哪些字段? 列 我会传入一个字符串列表,指定我想要列中的哪个字段?根据我对交叉表查询的了解,列 应该只有一个规范字段,对吗?对于值,我想要最小函数,所以我必须将一些参数传递给 return 最小值。目前正在寻找答案。
所以如果我的平面数据框中有以下字段(我的原始 Sequel 查询)。
Name, Date and Rank
我想按如下方式旋转数据:
Name = Row of Crosstab
Date = Column of Crosstab
Rank = Min Value of Crosstab
函数调用是否类似于:
data_frame.crosstab(['Name'], ['Date'], values=['Rank'],aggfunc = min)
我试过下面这段代码:
query = session.query(Exception)
data_frame = pandas.read_sql(query.statement,query.session.bind)
row_list = pandas.Series(['meter_form'])
col_list = pandas.Series(['company'])
print row_list
pivot = data_frame.crosstab(row_list,col_list)
但是我收到关于 data_frame 没有属性交叉表的错误:
我想这对您来说可能是一次太多的新信息。尽管如此,我会以完全不同的方式处理它。我基本上会使用 pandas python 库来完成所有任务:
检索数据:由于您已经在使用
sqlalchemy
,您可以简单地查询数据库以获取您需要的数据(扁平,没有任何 CROSSTAB/PIVOT)变换:把它变成
pandas.DataFrame
。例如,像这样:import pandas as pd query = session.query(FixedDay...) df = pd.read_sql(query.statement, query.session.bind)
Pivot:调用
pivot = df.crosstab(...)
在内存中创建一个pivot。有关详细信息,请参阅 pd.crosstab。导出:使用
DataFrame.to_excel
将其保存到Excel/csv