Pythonで遊んで株価を音声にしてみる（みたかった）

# 初めに
初心者がPythonで遊んだ備忘録。
Pythonも音声解析もなんもわからん…。

# モチベーション
最近、広告で[IG証券が株価を音楽にしている](https://ig-stockmusic.com/)のを見て（聞いて）、確かに株価も音声も一次元配列でいけるし、似てるな～と思い遊んでみたくなりました。
さらに軽く調べたところ、「[NumpyのarrayからPydubのAudioSegmentを作成する][NumpyPydub]」という記事から、Numpyのarrayから音声変換がお手軽にできそうということもわかりました。

[NumpyPydub]: https://own-search-and-study.xyz/2017/11/19/numpy%E3%81%AEarray%E3%81%8B%E3%82%89pydub%E3%81%AEaudiosegment%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B/

# 書いてみる
株価データはこちら

https://kabuoji3.com/stock/

より、2019年度のファーストリテイリング(9983)の株価を使用し、
音声データはこちら

https://www.nintendo.co.jp/ds/series/dsi/menu/sound/download.html

より、スーパーマリオ64のウォーターランドを使用しました。
また、作業はGoogleColabで行いました。

## pydybを確認しつつ、音声を眺めてみる
まずはドライブをマウントして、作業ディレクトリへ移動。
必要そうなライブラリをインポート。

```python
from pydub import AudioSegment
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
```

pydubがないと怒られたのでインストール
```
pip install pydub
```

手始めに「[NumpyのarrayからPydubのAudioSegmentを作成する][NumpyPydub]」より、引用させていただいたコードで確認してみる。
```python
#ファイル読み込み
sound = AudioSegment.from_file("data/ウォーターランド.m4a", "m4a")

#配列データ取り出し
samples = np.array(sound.get_array_of_samples())

#読み込んだ配列データから新しいAudioSegmentを作成
test = AudioSegment(
                    samples.astype("int16").tobytes(), 
                    sample_width=sound.sample_width, 
                    frame_rate=sound.frame_rate, 
                    channels=sound.channels,
                    )

#保存
test.export("data/test.mp3", format="mp3")
```
確かに、m4aからmp3nに問題なく変換されていた。

気になったのでshapeとか波形とか見ちゃう。
```python
print(samples.shape) #(4915072,)

plt.plot(samples)
plt.show()
```
![water-island-wave.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704322/f9008309-fcbd-487f-ccc4-3a16fb91d5db.png)
へぇ～
```
plt.plot(samples[200:600])
plt.show()
```
![water-island-wave-400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704322/9bdd410b-c71c-4098-a763-356048f46bd4.png)
ふぅ～ん
```
plt.plot(samples[200:300])
plt.show()
```
![water-island-wave-100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704322/0f1bdd94-26a0-201e-9dad-0444e0d63843.png)
ほぉ～

## 株価データいじってみる
```python
stock = pd.read_csv('data/9983_2019.csv', header=1, encoding='shift-jis')
print(stock.head())
print(stock.info())

#今回は終値を使ってみる
stock_close = stock["終値"] #shape -> (241, )
#それっぽい数値になるよう、平均だけ引いておく
stock_close = stock_close - stock_close.mean()
stock_close = stock_close.round().astype('int64')
#あとで音声変換にかけやすいようにひとまず240データにしておく
stock_close = stock_close.values[:-1]
```
適当に処理をして、
```python
x = np.array(range(stock_close.shape[0]))
plt.plot(x, stock_close, -stock_close)
plt.show()
```
正負を逆転させた奴とともにプロットしてみる。
![stock-price.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704322/c21bdde8-8815-4897-3623-9d478b8c3d99.png)
さらに、水増しをしつつ、この二つのデータをつないでみる。
```python
#各点を200個水増し
stock_close_exten1 = np.array([])
for i in range(stock_close.shape[0]):
    for j in range(200):
        stock_close_exten1 = np.concatenate([stock_close_exten1, stock_close[[i]]])

stock_close_minus = -stock_close
stock_close_exten2 = np.array([])
for i in range(stock_close_minus.shape[0]):
    for j in range(200):
        stock_close_exten2 = np.concatenate([stock_close_exten2, stock_close_minus[[i]]])

#交互に結合
stock_close_exten3 = np.empty((stock_close_exten1.shape[0] + stock_close_exten2.shape[0]), dtype=int)
stock_close_exten3[::2] = stock_close_exten1
stock_close_exten3[1::2] = stock_close_exten2
```
どれどれ…
```
plt.plot(stock_close_exten3)
plt.show()
```
![stock-price-wave1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704322/bebb2927-a55a-019c-0767-3bbf331f907b.png)
"ぽい"ですけどね～
投げてみましょう。
```python
test = AudioSegment(
                    stock_close_exten3.astype("int16").tobytes(), 
                    sample_width=2, 
                    frame_rate=44100,
                    channels=2,
                    )

test.export("data/stock_wave.mp3", format="mp3")
```
んんん～～？

__なんか[ゴーストのなきごえ](https://www.youtube.com/watch?v=tXGjNtuyR6g)みたいなやつできた（平たく言えば雑音）__
一応、株価から音声はできたので実験としてはよしとしましょう。

# まとめ
ふと、株価を音楽にする広告が流れてきたので、pythonを学習しつつ遊びました。
株価のarrayをpydubを用いて変換してみました。
また、価格の上下動についてわかりにくいのかなと、処理方法を変えてみたりしましたが、ダメでした。
![stock-price-wave2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704322/61eb2325-03ce-e27d-efaf-5fa923495bc4.png)
音声データの扱いについては何もわかっていないので、今後余力があればリベンジするかも？