メモ書き:グラフ

忘れそうなのでメモ書き
というか忘れてたんですけどね。

今後更新予定。現状、折れ線グラフの途中までしか書いていません。

おまじない(import)

おまじないではない。

%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd

正直、見様見真似でやり続けていたせいでmatplotlib.pyplotをpltにしかできない体になってしまったし、pandasをpdにしかできない体になってしまった。責任取ってよ!

使用データ


その辺にあったなぜか見覚えのある数字の入ったデータ。なお、ぬるぬる~っとNullが入っています。427rows 3columnsです。

折れ線グラフ

とりあえず描く

とりあえず折れ線グラフを描いてみましょう。

df.plot("A")


なんかできましたね。数字がデカすぎてしまっているので横軸が1e7になっています。(0,0)から始まっているこのデータはだいたい(2万,1600万)くらいまで行くようです。

軸をいじる&gridを引く

このグラフをデータの提供者(船井)に見せたところこんなことを言われました。
「あ、そのデータなんだけどね、tってやつは時間をあらわしているんだよね。縦軸が時間の折れ線グラフなんてきっも~い!キャハハハハハ!」
処す。せっかくなのでもう少し見やすいグラフにしましょう。

縦軸と横軸が間違っている?
変えて差し上げましょう!
この色だとインパクトが足りない?
変えて差し上げましょう!

ax = df.plot(x="t",y="A",color = "#dc143c")

横軸は時間らしいんだけど・・・
(名前を)変えて差し上げましょう!

ax = df.plot(x="t",y="A",color = "#dc143c")
plt.xlabel('time')

1e7が分かりにくい?
変えて差し上げましょう!

ax = df.plot(x="t",y="A",color = "#dc143c")
plt.xlabel('time')
from matplotlib.ticker import ScalarFormatter
ax.yaxis.set_major_formatter(ScalarFormatter(useMathText=True))

