在SQL Alchemy中创建交叉表查询

时间:2015-08-20 19:25:15

标签: python pandas sqlalchemy pivot-table crosstab

我正在谷歌和sqlalchmey文档上做一些阅读,但找不到任何类型的内置功能,可以采用标准的续集格式表并将其转换为像Microsoft Access这样的交叉表查询。

我过去使用excel和microsoft access创建了" cross tab"查询。以下是示例中的续集代码:

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;

关于续集我是非常不熟练的,我能写这篇文章的唯一方法就是在访问中生成它。

我的问题是:"由于SQL alchemy python代码实际上只是使用python函数/方法调用或生成续集代码的好方法,有没有办法我可以使用SQL alchemy来调用生成的自定义查询续集代码(在上面的块中)进行交叉表查询?显然,我将不得不改变一些续集代码,用正确的字段和名称来制作它,但关键字应该是相同的吗?

另一个问题是......除了为表中的每个条目返回对象之外,我还需要字段名称......我认为这被称为"元数据"?最终目标是,一旦我获得了这些信息,我就想使用另一个包输出到excel或csv。

已更新

好的,所以Van建议使用大熊猫我认为是要走的路,我目前正在弄清楚如何创建交叉表:

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链接,并对参数有疑问。

pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True)

因为,我打电话给#34;交叉号"关于数据框对象,我假设必须有某种内置方式,数据框可以识别列和行名称。对于索引,我会传入一个字符串列表,指定哪些字段要按行列表? 我会传入一个字符串列表,用于指定列中我想要哪个字段?根据我对交叉表查询的了解,只应该有一个规范字段吗?对于值,我想要最小函数,所以我必须传递一些参数来返回最小值。目前正在寻找答案。

因此,如果我的平面数据框中有以下字段(我的原始续集查询)。

  

姓名,日期和等级

我想按如下方式转动数据:

  

名称=交叉表的行

     

日期=交叉表的列

     

Rank =交叉表的最小值

函数调用是否类似于:

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没有属性cross tab的错误:

enter image description here

1 个答案:

答案 0 :(得分:2)

我想这可能会为您提供太多新信息。尽管如此,我会以完全不同的方式处理它。我基本上会使用pandas python库来完成所有任务:

  1. 检索数据:由于您已经使用sqlalchemy,因此您只需在数据库中查询所需数据(平坦,无任何CROSSTAB / PIVOT)< / p>

  2. 转换:将其放入pandas.DataFrame。例如,像这样:

    import pandas as pd
    
    query = session.query(FixedDay...)
    df = pd.read_sql(query.statement, query.session.bind)
    
  3. 数据透视:致电pivot = df.crosstab(...)在内存中创建 pivot 。有关详细信息,请参阅pd.crosstab

  4. 导出:使用DataFrame.to_excel

  5. 将其保存到Excel / csv