メモ書き:openpyxl

インストール

pip install openpyxl

いつもの。

新しいエクセルワークブックを作る

import openpyxl
#新規作成
ewb = openpyxl.Workbook()
#保存
ewb.save("Atarashii.xlsx")
f:id:Amesiorine271108:20220323115846p:plain
上のコードで作ったAtarashii.xlsxの中身。何もない。

既存のワークブックを開く

#読み込み
ewb = openpyxl.load_workbook('test.xlsx')

なお、ここで開いているのはワークブック
まあもし記憶喪失になって調べたらワークブックとシートとセルと……って違いを書いておくれ。

シートを開く

2種類の開き方があるらしい。

sheet = ewb.active

↑(エクセルを保存した時点で)アクティブなシートを選択

sheet = ewb[ここにシートの名前文字列を入れる]

使いそうなやつ一覧

一応、気を付けているけど、間違ってたら直します
シート名:str
ewb:openpyxl.workbook.workbook.Workbook形式のオブジェクト?
sheet:openpyxl.worksheet.worksheet.Worksheet形式のオブジェクト?

ewb = openpyxl.Workbook()

ワークブック(openpyxl.workbook.workbook.Workbook)の新規作成。

ewb = openpyxl.load_workbook(filename)

filenameのExcelファイルの読み込み。(openpyxl.workbook.workbook.Workbook)

ワークブック(ewb)(type = openpyxl.workbook.workbook.Workbook)

for sheet in ewb:のようにfor文を回すとシートを順番に取得できるらしい。

ewb[シート名]

シート名で指定したシート。
指定したシートがない場合、

KeyError: 'Worksheet Sheet does not exist.'

になる

ewb.active

アクティブなシート(openpyxl.worksheet.worksheet.Worksheet)を返す

ewb.copy_worksheet(ewb[シート名])
ewb.create_sheet(シート名)

新しいシートをシート名で作成。同時にそのシート(openpyxl.worksheet.worksheet.Worksheet)を返す

ewb.index(sheet)

そのシートがワークブックの何番目のシートか返す

ewb.move_sheet(シート名, offset=n)

シートを右にn個移動

ewb.save(ファイル名)

ファイル名でワークブックを保存する

ewb.title

シートの名前を返す。ここに文字列を代入することでシート名を変えられる。

ワークシート(sheet)(type = openpyxl.worksheet.worksheet.Worksheet)

sheet.Worksheet[セル番号]

セル番号*1を指定する。同時にそのセル(openpyxl.cell.cell.Cell)を返す

sheet.iter_rows()

行ごとにfor文を回すならこれ使うみたい。
列の時はiter_colsを使うみたいだけどよく分かんないので必要なら探して。

セル(cell)(type = openpyxl.cell.cell.Cell)

cell = 文字列

そのセルに文字列を入れる

ewb = openpyxl.load_workbook('test.xlsx')
sheet = ewb["シート1"]
sheet['A1'] = 'Hello World'

こんな風にすると、シート1のセルA1にハローワールドできる。もっとも、これだけでは保存してないが。

cell.value

そのセルの値を返す


*1:"A1"みたいなやつ

メモ書き:欠損値等 「NaNって・・・」

なんなん?
はい。

メモっときたかったけどメモる場所が分からなかったので新しい記事で。

NaNかどうかを確認したくなった時どうすればいいかわからなかったのでとりあえずはそのメモ。

そもそもNaNなん?

NaN

Not a Numberの意味で、数値ではないことを示す
pandasとかnumpyで使うイメージ

NULL

ぬるぬる~
欠損値。元々値が存在していませんよ~って意味。
Sqlite3にNULLを入れたいときはNoneを渡せって聞いた。

NA

NearAirport
Not Available。そのデータは使えないよ~って意味。

NaNかどうかの確認

import math
math.isnan("判定したい値") # nanの時True

あとで追加しておいて

9周年あれこれ

 

黒ウィズ9周年です

めでたい!っていう記事じゃなくてごめんなさいね。

 

