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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

pandas

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

Q&A

解決済

2回答

345閲覧

matplotlibを用いたデータ作図に関して<重複INDEX情報>

karakarakarappo

総合スコア28

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

pandas

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

0グッド

0クリップ

投稿2022/06/06 11:13

閲覧頂き、ありがとうございます。

matplotlibを用いたデータ作図で困っていることがあり、質問させて頂きます。
少し長いですが、お付き合いいただければ幸いです。

実現したいこと

現在CSVデータを元にして、matplotlibを用いて作図をしています。

pythonのpandasを用いて、CSVデータより以下のデータフレームを作成しました。
(そのデータフレーム名は「data」とします。)

作成したdataの『trade_date』をX軸、『volume』をY軸として、
添付画像①(理想とする図)のような棒グラフを作成したいと考えています。
具体的に実現したいことは、以下の内容です

  • trade_dateでソートされている
  • trade_date毎にvolumeの合計値を出ている

データフレーム名:data

列1trade_datevolume
10132022060645.0
1379202206063735.0
1852202206065206.0
288420220603139.0
3247202206031798.0
3699202206034650.0
466220220602540.0
503720220602628.0
543820220602501.0
551720220601941.0
560920220601735.0
60482022060174.0
717820220531188.0
749620220531567.0
788320220531106.0

添付画像①理想とする図(スプレッドシートでサンプルを作成)
イメージ説明

現状の進捗状況

とりあえずdataを.plot.barで作成してみました。
添付画像②(現状)のように、

  • 日付はdataを上から見ていくだけ
  • index毎に棒グラフが作成される

という成果となりました。

data.plot.bar(x='trade_date',y='volume')

添付画像②現状
イメージ説明

疑問点

理想とする図を作成するには、『data』を以下の『data_2』のように、
更にPandasにて前処理をするしか方法はないでしょうか?

  • trade_dateでソートしておく(日付の若い順にしておく)
  • trade_date毎にvolumeの合計値を出しておく

データフレーム名:data_2

trade_datevolume
20220531861
202206011750
202206021669
202206036587
202206068986

元の保持している時系列データから、dataまでに4回整形処理をしております。
なので、もう1回整形処理すれば解決するのは理解できるのですが、
ゴリ押し過ぎて無理やりやってる感が良くないように考えています。
このままだと想定しているコードの完成形が尋常じゃなく長くなりそうなので、一度質問してみようと考えて投稿致しました。

エクセルでの資料作成の経験とVBAを少し触ったことがあるくらいで、pythonだったら更に楽にデータ整形と資料作成ができると思って勉強し始めております。
面倒なことはpythonに丸投げしたいという考えです。

時系列情報の保管から見直そうとも検討しております。

追加で必要な情報がありましたら、お伝え下さい。追記致します。
以上、ご協力いただける方がいらっしゃいましたら、コメントよろしくお願い致します。

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

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

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

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

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

guest

回答2

0

pandas.DataFrame.groupby では、グループキーはソートされます(デフォルトの動作)

python

1df.groupby('trade_date')['volume'].sum().plot(kind='bar', zorder=3, figsize=(8, 4)) 2 3plt.xticks(rotation=0) 4plt.ylim(0, 10000) 5plt.yticks(np.linspace(0, 10000, 5)) 6plt.ylabel(df.columns[-1]) 7plt.tick_params(length=0) 8plt.legend('', frameon=False) 9plt.grid(axis='y', color='k', linestyle='-', linewidth=.2, zorder=0) 10plt.gca().spines[['top', 'left', 'right']].set_visible(False) 11plt.show()

イメージ説明

投稿2022/06/06 13:04

編集2022/06/06 13:59
melian

総合スコア19714

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

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

karakarakarappo

2022/06/07 15:19

知見を共有頂きありがとうございます。 初歩的なことでしたが、ご指摘頂き勉強になりました。 もう少しドキュメント等読み込もうと思います。
guest

0

ベストアンサー

以下のような感じで集計&整形は2行でできるので、それほど無理やりでもないかと思います。

Python

1import pandas as pd 2from io import StringIO 3import matplotlib.pyplot as plt 4 5# テストデータ 6s = """列1,trade_date,volume 71013,20220606,45.0 81379,20220606,3735.0 91852,20220606,5206.0 102884,20220603,139.0 113247,20220603,1798.0 123699,20220603,4650.0 134662,20220602,540.0 145037,20220602,628.0 155438,20220602,501.0 165517,20220601,941.0 175609,20220601,735.0 186048,20220601,74.0 197178,20220531,188.0 207496,20220531,567.0 217883,20220531,106.0""" 22df = pd.read_csv(StringIO(s), dtype={'trade_date':str}) 23 24# 集計&整形 25df = df.groupby('trade_date').sum().reset_index() 26df = df.sort_values('trade_date').loc[:,['trade_date','volume']] 27 28df.plot.bar(x='trade_date', y='volume') 29plt.show()

イメージ説明

投稿2022/06/06 11:44

can110

総合スコア38262

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

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

karakarakarappo

2022/06/07 15:16

集計部分に関して、知見を共有頂きありがとうございます。 非常に参考になりました。 .groupby()を用いれば、無理矢理感をなくして他の処理も行えそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問