2017-07-07 8 views
0

私は、 "hub_psm_log_inter"という名前の特定のテーブルにアクセスしたい70のテーブルを持つPostgreSQL DBを持っています。私はそれをパンダに持ち込み、いくつかの操作を適用したいと考えています。私がアクセスしているテーブルは(500000、23)の形をしていますが、これは将来的に増加する可能性があります。 psql.read_sql_queryを実行するのに約3分かかります。私はその時間を短縮したいと思います。私にとって重要な行はどこにありますか(cust_hub_id = 358 & status_switch = 1)。 df_onの形状は10000行しかありません。500000行のPandasにPOstgreSQLテーブルを持たせるための実行時間を短縮する代替方法はありますか?

import numpy as np 
import pandas as pd 

import psycopg2 as pg 
import pandas.io.sql as psql 

conn = pg.connect(
    database = '', 
    user = '', 
    password = '', 
    host = '', 
    port = '' 
) 

df2 = psql.read_sql_query("SELECT * FROM hub_psm_log_inter", conn) 


df4 = df2[df2.cust_hub_id == 358] 
df4['status_switch'] = pd.to_numeric(df4['status_switch'], errors='coerce') 
df_on = df4[df4.status_switch == 1] 
+0

私はこれをエクスポートしていませんが...ちょっと考えました。あなたの操作をSQLクエリに組み込もうとしましたか? –

+0

データを操作に持ち込むのではなく、古いSQLクエリーを実行するのではなく、データを操作してみてください。 –

+0

500k行すべてをインポートするか、cust_hub_id == 358とstatus_switch == 1だけをインポートしますか? – lorenzori

答えて

2

あなたのSQLクエリでWHERE句を使用します。

SELECT * FROM hub_psm_log_inter WHERE cust_hub_id = 358 AND status_switch = 1 

あなたのコードの表情からは、status_switchがあなたのテーブルに文字列として格納することができるので、あなたはそれを引用する必要があるかもしれません、すなわち

SELECT * FROM hub_psm_log_inter WHERE cust_hub_id = 358 AND status_switch = '1' 
+0

文字列フォーマットのSQLクエリやマニュアルの引用などはエラーが発生しやすいです。値を渡すときは[プレースホルダー](http://initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters)を使用して、ドライバーにそのようなことを心配させてください。 'pandas.read_sql_query()'を使うと、 'params'キーワード引数と、文中のドライバに依存するプレースホルダが使用されます。 –

+0

@Ken Weiありがとう!! – Hunt

関連する問題