これまではCSVを読み込んでグラフを作っていましたが、そもそもCSVなんて日常使っていないし、使うつもりもたぶんないし、エクセルも使わないし、mysqlしか使ってないじゃないかとふと気づきました。そっちが便利そうだし。なので、今回はmysqlでデータを取得して、pandasでpyplotできっとグラフができると思って頑張ります

データを例のごとく作成する

ひとまず、これまで使っていたあのcsv(https://webtopi.biz/archives/938 参照)のうち、number,pieces,us_priceを取り除いて、number,piecesに小数点が入ってるのがむかつくので除去して、データベース用のテーブルにぶち込んだところから始めます。

ただ、ちょっと操作メモだけ以下に記載

#該当3つだけをdata4とか、適当に名前つけた変数にいれる
data4=data[["number","pieces","us_price"]]

#整数に変えたいカラムを型変更、つまりキャストして、また別の変数にでもいれておいて
data5=data4.astype({'pieces': int,'number':int})

#csvに出力
data5.to_csv("./unko.csv")

#以下、中身
number,pieces,us_price
10251,2380,169.99
10252,1167,99.99

これを先方に(をつけて、最後に),をつける置換をして
(number,pieces,us_price),
(10251,2380,169.99),
(10252,1167,99.99),

で、ちょっといじって
(number,pieces,us_price)
values
(10251,2380,169.99),
(10252,1167,99.99)

とこんな感じからデータベースに入れるクエリを作成。numberは重複してそうなので、
primary key をnumber にしたあと、insert ignoreでぶちこんどけばおk。
どうせテストだし

mysqlに接続してデータを取得する

普通に接続して普通に取得します

#db_data.pyに、あらかじめ接続用のデータを変数にいれてます
import db_data as local_db
import mysql.connector
import pandas as pd

try:
#古いバージョンのデータベースに接続する際は、shakehandがうまくいかないので、use_pure=Trueをつける
 db = mysql.connector.connect(user=local_db.USER,password=local_db.PASSWORD,host=local_db.HOST,database=local_db.DATABASE,use_pure=True,port=local_db.PORT,charset="utf8")
 sql='select * from python_test.sample_table order by pieces asc'
#pandas用に読み込み。sql文、dbの接続状態でいける
 df_read = pd.read_sql(sql, db)
#ここからはいつもどおりの描画
 df_read.plot.scatter(x="pieces",y="us_price",grid=True,color"c")

 
except mysql.connector.Error as e:
 db.rollback()

finally:
 db.close()

以下実行結果

ちゃんとmysqlからデータを抜いたもので、グラフ描画ができました。

pandasでは、mysqlでデータを抜いて、fetchallした状態では読み込むことができないので、ちゃんとpandas用のmysqlの読み込みを使う必要があるようです。

コメント