Python3関連のことを調べてみた2022年06月12日

Python3関連のことを調べてみた2022年06月12日

【Python】メルフィルタバンクからMFCCまで【特徴量抽出】

本記事では、音声データをMFCC(メル周波数ケプストラム係数)で特徴量抽出する方法を解説します。

ケプストラムとあるように、基本的理解にはケプストラム分析の概念が必要です。そちらの解説記事も書いていますので、ぜひご覧ください。

[【Python】音声の特徴量抽出MFCCの前段階:ケプストラム分析](https://qiita.com/Oka_D/items/cc296b358be340138f2c)
# MFCCの概要
MFCCは次のようにして求めます。
“`
1. 音声をフーリエ変換して周波数領域にする
2. メル尺度で周波数領域を変換し、フィルタバンクで周波数の情報を圧縮(メルフィルタバンク)
3. 対数パワースペクトルに変換
4. 離散コサイン変換し、ケフレンシー領域で低周波数と高周波数に分離
“`

MFCCではメルフィルタバンクとケプストラム分析のそれぞれを理解する必要があります。

## フィルタバンク
**フィルタバンク**とは、入力信号を分解するフィルタのことです。
重要な信号は密に取り、重要でない信号は比較的大雑把に取ります。今回のメルフィルタバンクの例でもそ

元記事を表示

【Python】TwitterAPIとtweepyを使用してツイート自動化を行う方法

よく記事にあがっているようなPythonによるTwitterの投稿でハマった箇所があったので、実装の振り返りをしつつ記事に残しておこうと思います。

# 実装
“`python:add_tweet.py
from pprint import pprint
import tweepy

import config

api_key = config.TWEETER_API_KEY
api_secret_key = config.TWEETER_API_SECRET_KEY
access_token = config.TWEETER_ACCESS_TOKEN
access_secret_token = config.TWEETER_ACCESS_SECRET_TOKEN

def clinet_info():
“””認証情報を返却する関数

Returns:
_type_: Client
“””
client = tweepy.Client(
consumer_key=api_key,

元記事を表示

Codility lesson3 PermMissingElem

Lesson3のPermMissingElemは欠けている数字を当てるというものです。
長さNのリストには1~N+1のいずれかが異なる形で入っている、逆にいうと一つ欠けていることがわかります。
[1,2,4,5]は3ですね。
[1,2,3,4]は5ですね。

さて今回の問題を考える上で、配列の順番を変えても特に問題はありませんよね。
例えば
[3,1,2,4]を[1,2,3,4]にする
[4,5,1,2]を[1,2,4,5]にした方が処理しやすいですよね。
なので今回は前回のlesson2 OddOccurencesInArrayのとき同様に先にソートしてから処理していきます。

アルゴリズムは以下の通りです。
1.順番通りにソートする
2.インデックス番号と比較してインデックス番号に対応している数字が来ていれば次に進む。
3.2の処理を繰り返し行うことでインデックス番号と対応していない数字、つまり欠けている数字の場所に到達するまで行う

コードは以下の通り

def solution(A):
A = sorted(A)
i = 0

元記事を表示

Codility lesson3 FrogJmp

Lesson3のFrogJmpの問題はカエルが登場したり飛んだり文章が無駄に長くなっていますが、要点は至ってシンプルです。
位置XにいるカエルはYに到達するまでに何回ジャンプすれば良いかというものです。

例えばX = 30 Y = 60 一回のジャンプで進む距離D=20だとすれば
最短2回で到達します。

(60-30)//20 = 1に 1を加える

例えばX = 30 Y = 60 一回のジャンプで進む距離D=30だとすれば
最短1回で到達します。

(60-30)//30 = 1

今回はアルゴリズムは説明するまでもなく、コードを見てもらった方が早いと思うので、
コードは以下の通りです。

def solution(X,Y,D):

if (Y – X)%D >= 1:
return (Y – X)//D +1
else:
return (Y – X)//D

さて結果は。。。。?

![スクリーンショット 2022-06-12 0.50.10.png](https://qiita-ima

元記事を表示

Codility lesson2 OddOccurencesInArray

Lesson3のOddOccurencesInArrayの内容はリスト内のペアになっていないものを返すというものです。
例えば、[1,2,3,4,3,2,1]においてペアになっていないものは4だけです。
例えば、[1,1,1,3,1,1,1]においてペアになっていないものは1です。
例えば、[1,1,1,3,3,1,,1]においてペアになっていないものは1です。

さて、ペアでないものを見つける一番はやい方法はなんでしょうか。

それはまずは並び替えるということです。

[1,2,3,4,3,2,1]ならば[1,1,2,2,3,3,4]なので4
[1,1,1,3,1,1,1]ならば[1,1,1,1,1,1,3]なので3
[1,1,1,3,3,1,,1ならば[1,1,1,1,1,3,3]なので1

こうした方が見やすいですよね。

アルゴリズムは以下の通りです。

[アルゴリズム]
1.リストの数字を小さい順に並び替える
2.先頭から順番に、現在の要素と次の要素が等しければ、それがペアとなるので、次のペアを探していく。
3ペアとならないものを見つけたらその数字を返す。

具体的にコード

元記事を表示

Codility lesson2 CyclicRotation

Codilityの問題を解くことにハマってきた。
今までは2重ループで全部強引突破してきたが、いかに無駄をなくせるかという視点でコードを書かなければならないので、
そういった処理速度を意識したコードを書くことができるようになる。皆さんもぜひやってみてください。

というわけでlesson2のCyclicRotationをやっていきます。

lesson2のCyclicRotationはリストの要素のシフトに関する問題。リストの要素を全て右にK個分シフトして、できたリストを返すという問題です。

[アルゴリズム]
1.全ての要素をずらす。
2.ずらして、リストからはみ出した分は余りとして捉え、余った分だけリストの先頭から入れていく。

具体的にコードを見ていこう。

def solution(A,K):
len_A = len(A)
rotated_list = [0]*(len_A) #回答用のリスト

for i in range(len_A):
rotated_list[(i+K)%len_A] =

元記事を表示

Codility lesson1 BinaryGap

企業の技術テストでCodilityの問題が出されることあり、最近Codilityについて勉強しているので、せっかくだし自分の回答をわかりやすく説明してQuitaに載せておこうと思う。

lesson1のBinaryGapの問題は受け取った値を二進数に変換した際に登場する0の個数に関する問題。
1で区切った際に最大の0の個数はいくつかを聞く問題だ。
例えば1000100の場合は4を返すようにする。

[アルゴリズム]
1.受け取った数値を二進数に変換する。
2.変換された値を桁ごとに区切り、それぞれの値をリストに格納する。
3.リストから要素数分、一つ一つ値を取り出していき、0になった瞬間からカウントを開始、0の個数を保持しておく。
4.0の出た回数をそれぞれを比較し最も多い回数を返せばいい。

具体的にコードを見ていこう。
(なお私のコードは処理速度を速くするためになるべく二重ループはしないように心掛けている。)

def solution(N):
bin_N = int(format(N,’b’))
bin_N_list = []

元記事を表示

PythonによるSTFT等で利用する窓関数の比較

# はじめに
出来る限り公式ドキュメントに従った実装を心掛けていますが、不慣れなところは見逃していただけると幸いです。

# 概観
#### 短時間フーリエ変換
[PythonによるFFTを用いたパワースペクトル推定](https://qiita.com/uene/items/8210234cb183851552da)では、時間領域信号をすべて周波数領域信号へ変換してその信号の性質を明らかにしようとする場合に用いられる[パワースペクトル](https://www.wavemetrics.com/products/igorpro/dataanalysis/signalprocessing/powerspectra)について解説しました。しかし、音声・音楽など時間とともに変化する信号を解析する際には時間情報も重要な情報です。そのように時間情報、周波数情報の二つの情報をある一つの信号から抽出する際に用いられる解析を[

PythonでGmailを自動送信する方法

最近、Pythonを始めるにあたり、自動化してみたかったGmailの送信処理の実装を行いました。
まだまだPython初心者に自分にとっては、学びになる点が多かったので共有したいと思います。

# 実装
実装は、多くの記事にあるように、Pythonのデフォルトのライブラリである`smtplib`と`MIMEText`の`email.mime.text`を使用して行います。

“`python:mailer.py
import smtplib
from email.mime.text import MIMEText
from dotenv import load_dotenv
import os
import csv

load_dotenv()

class Mailer:
“””メールを送信するクラス
“””

# 初期化
def __init__(self, addr_to, subject, body):
“””Mailerクラスのコンストラクタ

Args:
addr_to (_type_): 送信元先情報

Bカーブの可変抵抗の入力値を使って擬似的にAカーブのようなデータを取り出す

## 可変抵抗の種類について
可変抵抗には抵抗値の変化の特性によって、Aカーブ、Bカーブ、Cカーブといった主に3種類のものが存在するようです。
一般的にはAカーブ、Bカーブのものがよく使われるようですが、用途毎に準備しておくのも無駄ですし、Amazon等で安く購入できる物はBカーブのものが多い印象です。

都合によりAカーブのような特性をもたせたかったのですが手元にBカーブの可変抵抗しか持ち合わせていなかったので、計算式を用いて擬似的にAカーブ、それも任意のカーブ具合に調整できないか考えてみました。

## 計算式
#### 前提
RaspberryPi等で、12bitのA-Dコンバータ経由で可変抵抗の値を取得する場合を想定しています。
私の場合はRaspberryPi4Bと[MCP3208-CI/P](https://akizukidenshi.com/catalog/g/gI-00238/ “秋月電気通商”)を使用しました。

#### Bカーブの可変抵抗をそのまま使用する場合の計算式

$y=a\ x$
ここで、$x$は12bitなので0~4095まで変化します。この変化量はBカ

Pyenvを使ってから標準入力のリダイレクトがEOF errorになったので対処法

状況が特殊で同じような人はいないと思うけど備忘録

## 経緯
今まで`main.py`に`input.txt`からリダイレクトさせたいと思ったときに
`python main.py < input.txt`と入力していたが、それがPyenvを入れてから `EOFError: EOF when reading a line`になった ## 対処法 コマンドの最初の`python`をなくして`main.py < input.txt`に変えた ## あとがき 原因は謎 多分Pyenvを入れたことで、インタプリターへのパスが変わったとかだと思うけど、 `python main.py`のコマンドは普通に動作する...

会議など保存した音声ファイルの文字起こしをVOSKを使ってお手軽にやる

VOSKが流行っていたのでやってみました。
Google Colaboratoryで実施しましたが、Pythonだったら何でも大丈夫なはずです。

## 下準備する

“`
!pip3 install vosk
!git clone https://github.com/alphacep/vosk-api.git
!wget https://alphacephei.com/vosk/models/vosk-model-small-ja-0.22.zip
!unzip vosk-model-small-ja-0.22.zip
!mv vosk-model-small-ja-0.22 model
“`

## WAVファイルを準備する(アップロードする)

WAVファイルを準備する

16kHz,16bit,monoである必要あり。

以下の記事などを参考に
zoomで録画した動画からffmpeg, soxあたりで変換すると幸せになれました。

http://www.xucker.jpn.org/pc/ffmpeg_wav.html

https://qiita.com/mountce

PythonでGCSをトリガーにBQデータ格納

## やること
GCSにファイルがアップロードされたことをトリガーに、そのファイルをBQに格納する

## GCS
GCSのコンソール上で「バケットを作成」
※今回は名前が`test`
その下の階層に「フォルダを作成」
※こちらも名前が`test`

あげるファイル
`test20220606.csv`

date,id,name,click
2022-06-06,111111,Aki,4
2022-06-06,222222,Haru,10
2022-06-06,333333,Natu,23
2022-06-06,444444,Huyu,19
2022-06-06,555555,Oto,1

## BigQuery
プロジェクトからデータセットだけ作成
データセット名:`test`

## コード
requirements.txt

google-cloud-bigquery

`pip install -r requirements.txt`

main.py

from google.cloud import big

scipy.stats ジャック・ベラ検定 jarque_bera

# scipy.stats ジャック・ベラ検定 `jarque_bera`

データが尖度と歪度からみて,正規分布にしたがっているかを検定する。

サンプルサイズが 2000 以上の場合にのみ十分な近似ができる。小標本の場合には $\alpha$ エラーが大きくなりがちである。

`jarque_bera(x)`

“`python
from scipy.stats import jarque_bera
import numpy as np

np.random.seed(123)
x = np.random.normal(50, 10, 2000)
jarque_bera(x)
“`

Jarque_beraResult(statistic=4.35459209387323, pvalue=0.11334760325001603)

“`python
from scipy.stats import t
np.random.seed(123)
y = t.rvs(df=1, size=2000)
jarque_bera(y)
“`

Jarq

Pythonの例外エラーログ、もうちょっと詳しく見たくない?

ある日の某Pythonアプリケーションのエラーログを眺めていると謎のエラーが…!

“`
Traceback (most recent call last):
File “/sandbox/app.py”, line 22, in
main()
File “/sandbox/app.py”, line 17, in main
sub()
File “/sandbox/app.py”, line 10, in sub
raise Exception(“sub error!”)
Exception: sub error!
“`

例外が起きたときのTracebackですね。
Exceptionに詳細が記録されていればわかりやすいのですが、上記のようになぜエラーが起きたのかわからないと困りますよね。

そんなとき、Tracebackのstackを追いかける事でそのときのローカル変数を取得できます。

こんなアプリケーションがあるとして
“`
def sub():
d = 4
e = 5
raise Ex

python学習 – 2日目

# はじめに
python初心者がこっそり学習する。
2日間が空いてしまいました。。

# 今日やること
– 文字列
– 数値

# 文字列
## 文字列の書き方
文字列の書き方は、
– “(ダブルクォーテーション)で囲む
– ‘(シングルクォーテーション)で囲む

pythonの場合はどちらで囲んでも結果は同じ。
ただ、他言語を学んでいる人は、なんとなくどっちで囲むか感覚が身についているみたい。
文字列を’か”で囲んでいないと、コードが動かなくなるので注意。
膨大なコードを書いたときに、ここでミスすると修正が大変そう。。
`入力例`

“`
# 牛タンと表示
print(“牛”)
print(‘tongue’)
“`

`実行結果`
“`

tongue
“`

## エスケープ文字の扱い方
‘でも”でも、エスケープ文字を置換して出力する。
置換しない場合は文字列の前に r または R をつけると置換されなくなる。

`入力例`
“`
# スクール水着の間を改行
print(“スクール\n水着”)
“`

`実行結果`
“`
スクール
水着
“`

`入力例`

scipy.stats: Brunner-Munzel 検定 brunnermunzel

# scipy.stats: Brunner-Munzel 検定 `brunnermunzel`

Brunner-Munzel 検定を行う。

`brunnermunzel(x, y, alternative=’two-sided’, distribution=’t’, nan_policy=’propagate’)`

– `distribution` $p$ 値の計算に $t$ 分布を使う(デフォルト)とき `’t’`,標準正規分布を使うとき `’normal’` を指定する。

“`python
from scipy.stats import brunnermunzel
import numpy as np

x = np.array([1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 1, 1])
y = np.array([3, 3, 4, 3, 1, 2, 3, 1, 1, 5, 4])
brunnermunzel(x, y)
“`

BrunnerMunzelResult(statistic=3.1374674823029505

Error: java.lang.RuntimeException: PipeMapRed.waitOutputThreads() の解決法

###### 環境
– Windows 10 Pro(ホストOS)
– VMware Workstation 16 Player 16.2.3
– Ubuntu 22.04 LTS(ゲストOS)
– Hadoop 3.3.3
– openjdk version 11.0.15

###### 検証
1.下記コマンドを実行
“`
hadoop jar share/hadoop/tools/lib/hadoop-streaming-3.3.3.jar -files /var/tmp/mapper.py,/var/tmp/reducer.py -mapper /var/tmp/mapper.py -reducer /var/tmp/reducer.py -input /user/hadoop/input.txt -output /user/hadoop/pythonOutput
“`
“`/var/tmp/mapper.py
#!/usr/bin/env python
import sys

for l in sys.stdin:
for word

scipy.stats: ムード検定 mood

# scipy.stats: ムード検定 `mood`

2 つのデータが同じ分布で,尺度パラメータが等しいかどうかの検定である(ノンパラメトリック検定)。

`mood(x, y, axis=0, alternative=’two-sided’)`

戻り値は,検定統計量と $p$ 値である。

“`python
from scipy.stats import mood
import numpy as np

ramsay = np.array([111, 107, 100, 99, 102, 106, 109, 108, 104, 99,
101, 96, 97, 102, 107, 113, 116, 113, 110, 98])
jung_parekh = np.array([107, 108, 106, 98, 105, 103, 110, 105, 104,
100, 96, 108, 103, 104, 114, 114, 113, 108, 106, 99])
mood(ramsay, jung_parekh)
“`

scipy.stats: 二項検定 binomtest

# scipy.stats: 二項検定 `binomtest`

母比率の検定を行う。

`binomtest(k, n, p=0.5, alternative=’two-sided’)`

– `k` 成功数
– `n` 試行数
– `p` 母比率。デフォルトで 0.5
– `alternative` 検定種別。デフォルトで両側検定 `’two-sided’`,片側検定は `’greater’`,`’less’`

戻り値は `pvalue` などを含むオブジェクト

このオブジェクトのメソッド

`proportion_ci(confidence_level=0.95, method=’exact’)`

– `confidence_level` 信頼度
– `method` デフォルトは `’exact’`,その他に `’wilson’`,`’wilsoncc’`

“`python
from scipy.stats import binomtest

object = binomtest(682, 925, p = 3/4)
print(object.pvalue)
pri