Python 熊猫-描述数据库中的表格-大数据

Python 熊猫-描述数据库中的表格-大数据,python,sql,pandas,Python,Sql,Pandas,我想对SQL表使用panda的descripe方法,但我无法将所有数据都拉入内存-是否可以使用仅使用SQL查询获取信息 谢谢据我所知,没有任何方法比df.descripe()更方便,但是有一些sql语句可以获取您想要的所有信息 下面我将使用SQL server中的存储过程返回所有列及其数据类型。循环遍历它们以获取float类型的所有列名,然后从中生成新的查询 然后将所有内容放入最终的数据帧中。我只包括了90%,但我想你可以计算出如何添加更多。您可能还想添加比float更多的数据类型 这个解决方案

我想对SQL表使用panda的descripe方法,但我无法将所有数据都拉入内存-是否可以使用仅使用SQL查询获取信息


谢谢

据我所知,没有任何方法比df.descripe()更方便,但是有一些sql语句可以获取您想要的所有信息

下面我将使用SQL server中的存储过程返回所有列及其数据类型。循环遍历它们以获取float类型的所有列名,然后从中生成新的查询

然后将所有内容放入最终的数据帧中。我只包括了90%,但我想你可以计算出如何添加更多。您可能还想添加比float更多的数据类型

这个解决方案既难看又慢,但对我来说,仅仅将所有数据拉到一个数据帧在内存上就失败了

import pyodbc
import pandas as pd       

def sql2df(sql, connection):
    df = pd.read_sql(sql=sql, con=connection)
    return df

cnx = pyodbc.connect(r'DRIVER={SQL Server};SERVER=.\SQLEXPRESS;DATABASE=TEST;Trusted_Connection=yes;')

df_columns = sql2df('exec sp_columns test_table', cnx)[['COLUMN_NAME', 'TYPE_NAME']]

numeric_columns = []
for index, row in df_columns.iterrows():
    if row[1] == 'float': #or int or any numeric
        numeric_columns.append(row[0])

final_df = pd.DataFrame(index=(['stdev', 'count', '90%', 'mean']))

for col in numeric_columns:
    standard_dev = sql2df('SELECT STDEV('+col+') FROM dbo.test_table', cnx)\
        .get_value(0,0, takeable=True)

    cnt = sql2df('SELECT COUNT(' + col + ') FROM dbo.test_table', cnx)\
        .get_value(0,0, takeable=True)

    # percentile is 100-N so top 10 means 90 percentile
    ninety_percentile = sql2df('SELECT Min(subq.' + col + ') FROM(SELECT TOP 10 PERCENT ' + col +
                               ' FROM dbo.test_table ORDER BY ' + col + ' DESC) AS subq', cnx)\
        .get_value(0,0, takeable=True)

    mean = sql2df('SELECT AVG(' + col + ') FROM dbo.test_table', cnx)\
        .get_value(0,0, takeable=True)

    final_df[str(col)] = [standard_dev, cnt, ninety_percentile, mean]

print final_df
cnx.close()

据我所知,没有任何方法像df.descripe()那样方便,但是有一些sql语句可以获取您想要的所有信息

下面我将使用SQL server中的存储过程返回所有列及其数据类型。循环遍历它们以获取float类型的所有列名,然后从中生成新的查询

然后将所有内容放入最终的数据帧中。我只包括了90%,但我想你可以计算出如何添加更多。您可能还想添加比float更多的数据类型

这个解决方案既难看又慢,但对我来说,仅仅将所有数据拉到一个数据帧在内存上就失败了

import pyodbc
import pandas as pd       

def sql2df(sql, connection):
    df = pd.read_sql(sql=sql, con=connection)
    return df

cnx = pyodbc.connect(r'DRIVER={SQL Server};SERVER=.\SQLEXPRESS;DATABASE=TEST;Trusted_Connection=yes;')

df_columns = sql2df('exec sp_columns test_table', cnx)[['COLUMN_NAME', 'TYPE_NAME']]

numeric_columns = []
for index, row in df_columns.iterrows():
    if row[1] == 'float': #or int or any numeric
        numeric_columns.append(row[0])

final_df = pd.DataFrame(index=(['stdev', 'count', '90%', 'mean']))

for col in numeric_columns:
    standard_dev = sql2df('SELECT STDEV('+col+') FROM dbo.test_table', cnx)\
        .get_value(0,0, takeable=True)

    cnt = sql2df('SELECT COUNT(' + col + ') FROM dbo.test_table', cnx)\
        .get_value(0,0, takeable=True)

    # percentile is 100-N so top 10 means 90 percentile
    ninety_percentile = sql2df('SELECT Min(subq.' + col + ') FROM(SELECT TOP 10 PERCENT ' + col +
                               ' FROM dbo.test_table ORDER BY ' + col + ' DESC) AS subq', cnx)\
        .get_value(0,0, takeable=True)

    mean = sql2df('SELECT AVG(' + col + ') FROM dbo.test_table', cnx)\
        .get_value(0,0, takeable=True)

    final_df[str(col)] = [standard_dev, cnt, ninety_percentile, mean]

print final_df
cnx.close()