Python-将数据从Microsoft.AnalysisServices(System.Data.DataTable对象)解析为熊猫DataFrame

问题描述 投票:0回答:1

[在工作中,我们有一个Microsoft SQL Server Analysis Services连接(多维数据集),我们可以通过该连接进行查询以获取Excel文件中的值。我试图通过直接使用Python连接到多维数据集来对工程进行逆向工程。我的脚本(从Execute query on SQL Server Analysis Services with IronPython启发而来)是这样的:

import pandas as pd
import pyodbc as sq
import clr

clr.AddReference(r"C:\Program Files (x86)\Microsoft Office\root\vfs\ProgramFilesX86\Microsoft.NET\ADOMD.NET\130\Microsoft.AnalysisServices.AdomdClient.dll")
clr.AddReference("System.Data")

from Microsoft.AnalysisServices.AdomdClient import AdomdConnection , AdomdDataAdapter
from System.Data import DataSet

con = AdomdConnection("Connection String")
con.Open()
query = con.CreateCommand()
query.CommandText = "My Query"

adp = AdomdDataAdapter(query)
Greeks =  DataSet()
adp.Fill(Greeks)
con.Close()

在我能够连接,执行查询并检索我的数据集的情况下,它能很好地工作。

问题是,现在我试图对数据进行一些操作,而这些操作无法直接在DataSet中完成,因此我将其值解析为DataFrame以在其中进行操作。我正在尝试找出一种方法,可以将所得的System.Data.DataTable对象中的值解析为pandas DataFrame

我当前用于将值解析到DataFrame中的脚本是这样的:

Rows = Greeks.Tables[0].Rows.Count Columns = Greeks.Tables[0].Columns.Count Greeks_DF = pd.DataFrame(index= list(range(0,Rows)),columns=list(range(0,Columns))) for row in list(range(0,Rows)): for column in list(range(0,Columns)): Greeks_DF.iloc[row,column] = Greeks.Tables[0].Rows[row][column]

它可以工作,但是比我想要的慢,尽管对于具有13880行乘39列的数据集来说相当快。为了提高效率,寻找一种在单行(或多行)线路/语句中执行此操作而不循环的方法。我一直在寻找,但是到处都可以找到与我已经拥有的解决方案非常相似的解决方案。

编辑:

[当我尝试做时:

Greeks_DF = pd.DataFrame(Greeks.Tables[0])

它给我一个错误,提示“ TypeError:非序列迭代”

是否有将Datatable转换为可在DataFrame中传递的可迭代对象的方法?

谢谢!

python pandas datatable dataset ssas
1个回答
0
投票
尝试给Pyadomd尝试一下。

Pyadomd

© www.soinside.com 2019 - 2024. All rights reserved.