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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Matplotlib

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

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

1回答

411閲覧

大量のデータを保持する時系列情報を元にした、matplotlibでの作図と参照元テーブルの設計に関して

karakarakarappo

総合スコア28

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Matplotlib

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

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クリップ

投稿2022/06/08 10:30

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

matplotlibを用いたグラフ作図に伴う、保管するテーブルデータに関して、アドバイス頂きたいことがあります。

残高推移データを描画する場合の、参照元のテーブル設計に関して、知見を共有頂きたいです。

長文となりますが、お付き合いいただければ幸いです。


現在、matplotlibにて以下のような図の作成を試みています。

目標とする図
イメージ説明

毎日発生するデータをCSVからダウンロードし、Pandasで加工し、以下のようなテーブルを作成しております。
(加工後のテーブル名は、「当日の発生数の一覧表」とします。)

データフレーム名:当日の発生数の一覧表

trade_dateproduct_classinstrument_idinstrumentbroker_codebroker_nameitemvolume
1220220606A60018A 220611560GSELL181.0
3820220606A90018A 220911560GSELL1.0
5620220606AA60019AA 220611560GSELL395.0
8420220606B60005B 220611560GSELL1895.0
10320220606B90005B 220911560GSELL1179.0
828220220531A60018A 220611560GBUY153.0
5620220606AA60019AA 220611560GBUY395.0
828220220531A60018A 220611560GSELL153.0
830520220531AA10019AA220611560GSELL8129.0
834520220531B10005BB 220611560GSELL5708.0
863820220531A60018A 220611560GSELL556.0
866220220531B60005B 220611560GSELL5862.0
999520220606A60018A 220611560GSELL50.00
999620220606AA90018AA220911560GBUY150.00

当初は、上記のデータフレームを元にして、以下の条件でmatplotlibにて描画しようと考えています。

  • 日付ごとに残高数位の棒グラフを作成する。
  • 「instrument」毎で棒グラフを積み上げる
  • 「SELL」ならマイナス、「BUY」ならプラスで個別に集計を行う

当初、以下のうよなデータフレームを作成し、上記の条件を満たしそうとしたのですが、上手くいきませんでした。

データフレーム名:test

trade_dateinstrumentitemvolume
20220531A 2206BUY153.0
SELL-354.5
AA 2206SELL-812.9
20220606A 2206SELL-115.5
A 2209SELL-1.0
AA 2206BUY39.5
SELL-39.5
AA 2209BUY15.0

**冷静に考えれば、当日発生データのテーブルと、残高数位のテーブルは、それぞれ別々の目的のテーブルなので、上手くいかないのも当たり前だろうと考えました。
**

そのため、「当日の発生数の一覧」のテーブル以外に、以下の「残高推移」のテーブルを作成しようと考えました。

データフレーム名:残高推移

列1列2A 2206A 2206AA 2206AA 2206A 2209A 2209AA 2209AA 2209
0trade_dateBUYSELLBUYSELLBUYSELLBUYSELL
12022053000000000
220220531153-354.50-812.90000
320220601153-354.50-812.900000
420220602153-354.50-812.90000
520220603153-354.50-812.90000
620220606153-47039.5-852.40-1150

このテーブルで運用する際に気になることが、 **1行目が右に無限に増えていくということです。 **

※以下のようにカラムが無限に増えていく予定です。

|A 2212|A 2212|A 2303|A 2303|A 2306|A 2306|AA 2207|AA 2207|AA 2208|AA 2208|AA 2209|AA 2209|AA 2210|AA 2210|A 2211|A 2211|AA 2212|AA 2212|AA 2301|AA 2301|~~~~

長文となってしまい恐縮なのですが、ご知見を頂きたのが、
このような仕様になることを諦めて、「instrument」が増える度にテーブルを更新していけばいいか。
という風に思考停止して進めてしまっても問題ないのかなあということです。

そもそも、上記の「残高推移」を使ってmatplotlibで描画するのってナンセンスじゃん?と感じた方もツッコミを頂けると非常に嬉しいです。

個人開発の趣味にようなものなので、まあ仕方ないかとも考えております。
ただ、後々面倒くさいことになるのも嫌なので、もし実際に大量のテーブルデータを扱っている知見のある方がいらっしゃったら、アトバイスいただければと考え、質問を投稿させて頂きました。

見直せるところは見直していきたいです。

以上、よろしくお願い致します。


以下のサンプルデータもご利用ください。

データフレーム名:test

# データフレーム名:test import pandas as pd from io import StringIO import matplotlib.pyplot as plt s = """trade_date,instrument,item,volume 20220531,A 2206,BUY,153.0 ,,SELL,-354.5 ,AA 2206,SELL,-812.9 20220606,A 2206,SELL,-115.5 ,A 2209,SELL,-1.0 ,AA 2206,BUY,39.5 ,,SELL,-39.5 ,AA 2209,BUY,15.0""" df = pd.read_csv(StringIO(s), dtype={'trade_date':str})

テストデータ残高推移

# テストデータ残高推移 import pandas as pd from io import StringIO import matplotlib.pyplot as plt s = """列1,A 2206,A 2206,AA 2206,AA 2206,A 2209,A 2209,AA 2209,AA 2209 trade_date,BUY,SELL,BUY,SELL,BUY,SELL,BUY,SELL 20220530,0,0,0,0,0,0,0,0 20220531,153,-354.5,0,-812.9,0,0,0,0 20220601,153,-354.5,0,-812.90,0,0,0,0 20220602,153,-354.5,0,-812.9,0,0,0,0 20220603,153,-354.5,0,-812.9,0,0,0,0 20220606,153,-470,39.5,-852.4,0,-1,15,0""" df = pd.read_csv(StringIO(s), dtype={'trade_date':str}) df

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

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

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

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

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

guest

回答1

0

python

1import pandas as pd 2from matplotlib import pyplot as plt 3 4url = 'https://teratail.com/questions/to5der7styavnb' 5df = pd.read_html(url)[0] 6dfx = df.groupby(['trade_date', 'instrument'])['volume'].sum().unstack('instrument').plot(kind='bar', stacked=True) 7 8plt.show()

イメージ説明

投稿2022/06/08 13:28

melian

総合スコア19796

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問