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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

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

Q&A

解決済

2回答

4265閲覧

pythonによるDBから取得したデータの整形について

sh1bainu

総合スコア16

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

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

0グッド

0クリップ

投稿2016/06/12 13:29

pythonでDBからデータを取得し、GoogleChartsを用いてグラフを描画するために、取得した値をうまく整形する方法を探しています。
取得したデータは、

id, point, genre_id, date
1, 10, 1, 2016/06/11
2, 1, 2, 2016/06/11
3, 8, 1, 2016/06/12
4, 9, 1, 2016/06/13
5, 3, 2, 2016/06/13

となっており、毎日データを集めているのですが、ジャンルによっては日によって値が存在しない場合があります。
その場合は欠損値やnullではなくレコードそのものが存在しません。

このようなデータをGoogleCharts用に

date, genre_1, genre_2
2016/06/11, 10, 1
2016/06/12, 8, 0
2016/06/13, 9, 3

としたいと考えています。

力技でなんとかできるのですが、スマートな方法はないでしょうか?

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

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

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

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

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

guest

回答2

0

タグにMySQLがありますが、pythonに持ってくる前にDB側で処理させる案はどうでしょうか。
(当方のテスト環境はPostgreSQLですが、MySQLでもほとんど同じだと思います)

testテーブルに以下のようなデータが入っているとして、

id | point | genre_id | date
----+-------+----------+------------
1 | 10 | 1 | 2016-06-11
2 | 1 | 2 | 2016-06-11
3 | 8 | 1 | 2016-06-12
4 | 9 | 1 | 2016-06-13
5 | 3 | 2 | 2016-06-13

↓のSQL文を実行すると、

SQL

1SELECT 2 date, 3 SUM(CASE WHEN genre_id=1 THEN point ELSE 0 END) AS "genre_1", 4 SUM(CASE WHEN genre_id=2 THEN point ELSE 0 END) AS "genre_2" 5FROM 6 test 7GROUP BY 8 date 9ORDER BY date;

以下のような結果になります。

date | genre_1 | genre_2

------------+---------+---------
2016-06-11 | 10 | 1
2016-06-12 | 8 | 0
2016-06-13 | 9 | 3

投稿2016/06/13 03:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sh1bainu

2016/06/13 15:21

SQLでもなんとかする方法はあると思っていたのですが思いつきませんでした。こういう書き方は知らなかったので参考にさせていただきます!実のところ2つのテーブルをJOINして値を集計しているので少し面倒な感じになってしまうと思いますが取り組んでみたいと思います。ありがとうございます。
guest

0

ベストアンサー

日付のリストを作って、
それを使って欠けている組み合わせだけゼロレコードを作るか、
全ての日のゼロレコードを作っておいて、合算するようにしてはどうでしょうか。
(ゼロレコード:ポイントがゼロのレコード)

日付のリストは、pandasモジュールのdate_range関数を使うと簡単に作れます。

  • 例:ジャンル1のゼロ件レコードを生成

lang

1import pandas as pd 2 3zero_records = pd.date_range('2016-06-01', periods=12).map(lambda x: 'id, 0, 1, ' + x.strftime('%Y/%m/%d')) 4 5for x in zero_records: 6 print(x)
  • 実行結果
id, 0, 1, 2016/06/01 id, 0, 1, 2016/06/02 id, 0, 1, 2016/06/03 id, 0, 1, 2016/06/04 id, 0, 1, 2016/06/05 id, 0, 1, 2016/06/06 id, 0, 1, 2016/06/07 id, 0, 1, 2016/06/08 id, 0, 1, 2016/06/09 id, 0, 1, 2016/06/10 id, 0, 1, 2016/06/11 id, 0, 1, 2016/06/12

参考リンク:

Python pandas で日時関連のデータ操作をカンタンに - StatsFragments
http://sinhrks.hatenablog.com/entry/2014/11/09/183603

投稿2016/06/12 14:33

argius

総合スコア9390

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

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

sh1bainu

2016/06/13 15:18

私自身も考えていましたが、とりあえず「すべてゼロ埋め→指定の部分だけ変更」にいたしました。pandasの情報ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問