これはキャラプレ用のメモです。普段Twitterにやってるやつです。

f:id:Amesiorine271108:20220305163408p:imagef:id:Amesiorine271108:20220318205813p:image

とりあえず現状欲しいのはこんな感じ

XBヴィレス

・火闇のチェインプラスが欲しい

 

エステレラ4ソラヒカ

・火に状態異常無効がいないのでイレーナかソラヒカかどっちかは欲しい

 

GA2019ルミスフィレス

・あのルミスフィレスに勝るこのゲームのイラストを私は知らない

 

ミィア&ウリシラ

エリアナ

八百夜ミスティハイド

UUGリルム

・融合特殊変化は強い

ただ、ここで無理に1属性で何枠も取らなくてもいいかも。具体的にミィアウリシラとエリアナを選んでもいいかも。闇はアルドベリクがいるが火はハイパーアタッカーいないんだよなぁ……って考えると、エリアナ>ミィアウリシラ。

・というかステータス上がるのはなんでも強い

まあ8周年精霊もらえるかもしれないからゆっくりと見たい

追記:エニグマ来たので変更

スザク3ミュール

・火属性単体の高チェイン連撃アタッカーが欲しい

火の連鎖強撃は一応いるので1番強いのはミュールになるかも。現状ワンショットアタッカーは特別なカードが強いからそれで何とかなる。

 

8周年エニグマ

・同様にステータス上がれば強くね?の思想

来たのでなし

反転ノクス

・反転強化の雷闇いないのしんどい

→反転強化が来たので妥協していいかなぁ…交換先の予定はカヌエ

統一強化カヌエ

 

 

追記:

ヴィレス・ミスティハイド・ミュール・グレイちゃんが来ました。

ルミス……どこ……???

 

 

 

 

 

ルミスフィレスについて

欲しいのは「瞳に星を、剣に光を ルミスフィレス」(GA2019前半)

 

剣星華 ルミスフィレス はFC1

星夜に踊る華剣光 ルミスフィレス はFCP

誰かを助けるために ルミスフィレス はFC4

KnightSider ルミスフィレス はFC3

f:id:Amesiorine271108:20220305163412p:image

いないのか……

進行中:mp3の加工について(pydub,mutagen)

音楽を結構よく聞くんですよ。
んで、その音楽、どうにもジャンルがバラバラ、音の大きさもバラバラ。Spotifyみたいなストリーミングサービスを使っているわけではないので仕方ないですが、正直微妙な気持ちになっています。

じゃあ解決したいよね。

  • 0:前提条件
    • 0-0:前置き
    • 0-1:現環境
    • 0ー2:それを基にやりたいこと
      • 1: 大まかでいいので音量を揃えたい。
      • 2:最初と最後の無音区間の切り落としをしたい。
      • 3:現状、mp3ファイルに記録されているタグ情報を保持したい。
  • 1:メモ書き:pydub
    • 1ー0:インストール
    • 1-1:ファイルの読み込み
    • 1-2:mp3の再生
      • 要調査
    • 1-3:いろいろ確認
      • 1-3-1:音量
      • 1-3-2:音声の長さ
      • 1-3-3:フレームレート
    • 1-4:音声の加工
      • 1-4-1:切り出し・結合
      • 1-4-2:音量
      • 1-4-3:無音区間の切り落とし
    • 1-5:音声ファイルの保存
    • 1-6:無音区間を調べる
    • 1-7:先頭の無音区間の終了時間を調べる
    • CouldntDecodeError: Decoding failed. ffmpeg returned error code: 1
  • 2:メモ書き:mutagen
    • 2-0:インストール
    • 2-1:EasyID3
      • 2-1-1:読み込み
      • 2-1-2:タグ書き込み
      • 2-1-3:タグ一覧
    • 2-2:mutagen.id3(いつか書くかも)
    • KeyError: 'TPE1'
    • 未確認
  • 3:実践編
    • 3-1:基準の音量はどのくらい?
      • 3-1-1:Try1
      • 3-1-2:Try2「ジャンルごとに分けてみて見ましょう」
      • 3-1-3:Try3「うまくいきませんでした。」
      • 3-1ー4「空白部分を除去したもので再確認しよう」
      • 3-1-5:じゃあもう手作業や。
    • 検討案
    • 3-2:結局。
      • 3-2-1:構想
      • 3-2-2
      • 3-2-3:ファイル分け?
      • 3-2-4:新しい問題:可変ビットレート
  • (2022/5/6時点)
    • 欲しいもの
    • 考えること
      • タグ問題
      • 最終的なタグの形をこう定義する
  • 参考
