3

PostgreSQL には大量のデータがあります。しかし、SPSS のようにいくつかのピボット テーブルを作成する必要があります。たとえば、都市と州のテーブルがあります。

 create table cities
(
    city integer,
    state integer
);
insert into cities(city,state) values (1,1);
insert into cities(city,state) values (2,2);
insert into cities(city,state) values (3,1);
insert into cities(city,state) values (4,1);

実際、このテーブルには 4 つの都市と 2 つの州があります。のようなパーセンテージでピボットテーブルをやりたい

city\state |state-1| state-2|
city1      |33%    |0%      |
city2      |0%     |100%    |
city3      |33%    |0%      |
city4      |33%    |0%      |
totalCount |3      |1       |

この特定のケースでSQLを使用する方法を理解しています。しかし、私が望むのは、ストアド関数を使用して、ある変数を別の変数と交差させることです(単に個別の値を数え、「count(*) where variable_in_column_names=1 など)」で割ります)。私は今plpythonを見ています。いくつかの質問は:

  1. 出力列の数とタイプに適合する形状の一時テーブルを持たないレコードのセットを出力する方法。
  2. 多分実用的な解決策がありますか?

ご覧のとおり、入力はテーブル名、最初の変数の列名、2 番目の変数の列名になります。関数の本体で多くのクエリを実行し(count(*)、変数内のすべての個別の値をループしてカウントするなど)、パーセンテージでテーブルを返します。

  1. 実際、私は1つのクエリ(約10k)に多くの行を持っていません.plpythonではなく、生のpythonでそのようなことを行う最良の方法かもしれません?
4

2 に答える 2

1

優れた Python データ分析ライブラリであるpandasを試してみることをお勧めします。

PostgreSQL データベースにクエリを実行するには:

import psycopg2
import pandas as pd
from pandas.io.sql import frame_query

conn_string = "host='localhost' dbname='mydb' user='postgres' password='password'"
conn = psycopg2.connect(conn_string)
df = frame_query('select * from cities', con=conn)

次のようなDataFrameはどこdfにありますか:

    city    state
0    1   1
1    2   2
2    3   1
3    4   1

pivot_table次に、合計を使用して割ってパーセンテージを取得するピボット テーブルを作成できます。

totals = df.groupby('state').size()
pivot = pd.pivot_table(df, rows='city', cols='state', aggfunc=len, fill_value=0) / totals

あなたに結果を与える:

state   1   2
city        
1    0.333333   0
2    0          1
3    0.333333   0
4    0.333333   0

最後に、必要なレイアウトを取得するには、インデックスと列の名前を変更し、合計を追加するだけです。

totals_frame = pd.DataFrame(totals).T
totals_frame.index = ['totalCount']

pivot.index = ['city%i' % item for item in pivot.index]
final_result = pivot.append(totals_frame)
final_result.columns  = ['state-%i' % item for item in final_result.columns]

あなたに与える:

            state-1     state-2
city1       0.333333    0
city2       0.000000    1
city3       0.333333    0
city4       0.333333    0
totalCount  3.000000    1
于 2012-12-11T21:52:29.660 に答える
0

PostgreSQL ウィンドウ関数を確認してください。非(pl)pythonソリューションを提供する場合があります。 http://blog.hashrocket.com/posts/sql-window-functions

于 2012-12-15T23:21:40.110 に答える