0
私はパンダの記述方法をSQLテーブルに使いたいのですが、すべてのデータをメモリに取り込むことはできません - SQLクエリだけを使って情報を取得することは可能でしょうか?パンダ - DBからのテーブルの記述 - 大きなデータ
おかげ
私はパンダの記述方法をSQLテーブルに使いたいのですが、すべてのデータをメモリに取り込むことはできません - SQLクエリだけを使って情報を取得することは可能でしょうか?パンダ - DBからのテーブルの記述 - 大きなデータ
おかげ
df.describeほど便利でどのような方法は、(、私の知る限りでは、ありません)が、あなたが望むすべての情報を得ることができ、SQLステートメントがあります。
以下、すべての列とそのデータ型を返すSQLサーバーのストアドプロシージャを使用しています。 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()