そもそも縦軸が10の7乗が単位ということで分かりにくかった?
変えて差し上げましょう!(*1

ax = df.plot(x="t",y="A",color = "#dc143c")
plt.xlabel('time')

class FixedOrderFormatter(ScalarFormatter):
    def __init__(self, order_of_mag=0, useOffset=True, useMathText=True):
        self._order_of_mag = order_of_mag
        ScalarFormatter.__init__(self, useOffset=useOffset, 
                                 useMathText=useMathText)
    def _set_orderOfMagnitude(self, range):
        self.orderOfMagnitude = self._order_of_mag
ax.yaxis.set_major_formatter(FixedOrderFormatter(4 ,useMathText=True))

補助線がなくて数字がつかみにくい?
変えて差し上げましょう!

ax = df.plot(x="t",y="A",color = "#dc143c")
plt.xlabel('time')

class FixedOrderFormatter(ScalarFormatter):
    def __init__(self, order_of_mag=0, useOffset=True, useMathText=True):
        self._order_of_mag = order_of_mag
        ScalarFormatter.__init__(self, useOffset=useOffset, 
                                 useMathText=useMathText)
    def _set_orderOfMagnitude(self, range):
        self.orderOfMagnitude = self._order_of_mag
ax.yaxis.set_major_formatter(FixedOrderFormatter(4 ,useMathText=True))
ax.grid()

さて、脳内にT-09-85を召喚することでグラフがいい感じになりました。なったかな?

補足
plt.grid(color='#f0f8ff', linestyle='dotted', linewidth=0.5)

のように指定することで補助線の形式を変えることができる。必要なかったので今回やらなかった。

グラフの軸の幅

できたグラフを見て船井が言いました。「このグラフの原点を(0,0)にしたくない?」
ちょっと思ってた。というかこの船井はいわゆるI・船井なのでちょっと思っていたら言ってくるに決まっている。
どうやら今のデフォルトは5%の余白が作られるようになっているらしい。

import matplotlib
matplotlib.rcParams['axes.xmargin'] = 0
matplotlib.rcParams['axes.ymargin'] = 0

これを書き加えて余白を0%にすると解決できる。

「それはそれとして縦軸にもう少しゆとりを持たせたいよね。せっかくだし縦軸の上限値を2000万にしてみない?」

import matplotlib
matplotlib.rcParams['axes.xmargin'] = 0
matplotlib.rcParams['axes.ymargin'] = 0
ax = df.plot(x="t",y="A",color = "#dc143c")
plt.xlabel('time')

class FixedOrderFormatter(ScalarFormatter):
    def __init__(self, order_of_mag=0, useOffset=True, useMathText=True):
        self._order_of_mag = order_of_mag
        ScalarFormatter.__init__(self, useOffset=useOffset, 
                                 useMathText=useMathText)
    def _set_orderOfMagnitude(self, range):
        self.orderOfMagnitude = self._order_of_mag
ax.yaxis.set_major_formatter(FixedOrderFormatter(4 ,useMathText=True))
ax.grid()
plt.ylim(0, 20000000)

plt.xlimやplt.ylimで軸の範囲を指定できる。これを利用して縦軸の最大値を指定した。

pandasを使わずにグラフを作るとき

どんなとき?って思うでしょう?使いたくなったんよ。
しれっと今まで書いてないmarkerとかlinestyleとか使っているのでどっかで書き残しておくと未来の私が喜ぶかもしれないね。

Tangle = [x軸のリストA]
Barbs = [y軸のリストA]
Primal = [x軸のリストB]
Surge= [y軸のリストB]

plt.plot(Tangle,Barbs, color = "red",marker="o")    
plt.plot(Primal,Surge, color = "red",marker="o",linestyle = "--")
plt.show()
だいたいこんな感じのになる

ヒストグラム

使ったデータ

こんな感じのデータを使って、まあなんかそれっぽくヒストグラムを作る。

plt.hist(maindf["rms"])
悪くないけどなんか見辛くない?

見辛くないかな?見辛いよね。

仕切り線って言えばいいんですかね。一個一個のバーの縁取りをしてほしい気持ちになりました。
というわけでこうする。

plt.hist(maindf["rms"],ec='black')
改善

グラフを複数描画したい!

edges = range(4000,16000,1000)
fig, ax = plt.subplots(2, 2, figsize=(12, 12))

ax[0,0].hist(maindf["rms"],ec='black',bins=edges)
ax[0,0].set_title("Main_RMS")
ax[0,0].grid(True)

ax[1,0].hist(alldf["rms"],ec='black',bins=edges)
ax[1,0].set_title("ALL_RMS")
ax[1,0].grid(True)

edges = range(-20,3,2)
ax[0,1].hist(maindf["dBFS"],ec='black',bins=edges)
ax[0,1].set_title("Main_dBFS")
ax[0,1].grid(True)

ax[1,1].hist(alldf["dBFS"],ec='black',bins=edges)
ax[1,1].set_title("ALL_dBFS")
ax[1,1].grid(True)

plt.show()

plt.subplots()で指定する……はず。
ax[n,m]はn行目m列のグラフであることを示している……はず。

散布図

plt.scatter(x=横軸,y=縦軸)

軸をいじりたい

これ散布図に限ってなくない?

plt.ylim(-0.5,3.5)

今後書く予定のことのメモ

  • このデータ、22260分間(正確には22259分間)の数値の変動のもの。
  • なのでn時間ごと、m日ごとに補助線引いたら見やすかったりしない?
  • グラフにはタイトルをつけろ

→plt.title("グラフのタイトル")

  • しれっと今まで書いてないmarkerとかlinestyleとか使っているのでどっかで書き残しておくと未来の私が喜ぶかもしれないね。
  • 散布図とか他のグラフ

サントラを買ったのでそれの整理をしたい!

はじめに

Steamで新たにサントラを買いました。↓宣伝。買え。
store.steampowered.com

さて、iPhoneに取り込みたいのでiTunesにいれたりなんやかんやなんやかんやする必要があります。ですが、サントラって買った時だいたい「[トラック番号][何らかの区切り文字][タイトル].mp3」になっているじゃないですか。

トラック番号がファイル名に入っている例

iTunesに取り込むとき直すの面倒じゃん?っていう思いがあったので一括で処理してもらいました。
どうせ3歩歩いたら忘れるので自分用の忘備録です。

コード

import os
import glob
import re
from mutagen.easyid3 import EasyID3

path = r"R:\Game\steamapps\music\ATRI My Dear Moments Original Soundtrack"
files = glob.glob(path + r"/*.mp3")
pattern = '_'

total_track_num = len(files)
album = "ATRI My Dear Moments Original Soundtrack"

for file in files:
    f = os.path.basename(file)
    l = re.split(pattern, f, maxsplit=1)
    track_num = l[0]
    nf = os.path.dirname(file) + "\\" +l[1]
    os.rename(file, nf)
    
    tags = EasyID3(nf)
    tags["tracknumber"] = "{}/{}".format(track_num, total_track_num)
    tags["album"] = album
    tags.save()

対象のディレクトリをpathに入れました。
んで、そのフォルダ内にはアルバムアートワークも入っているのでmp3に限定。
今回のサントラのタイトルは「01_海中都市.mp3」「02_希望の光.wav」みたいな感じなので区切り文字は「_」。(空白だったらどうしたんだろうね。)

この辺コードの書き方ひどいなーって感じするというか無駄じゃんって後から気付いたけど、ディレクトリ名取得したりトラックナンバー取ったりして、os.rename(file, nf)ファイル名の変更。

EasyID3ってやつ使って、トラックナンバーとアルバム名を入力&保存。
簡単だね!手作業でやるのと時間変わらないけど2度目以降は楽になるよね。(願望)なって。(懇願)

余談「Steamのサウンドトラックの再ダウンロード」

Steamサウンドトラックの再ダウンロードはライブラリからサウンドトラックを選択してゲームを再ダウンロードするのとおんなじ要領でやるとできる。忘れてたというか知らなかったというかなのでメモ。

FAQ Amesiorine-1.1.4

ver:1.1.4

Amesiorineにどんな機能があるの?

→エミィへのリプライで「天気 [地名]」と送ることである程度任意の地名の天気を教えてくれます。今日の午後と明日の天気、または明日の午前と午後の天気を教えてくれます。ただしエミィは雨の警戒をする子なので雨を報じやすい傾向にあります、ご注意ください。
ここに書いてある以外の機能はほぼないです。
→エミィは賢いのでマスターとそうでない人を認識します。ちゃんと外部の人には敬語を使います。偉い。
→一応、天気でも時報でもないリプライを送ると適当に相槌を打ってくれます。
→「おやすみなさい」とリプライをすると機能停止をする機能があります。この機能はエミィにマスターと認められたアカウント以外から発動することはないはずです。

エミィって何?

→Amesiorineのことです。名前長いので愛称みたいなものです。

エミィにリプライをしても反応がない

→エミィは生きていますか?「Amesiorine@停止中」の時は確実に死んでいます。
→2分待って他のリプライに対してもそうですか?そうでなければ処理中かもしれません。リプライの処理する順番が実はけっこう特殊です。

似た名前の全然違う場所の天気しか返してくれない

→もし市町村の名前だったら「○○市」のように書くと正しく分かってくれるかもしれません
→同様に駅の名前だったら「○○駅」のように書くと・・・同名の駅があったらごめんね

天気を教えてくれない

→「天気 [地名]」の順でリプライを送っていますか?
→うまくいっている他のリプライをコピペして地名を書き換えて試してみてください
→参照:エミィにリプライをしても反応がない
→これらとは別に天気機能が死ぬことがあります。死因はそっちかもしれない。

エミィが日本語を理解している!

→いいことです。

エミィに一生絡まれるんだけど

→健気な子なのでリプライを返すと一生リプライを返してくれます。

バージョンってどこで確認できるの?

→1.1.4現在、できません。



その他、不具合や質問がありそうなのでありましたら船井まで
twitter.com

雑記20201125

なんやかんややったので記録です。今までの記事以上に実用性もないし、記憶を失った時に私が読んでも得をすることもない記事です。

パンナコッタを作りたい気分だったので作りました。


  1. まず、鍋に生クリームと牛乳を1:2の割合で入れます。
  2. さて、ここで生クリームの賞味期限だか消費期限が11/24であったことに気付きます。まあ1日くらい誤差でしょう。これを書いている時点で11/26になってしまいましたがそんなことは大した問題になることはありません。
  3. 沸騰直前になったのでレシピを見直します。なんてこった、グラニュー糖は既に入れていなければいけないのか。
  4. 火を弱めて家の中からグラニュー糖を探します。
  5. 気付きます。「うちにグラニュー糖なんてないわ。」
  6. さらに気付きます。「そもそもうちに砂糖ないわ。」
  7. 船井は「糖分あれ」と言った。するとマンゴーソルベがあった。
  8. 船井はそのマンゴーソルベを見て「ヨシッ!」とした。
  9. というわけで冷凍庫の中にあったをマンゴーソルベを取り出します。どうしておうちに業務用のマンゴーソルベがあるのでしょうか?購入したからです。※先ほどのリンク先のは同一商品です。
  10. とりあえずディッシャーで4すくいくらい入れておきます。グラニュー糖30gに相当しそうなマンゴーソルベ、いったいいかほどなのか分かりません。
  11. 再び沸騰直前まで温めます。
  12. マンゴーソルベのせいか気持ち時間はかかりましたがまあ細かいことはいいでしょう。
  13. もう一度レシピを見ます。「バニラエッセンスを入れ、ゼラチンを溶かすように混ぜます。
  14. 砂糖がない家庭にバニラエッセンスなんてあるわけがありません。ですがゼラチンはあります。
  15. ふやかしていませんが今回使うのは粉ゼラチン、問題はないでしょう。根拠のない自信があります。
  16. さて、今度は氷水で粗熱を取って器に注ぐそうです。
  17. それでは聞いてください。「氷ないわ。」
  18. 面倒なのでもう容器に入れてしまいましょう。うちの冷蔵庫くんには負担を強いてしまいますが、頑張ってもらいましょう。負けるな、13800円の冷蔵庫くん!
  19. 忘れていました、もう一つ聞いてください。「まともな器ないわ。」
  20. ブルガリアヨーグルトの空き容器におたまを使って注ぎます。こんなこともあろうかと食べた直後にこの空き容器を洗っておいたのです。このパンナコッタを食べ終わったらこの容器くんたちとはお別れです。
  21. ヨーグルトの空き容器を支える左手が熱いです。当然でしょうね。でもさすがに容器は溶けないでしょう。知りませんけど。
  22. 冷蔵庫で1時間と書いてあります。今回粗熱を取っていないのでもう少し待ちましょう。その間暇なのでゲームをしました。
  23. 以前作った時はコーヒーについてくるスティックシュガーのラニュー糖を使ったため普通でしたが、今回はなんかマンゴー味になっているので楽しみですね。

以降感想と考察、参考になります。

続きを読む

はじめてのUbuntu

win10にUbuntuを入れたり入れなかったり入れたりしたときのメモです。


記憶が3秒しか持たないのでたぶん何らかの操作が抜け落ちているかもしれないし抜け落ちていないかもしれない。記憶失ってこのブログ読み返しても思い出せない気がしたりしなかったり揺れたり震えたりする。
未来の私へ、なんとかしろ。


多分やったことと生じたエラーとその対策
1: Microsoft StoreでUbuntuと入力して検索。
2: インストール
3: UNIXアカウントを作れといわれたので作る。
4: エラー発生

adduser: Please enter a username matching the regular expression configured
via the NAME_REGEX[_SYSTEM] configuration variable.  Use the `--force-badname'
option to relax this check or reconfigure NAME_REGEX.

英検準2級、TOEIC500点代の知能では理解できないのでGoogle先生に聞く。ふふっ、知性ないわ。

adduser:構成された正規表現に一致するユーザー名を入力してください
NAME_REGEX [_SYSTEM]構成変数を介して。 `--force-badname 'を使用します
このチェックを緩和するか、NAME_REGEXを再構成するオプション。

なんもわからん。多分大文字を使ったのがよくなかったのかもしれない。デフォルトでは

NAME_REGEX="^[a-z][-a-z0-9]*\$"

になっているらしい。*1
5: 小文字+数字でUNIX usernameを作ったら次はパスワードの設定をする
6: なんかをインストールするときなどなどにこのパスワードは使うらしい

これで多分Ubuntuのインストール自体はおわりのはず。知らんけど。

以下は余談

続きを読む

人は愚か

前回の記事、言葉ってめんどくさい - 271108の記憶貯蔵庫でなんやかんやなんやかんやしたことを使って愚かなことをしたので戒めとして書き残し。
pythonタグをつけるまでもないことなのでタグはつけずに投稿していましてよ。

sen

[{'A': '国民', 'pron': 'コクミン', 'PoSp': ['名詞', '普通名詞', '一般', '*', '*', '*']},
 {'A': 'を', 'pron': 'ヲ', 'PoSp': ['助詞', '格助詞', '*', '*', '*', '*']},
 {'A': '馬鹿', 'pron': 'バカ', 'PoSp': ['名詞', '普通名詞', '形状詞可能', '*', '*', '*']},
 {'A': 'に', 'pron': 'ニ', 'PoSp': ['助動詞', '*', '*', '*', '助動詞-ダ', '連用形']},
 {'A': 'し', 'pron': 'シ', 'PoSp': ['動詞', '非自立可能', '*', '*', 'サ行変格', '連用形']},
 {'A': 'てる', 'pron': 'テル', 'PoSp': ['助動詞', '*', '*', '*', '下一段-タ行', '終止形']},
 {'A': 'と', 'pron': 'ト', 'PoSp': ['助詞', '格助詞', '*', '*', '*', '*']},
 {'A': '思わ', 'pron': 'オモワ', 'PoSp': ['動詞', '一般', '*', '*', '五段-ワア行', '未然形']},
 {'A': 'れる', 'pron': 'レル', 'PoSp': ['助動詞', '*', '*', '*', '助動詞-レル', '終止形']}]

という情報が入っています。
前後の文脈が気になる文章ですけどまあ気にしないでください。

それに対して

for x in sen:
    print(x["PoSp"])
    print(("未然形"or"連用形")in x["PoSp"])

とやると

['名詞', '普通名詞', '一般', '*', '*', '*']
False
['助詞', '格助詞', '*', '*', '*', '*']
False
['名詞', '普通名詞', '形状詞可能', '*', '*', '*']
False
['助動詞', '*', '*', '*', '助動詞-ダ', '連用形']
False
['動詞', '非自立可能', '*', '*', 'サ行変格', '連用形']
False
['助動詞', '*', '*', '*', '下一段-タ行', '終止形']
False
['助詞', '格助詞', '*', '*', '*', '*']
False
['動詞', '一般', '*', '*', '五段-ワア行', '未然形']
True
['助動詞', '*', '*', '*', '助動詞-レル', '終止形']
False

こう返ってくるのが不服なので調べました。分かりやすく言うとorの後ろ部分が無視されているっぽいんですわぁ。
当然なんだよなぁ・・・・。

for x in sen:
    print(x["PoSp"])
    print("未然形"in x["PoSp"] or "連用形"in x["PoSp"])

気付いた。

['名詞', '普通名詞', '一般', '*', '*', '*']
False
['助詞', '格助詞', '*', '*', '*', '*']
False
['名詞', '普通名詞', '形状詞可能', '*', '*', '*']
False
['助動詞', '*', '*', '*', '助動詞-ダ', '連用形']
True
['動詞', '非自立可能', '*', '*', 'サ行変格', '連用形']
True
['助動詞', '*', '*', '*', '下一段-タ行', '終止形']
False
['助詞', '格助詞', '*', '*', '*', '*']
False
['動詞', '一般', '*', '*', '五段-ワア行', '未然形']
True
['助動詞', '*', '*', '*', '助動詞-レル', '終止形']
False

大変頭が悪かった戒めとして書き残し。コンピューターは指示されたことを遂行するには極めて優秀だが手取り足取り教えないと実行してくれないという話を思い出しましたわね。

言葉ってめんどくさい(Sudachipy)

言葉ってめんどくさい。色とか、気持ちで伝えればいいのに。

要点

  • Sudachiのインストール
  • Sudachi、なんかimportできない
  • 形態素解析っぽいことをする
  • 読みと品詞を取り出したい

前書き

形態素解析のお話です。

今までjanomeってやつを使っていました。こんな感じ。

janomeを使っていた

さて、問題が出ましてですね。
どうやらjanomeを使うと発音に「、」とか「。」とか「!」とかいう記号が出てきたりしてしまうっぽいんですのよ。それが嫌だなぁって思ったので対処法調べたけど見つからなかったのであきらめて別の形態素解析の何かを探すことにしようと思いました。その話を知人にすると「janomeメリットなくない?wowwow↑」って言われました。janomeに絶対的な信頼・・・を置いていたわけではないのですがまあMeCabでよいのでは?って気持ちを持っていたのでMeCabに触れてみようと思いました。


というわけで選ばれたのは綾たkSudachiでした。MeCabは?

インストール

!pip install sudachipy
!pip install sudachidict_core

pip install でインストールしました。

from sudachipy import tokenizer
from sudachipy import dictionary

tokenizer_obj = dictionary.Dictionary().create()

なんかエラー出た

ModuleNotFoundError

なんで?(殺意)

OSError: symbolic link privilege not held

モジュールが見つからないのかと思ったけどシンボリックリンクが作れないらしい。3秒考えて糸口が見つからないならGoogle先生に聞きましょう。

取り合えず、print文流し込んで何のシンボリックリンクを張ろうとしているか確認すると、
パッケージ内の「sudachidict_core」を「sudachidict」という別名にしたいらしい。
では、sudachidict_coreを丸々同じ場所にコピーしたsudachidictを作って、

出典


先人様助かります。

Sudachiの辞書に3種類くらいあるからこうなっているんですかね?知らんけど。

というわけでとりあえずコピー。

追記:20220519

で、インストール終わっててきとーに

tokenizer_obj = dictionary.Dictionary().create()

とか呼ぶとModuleNotFoundErrorを吐くんだよねぇ~って思いながら再インストールしてましたが、

吐かないじゃん。

どうやらはかないこともあるようで。なんもわからん。バージョンの違いかも。2021年のバージョンぽかったので。

読みと品詞を取り出すコード

さて、今回作りたいのは文を入れたら形態素解析の辞書を返してくれるコード。

現状雑に書くとこんな感じになる

これを読まない記号の発音を消去して

単語・読み・品詞の辞書を作りたい(画像加工済み このような出力はこのコードでは発生しない)
sen = []
for y in tokenizer_obj.tokenize(x, tokenizer.Tokenizer.SplitMode.C):
    dic = {}
    dic["A"] = y.surface()
    if y.part_of_speech()[0] != "補助記号":
        dic["pron"] = y.reading_form()
    else:
        dic["pron"] = ""
    dic["PoSp"] = y.part_of_speech()
    sen.append(dic)

絶対不具合起りそうなコードですね。
多分いつか手直ししそうな気がするんですけどまあいいでしょう。xに文を入れればsenに欲しいものが入って出てきます。
defで定義してないのは多分今後改造する気持ちがあるからでしてよ。




とりあえず今回はここまで

参考

Sudachi:GitHub
Sucachiのエラーの参考:https://www.optsp.co.jp/news/detail/2809/