質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

3260閲覧

pythonでpostgreSQL(psycopg2)とpandasを使い変数を配列で取得するにはどうしたら良いのでしょうか?

退会済みユーザー

退会済みユーザー

総合スコア0

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/02/01 06:48

編集2019/02/01 08:27

下記のようなテーブル(prices)からcodeを配列で取得するにはどうしたら良いのでしょうか?

postgreSQL

1code(text) date(text) price(integer) 2 3111 2018-01-30 89 4111 2018-01-31 89 5111 2018-02-01 88 6111 2018-02-02 88 7222 2018-01-30 89 8222 2018-01-31 89 9222 2018-02-01 88 10222 2018-02-02 88 11333 2018-01-30 89 12333 2018-01-31 89 13333 2018-02-01 88 14333 2018-02-02 88

まずは下記のような関数を定義しました。

python

1import pandas as pd 2import psycopg2 3 4def get_price(code): 5 6 con = psycopg2.connect( 7 host='localhost', 8 port = '****', 9 database='****', 10 user='****', 11 password='****' 12 ) 13 14 return pd.read_sql('SELECT date, price ' 15 'FROM prices ' 16 'WHERE code = %s ' 17 'ORDER BY date', 18 con, 19 params=(code), 20 parse_dates=('date',), 21 index_col='date')

そして、以下のようにすれば動的にデータが取り出せるかと思います。

python

1a = get_price(111) 2b = get_price(222) 3c = get_price(333)

しかし、これだと取り出したいcodeの数だけコードを書かなければならないため、

prices = [111,222,333]

上記のように配列で記述し、データを取得するにはどのようにしたら良いでしょうか?
ちなみに、取り出した後は

prices = pd.concat([a, b, c], axis=1)

と言ったように横方向に結合し、使用します。

何方かアドバイスお願いします。

最終的には以下のようなデータを取得したいです。

date 111 222 333

2019-01-01 10.0 NaN NaN
2019-01-02 NaN 20.0 NaN
2019-01-03 NaN NaN 30.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2019/02/01 07:53

確認ですが、結合方法は横方向(price列が3つ並ぶ)でよいのでしょうか?
退会済みユーザー

退会済みユーザー

2019/02/01 07:59

can110様 コメントありがとうございます! それで構いません! その後、renameにより、それぞれのcodeに置き換えます。 他にも良い方法があれば教えて頂けると嬉しいです! よろしくお願いします。
can110

2019/02/01 08:15

とりあえず回答しました。 列名も含めた理想のテーブル最終結果例を示すと、より適切な回答得られるかもしれません。
退会済みユーザー

退会済みユーザー

2019/02/01 08:26

can様 確かにおっしゃる通りです! 最終的に取り出したい形を質問本文に追加したのですが、いかがでしょうか?
can110

2019/02/01 08:31

列名を変更するように回答コード修正しました。
退会済みユーザー

退会済みユーザー

2019/02/01 09:02

ご丁寧にありがとうございます! 今外出先なので、家に帰りましたらすぐに試してみます! 本当にありがとうございました!
guest

回答2

0

ベストアンサー

DB接続はcode毎のままで非効率ですが、以下のように書けばループで処理できます。

Python

1import sqlite3 2import pandas as pd 3 4# sqlite3用にSQLなど修正しています 5def get_price(code): 6 con = sqlite3.connect('test.db') 7 8 return pd.read_sql('SELECT date, price ' 9 'FROM prices ' 10 'WHERE code = ? ' 11 'ORDER BY date', 12 con, 13 params=[code], 14 parse_dates=('date',), 15 index_col='date') 16 17codes = [111,222,333] 18dfs = [get_price(code) for code in codes] 19prices = pd.concat(dfs, axis=1) 20prices.columns = map(str,codes) # 列名を変更 21print(prices) 22""" 23 111 222 333 24date 252019-01-01 10.0 NaN NaN 262019-01-02 NaN 20.0 NaN 272019-01-03 NaN NaN 30.0 28"""

ついでに

ふつうに複数のcodeで絞った結果を返したい場合は以下のように書けます。

Python

1import sqlite3 2import pandas as pd 3 4def get_prices(codes): 5 con = sqlite3.connect('test.db') 6 where = ','.join(map(str,codes)) # codeを直埋め 7 sql = 'SELECT date, price FROM prices WHERE code in ({}) ORDER BY date'.format(where) 8 print(sql) # SELECT date, price FROM prices WHERE code in (111,222,333) ORDER BY date 9 return pd.read_sql(sql, con, 10 parse_dates=('date',), 11 index_col='date') 12 13prices = get_prices([111,222,333]) 14print(prices) 15""" 16 price 17date 182019-01-01 10 192019-01-02 20 202019-01-03 30 21"""

投稿2019/02/01 08:14

編集2019/02/01 08:30
can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これだと取り出したいcodeの数だけコードを書かなければならないため

この問題の根本は、get_priceで発行しているSQLにあると思います。

SQL

1SELECT date, price FROM prices ORDER BY date

などのように無制限(もしくは日付で上限をつけるなど)にし、もともと表形式のデータが抽出できるように路線変更すべきではないかと思います。

投稿2019/02/01 07:39

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/01 08:01

papinianus様 コメントありがとうございます! ご指摘の通り、これだと問題があるかとは思いますが、実際はwhereで期間を絞り込む予定です。 それを踏まえた上で回答頂けると嬉しいです。 よろしくお願いします!
papinianus

2019/02/01 08:17

where句にcodeをかかないだけのことです。やろうとしていることからすると、なぜ一旦whereで絞ったのか、またpythonでのリスト処理においてあらかじめ、111や222などといったコード値が、プログラミングの段階で把握でき確定できているというのは状況として理解しにくいです(そのコードは全製品にあらかじめ与えられ、集計対象は確定しているのでしょうか?)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問