3

有一个关于如何使用 python blaze 模块进行分析的简单问题。所以,我正在尝试执行此代码:

from blaze import SQL,Table
from sqlalchemy import create_engine
from scipy.stats import pearsonr
sql_path=r'/path/to/my/database.db'
e=create_engine('sqlite:///%s'%sql_path)
blz_sql=SQL(e,'analysis_dataframe')
blz_frame=Table(blz_sql)
blz_cols=blz_frame.columns
corr=pearsonr(blz_frame[blz_cols[0]],blz_frame[blz_cols[10]])
print(corr)

在这里我得到了这个错误:

TypeError: len() of unsized object

在阅读了一些 blaze 文档后,我发现问题在于将 blaze 列转换为如下结构:

import pandas as pd
from blaze import into
df=into(pd.DataFrame,blz_frame[blz_cols[0]]

但是这种转换会使 pearsonr 在列列表上的迭代计算变慢。那么,我怎样才能简单地将 blaze 列转换为 np.array 以使用计算(如 pearsonr 或 statsmodels.api.Logit(blz_frame.y,blz_frame[[train_cols]])?)如果有意义,我正在使用Anaconda for Python 3.4,我的 blaze 版本:

import blaze
print(blaze.__version__)
#returns 0.6.3
4

1 回答 1

3

像这样的模块scipy.stats通常需要明确的 numpy 数组或 pandas DataFrame。他们的逻辑被嵌入到这些数据结构中。

Blaze 可以帮助您在外国数据集(例如您的 sqlite 数据库)上执行类似 numpy 或 pandas 的操作,但无法访问类似库scipy.stats并更改其代码。

我看到以下解决方案:

  1. 将 sqlite 中的所有数据吸入 ndarray/DataFrame (就像你在这里所做的那样)(这很慢)
  2. 改进scipy.stats,使其不假定特定的数据结构。(这需要更改成熟的代码库)
  3. 在包含 Blaze 的更通用的界面上编写一些基本统计信息

在 Pearson Correlation 的情况下,以更一般的方式重新定义算法将非常简单(#3)。也许在这里使用 Blaze-stats 或只是一般的统计模块是合适的。

一般来说,Blaze 不承诺现有的科学 Python 代码将适用于外部数据结构。这是一个崇高的目标。

于 2014-10-31T15:33:53.620 回答