続きを読む

メモ書き:vs pandas

長年pandasから逃げていましたが逃げられないことが多くなってきたので使うに応じて記憶の貯蔵をしていこうと決めました。
本当に何も分からないがそろそろpandasと和解していきたい。

未来の271108へ
matplotlibの時と同じように本当にメモ書きでつらつら書いていくのであとで清書してください。matplotlibの清書もやっておいてください。あれこの前更新したけど読みづらい、というかその場で必要になったことをその辺に落ちてたデータ使って無理やり記憶貯蔵しただけの記事なので。

まあ前書きはこんなのでいいでしょ。

DataFrameを変換したい!

List to DF
l_2d = [[0, 1, 2], [3, 4, 5]]
df = pd.DataFrame(l_2d)

なお、行名列名を指定することも可能

df = pd.DataFrame(, 
                  columns=["Col0", "Col1"],
                  index=["Ind0", "Ind1", "Ind2"] 
DF to list

pandas.DataFrame, pandas.Seriesをリスト型に直接変換するメソッドは無いため、values属性で取得できるNumPy配列ndarrayを経由して、ndarrayのtolist()メソッドでリストに変換する。

df = pd.DataFrame([[0, 1, 2], [3, 4, 5]])
l_2d = df.values.tolist()
Dict to DF

普通にappendできるしそれじゃダメ?だめそうな処理するときになったら調べて。
たぶん参考になるはず。読んでないけど。
Python 辞書を Pandas DataFrame に変換する方法 | Delft スタック

DF to dict
d = df.to_dict()

要調査

引数orientによって、pandas.DataFrameの行ラベル(行名)index、列ラベル(列名)columns、値valuesをどのように辞書のkey, valueに割り当てるかの形式を指定できる。

どういうことやねん

orientを使わない場合

orientにはdict, list, series, split, records, indexの6種類が指定できる。

orient="records"

空のDataFrameを作りたい!

import pandas as pd
df = pd.DataFrame(index=[], columns=cols)

DataFrameに行を追加していきたい!

気分としてはlistにappendしていきたい!みたいなものかね。

D2 = {}
D2["bpm"] = [compute_BPM(x)]
df = maindf.append(D2,ignore_index=True)

ignore_index=Trueにすることで、その列名が用意されていなくても新たに列を作って追加できる。
既存の列名がDataFrameにあるとその列に格納されるらしい。(というかまあ辞書型で入れてるから順番も何もないはずだしそりゃそうか)

CSVで読み書きしたい!

読み込み

df = pd.read_csv(csv_filename)

index_col を指定することでindexとなる列を指定できる。
一番左の列をindexにしたい場合はindex_col=0

書き込み

df.to_csv(csv_filename, header=True, index=True, encoding="utf-8_sig", sep=',')

header:headerをcsvに書くか(デフォルトTrue)
index:indexをcsvに書くか(デフォルトTrue)
encoding:出力ファイルのエンコーディング(デフォルトutf-8
sep:csvの区切り文字(デフォルト,)
あとはmodeとかあったはず。

DataFrameの結合をしたい

下につけたい!
appendみたいな感じで追加したいんだけど、いっぱい追加したい!

df_v = pd.concat([df1, df2], axis=0)

axis=0の時は行が追加される。・・・って言っても私にはよく分からなかった。
雰囲気としては、df1の表の下にdf2の表がくっつくって感じ。
ぜんぜんわからない。俺たちは雰囲気でプログラミングをやっている

右につけたい!
右も左も変わらんのでは?私にぁ何のことかよく分かりましぇん。

df_h = pd.concat([df1, df2], axis=1)

要調査:join="outer" / ”inner”

DataFrameをintに変換する

df['A'] = df['A'].astype('int')

これをすると列Aだけintに変換できる。

複数の列を表示したい

a[["file","dBFS","rms","max"]]

こうする

複数条件の検索

df0_4 = maindf[(maindf["genre"] == "Soundtrack") | (maindf["genre"] == "東方")]

「|」や「&」を使ってできる

並び替えをしたい

df.sort_values(列名)

Seriesの値だけ取り出したい

df ["dBFS"].values.tolist()

index等々が消去されたリスト形式で出てくる。

行名・列名の検索をしたい

完全一致

df.filter(items=['完全一致させたいワード1', '完全一致させたいワード'])

部分一致

df.filter(like='count', axis=1)

指定した列以外のデータが欲しい

df[df.columns[df.columns != 'b']]

この場合要らない列はb

列名・行名を付けたい

df = pd.DataFrame(sr)
colname = ["id", "author_name", "text"]
df.columns = colname

列数と列名リストのサイズが違うと、エラーになる。

列に格納されている値のバリエーションを確認したい

v = df['where_get_from'].value_counts()

ユニークな要素の値がindex、その出現個数がdataになっているpd.Seriesが返ってくる。

参考

これそのまんまじゃん!って言われるかもしれないんですけど、Web上のものなんていつ消えるか・変わるかわかったものじゃないんです。私用の記憶貯蔵庫ですので後で私が困った時にこの記憶貯蔵庫見て、それでもわかんないなら参考元見直して、それでもわかんないならどうにかするために参考を書いているんです。
まあ、はてなブログが死んだらこれも消えるんですけどね。
pandas.pydata.org
qiita.com
https://note.nkmk.me/python-pandas-list/
https://note.nkmk.me/python-pandas-assign-append/
https://note.nkmk.me/python-pandas-to-csv/
https://note.nkmk.me/python-pandas-to-dict/
https://note.nkmk.me/python-pandas-read-csv-tsv/
https://note.nkmk.me/python-pandas-concat/
https://note.nkmk.me/python-pandas-dataframe-rename/
https://www.delftstack.com/ja/howto/python-pandas/how-to-add-one-row-to-pandas-dataframe/
https://www.delftstack.com/ja/howto/python-pandas/select-multiple-columns-pandas/
http://hxn.blog.jp/archives/11591404.html
https://linus-mk.hatenablog.com/entry/pandas_convert_float_to_int
https://qiita.com/tiger-for-fun/items/ab265c7e07141ff42805
https://note.nkmk.me/python-pandas-index-columns-select/

メモ書き:FFmpeg

新しいPCに替えたとき、インストールしなきゃいけないものってたくさんあるじゃないですか。あるんです。
ffmpegもその一つですよね?その一つなんです。

というわけで今回のざっくりあっさりとメモ書きです。
例のごとく必要になったら追記するのでこれ書いてる時点ではインストールのことしか書かないかもしれません。
悪しからず、これは271108の記憶貯蔵庫であって、世界中みんなの記憶貯蔵庫ではないのだ。

1:インストール

一応書いておいた方がいいでしょう。と思ったので。

1-1:ダウンロード

なんも難しくないでしょう。
ググって、窓かリンゴかペンギンかを選んでそれっぽいのをダウンロード。
正直、271がやることなんざバージョンによる違いを気にしないことしかないはずです。
ググるのが面倒だったら↓からDLしてくださいな。
ffmpeg.org

メモ:gpllgpl

なお、GPLLGPLは規約が違うそうで。入っているエンコーダーそれぞれの規約の都合上、LGPLの方が少し規約が緩いらしく、エンコーダーも少ない。
ソフトウェアに使ったりしないできないのでGPLでいいんじゃないかな。

1-2:展開

今回はzipでダウンロードしたので普通に展開。他でも大きく変わらないんじゃないかな。わかんない。困ったらあとで書いておいて。

1-3:パスを通す

正直これ詳しくないからいつか調べたいね。正直、意味はうっすら感覚雰囲気でしかわかってないですわ。もはや儀式。

  1. 環境変数を開く
  2. pathの変数のところに、FFmpegbinファルダのパスを貼り付ける

はいおしまい。

1-4:アクセス拒否

なんかわからないけどめちゃくちゃアクセス拒否されました。管理者権限で実行してもダメ。Cドラ直下に置いたのが悪かったかなぁと思って別のところにおいてもダメ。所有者も私。

なんやろなあと思ってexeファイルで直接開いたら
windowsくん「不明な作成者だけどこれ実行するかい?」

はい。

はいを押したら以降はffmpegで動くようになりました。

2:変換

記入予定

エラー

ものすごく当たり前なことだけどコマンドラインで動かした都合上、「ファイル名にスペースがあるとそんなファイルないんだが?」ってキレられます。あるじゃん。

とりあえずで対処するために書いた。エラーあるかもしれないけど知りません。

def emptyremover(path):
    files = FileList(path)
    for file in files:
        filename = os.path.basename(file)
        if " " in filename:
            dirname = os.path.dirname(file)
            newfilename = dirname + "\\" + filename.replace(" ","")
            os.rename(file,newfilename)

オタクについて

「一期一会」という言葉があります。しっかり覚えていませんが元々はたしか茶道の言葉だったはずです。
一生に一度だけの機会。そこから、そのことに専念しなさいという戒めの意味もありましたかね。

私のような漠然と暮らしている者はその教えを守れておりません。
一度、どこかで読んだブログだったことは覚えていますが、そのブログはどこであったことやら。全く覚えておりません。


そのブログ記事ではおおよそ「かつてオタクと呼ばれた人たち」について書かれていました。
具体的な内容等はうろ覚えですので、該当のブログの執筆者の意図とは違うやもしれません。私の色眼鏡と欠落する記憶と、それから私の思考とが混在した形となるでしょう。
ふと思い出したのでこの記事を書いた次第です。

そのかつてオタクだった人たちはなんらかを大層愛していました。人によってこれは違うでしょう。アニメかもしれません、ゲームかもしれません。鉄道、アイドル、骨董品、映画……色々な趣味があります。
かつて見たテレビ番組で、現役のバス運転手とバスのオタクがクイズにて最も長い停留所を答えるというシーンがありました。その際早く解答したのは運転手だったのですが、オタクの人はその解答を聞いた後に「█████(記憶にないので伏せます)という停留所も同じ文字数で最も長い停留所です」と解答していたことを覚えています。
オタクとは、当人が好んでいるものや興味を持っている分野に対して、一般よりも深く愛好する人を指す言葉です。それゆえにその興味のある分野ではなんらかの面において誰にも負けないものが生じます。先の例ですと、現役の運転手が1つしか答えられなかった最長停留所名を複数解答できる知識、が誰にも負けないものにあたるでしょうか。
他にも、痛バックというものがありましたね。推しの缶バッジやキーホールダーなどを大量に着けているバックを指すものと認識しています。「この推しのことがこんなに好きで、こんなに缶バッジ持ってるんよ!」と言ったように愛を示すと聞きました。この場合だと、推しのグッズの購入量、が誰にも負けないものにあたるでしょう。

さて、このオタクという言葉、当人が好んでいる分野以外への関心が低いことからネガティブなイメージで使われる言葉でした。
興味のない分野への関心が低いため、例えば「友人が髪を切っても気付かない」だとか、「そもそも話が合う人間、友人となる存在がいない」だとか、周囲を疎かにしがちだからです。推測ですが「コミケの前には風呂に入れ」も美容やら体臭やらに関心がないから風呂に入らない連中もいるのでしょうし。

さて、最近ではオタクという単語が比較的軽くなりました。これは本題とは関係ありませんが、最近の若者(どのくらいの年代の事を指しているのかは分かりませんでした)には個性を求めてオタクを名乗る者もいるというニュースを読んだことがあります。このようにネガティブなイメージが薄れつつあるようです。

該当のブログではゲームオタクとアニメオタクを例にとっていたような気がします。
昔は夜更かしや徹夜をしてまで見ていたアニメオタク、新作が出ると必ずプレイして本棚をゲームで埋め尽くしていたゲームオタク、その活動が続いてるのか?と言った内容であるように私に伝わりました。
新作のアニメも追えずかつて持っていたホームページで行っていた考察もできなくなった元アニメオタク。
VTuberのゲーム配信を見るだけで、自分ではゲームをプレイすらしなくなった元ゲームオタク。
毎日Apexをちょこっとだけやってる元ゲームオタク。

まあたしかに、学生であれば徹夜しようとも翌日の授業中に寝てしまえば睡眠時間が取れます。しかし成長し、社会人となってしまってはそうはいかないでしょうけれどもね。


どこで読んだか思い出すことはできずとも、とても身に刺さるブログ記事でした。
私自身はVTuber見ていません。といっても、ただ1人が話している配信者というものが嫌いなだけで、代わりにボイスロイド実況見ています。どこかの誰かが考えた、作られた掛け合いが好きだからです。(「そのくせ作ってる動画は1役のボイスロイドが延々喋っているだけの動画なんですか?」という指摘は聞かないものとします。)

まぁ結局のところ、あのブログ記事に書かれている元ゲームオタクと変わりません。

Apexをやってなかったりしますが、別にこれもおんなじです。毎日おんなじゲームやってて。積みゲーを消化できずにいて。
もっとも、同じゲームを毎日やることが悪いことではないでしょう。私がそのゲームのオタクで。そのゲームに何か、誰にも負けないものがあるならば。いいことでしょう、あるならば。
別にないからやめるべきだと思っていませんけどね。
でも、なんですか?そのウィッシュリスト300件の山は。
なんですか?買ったくせに一度も起動しないゲームの吹き溜まりは。(バンドルで買っておまけでついてきたものを除いても存在するので言い訳なんて出来ませんよ。)

該当のブログにあったかすら覚えていませんが、「生産性のないオタクはオタクじゃない」という言葉をどこかで見聞きしました。そのオタクを抜きにして、世界がまわってしまったらオタクなんていないも同然になってしまいますからね。

消費というものは対価さえ払えば猿だってできると言えます。もちろんゲームを作った人たちは「このゲームで遊んで楽しかった!」と思ってもらえることを望んで作っていると思います。しかし、鍋敷にしようと烏避けにしようとHDDの傷にしようとも、いずれも「売り上げ個数+1」なのです。

私自身がゲームのオタクなのでその視点で考えると比較的生産というのはしづらいものですが。ゲームというのはプレイ体験の他にもストーリー、イラスト、BGMあとなんでしょうね。少し今は思いつきませんが複合芸術作品みたいなものですから。
でも、考察だって精算の一部でしょう。2次創作で漫画やイラスト、SSを書くことはもうそのまま創作でしょう。とはいえ別にそんな大きなものを作る必要なんてないでしょう。
友人が新たなゲームに触れる場を作ることだってある種「オタクを抜きにして世界が回っている」から外れることができるでしょう。

それから、オタクの活動というのはリソースの食い合いです。時間、金銭、体力。これら全てが無尽蔵にある人なんて存在しません。
船井さん、どの活動にどれほどリソースを割くかしっかり考えて使ってください。生活というのはTikTokじゃないんです。何も考えずに時間を使わないでください。



このブログ記事、単なる決意表明みたいなものですよ。
積みゲーの山から逃げるな。
Amesiorineを作れ。
動画投稿から逃げるな。

それだけです。