CPUの創りかた

CPUの創りかた

CPUの創りかた

 
最近は、これ読んでます。
表紙はふたむかし前くらいの萌え絵ですが、かなり評価は高く良本らしい。
コンピュータの中のブラックボックスを一部分でも理解したいと思う人にはかなりおすすめです。
 

まだ読んだのは数章だけですが、面白いです。
純粋な読み物としてもいいですし、実際に部品とテスターを買ってきて、CPUを作ってみても面白そう。
 
本中にも少しコメントされていましたが、こうやってCPUを自分で創り、連続値を持つアナログな電流を操ってデジタル信号を具現化し、それで実際に計算するという体験を通して、アナログな実世界(リアルワールド)と抽象的なデジタル世界を繋ぐ装置としてのCPUを実感できるのでしょう。
 
一通り本を読んだあと暇があれば工作もしてみてもいいなと思いながら読み進めてます。
ちょうど秋葉原に行く機会も増えたことですし。
ただ、この本に出てくる、74HCシリーズってICは今も売っているものなんでしょうかね。。。
実際のお店で探すのが楽しみです。
 
あと、今現役のチップセットの内容なんてとても理解なんてできっこないのに、今後技術がさらに進歩していく中で、だれがどこまでの範囲で中身を理解して、改良していくのか、そのプロセスが純粋に疑問だったりします。

リアルワールドと抽象世界を繋ぐ仕組みを体験して実感するということは、今後の人生の中で必ず役に立つ貴重な体験になるはずです。
 

PandasのDataFrame関連でよく使うTips

自分のためのメモ。
主にデータ分析用途でサクッとDataFrameにデータを格納して、いろいろいじりたいときに使う前処理や統計値確認メソッド。

Nullがあるか確認して適当に埋める

# df全体にあるnullの数をカウント
df.isnull().sum()

# 特定のカラムにあるnullの数をカウント
# XXXにカラム名
df.XXX.isnull().sum()


# dfの中のNullを0に変換
df = df.replace(np.nan,0)

# dfの特定のカラムのNullを0に変換
# XXXにカラム名
df.XXX = df.XXX.replace(np.nan,0)

 

ざっくり統計値を確認

文字列と数値のカラムが混ざったりしていても、適当に考慮して省いてくれたりするので、手早くざっくり見たいときには重宝します。

df.describe()

 

特定のカラムの値でGroup Byして、集計関数を適用

こちらも、集計できないカラムは適当に省いてくれます。
sqlでできればそっちの方が早いし、そうすべきなのですが、手元にすでにDataFrameとしてあるデータをちゃちゃっと見たい時ってありますよね。

# 見たいカラムをXXXとして、

# 要素数のカウント
df.groupby('XXX').count()

# 合計
df.groupby('XXX').sum()

# 先ほどのdescribe()もあります
df.groupby('XXX').describe()

# その他 ここら辺になるとsqlで計算しよろって感じになりますが
df.groupby('XXX').first()
df.groupby('XXX').last()

# 複数のカラムでのGroup Byもできます
df.groupby(['XXX','YYY']).count()

 

jupyterでのDataFrame表示を省略させない

# 表示するカラム数をoptionメソッドで指定します
pd.options.display.max_columns = 300

 

pandasでグラフを描くときのTips

pandasでDataFrameとしてデータをインポートしてから、とりあえずグラフ化して分布を確認したいことがよくあります。
そのときに個人的によく使うコードをメモ。


細かい設定とかでビジュアル整えようと思ったら、いくらでも設定あるらしいのですが、実際にpythonでどこまで労力をかけて可視化を努力するかが問題なんですよね。

個人的には、pythonでの可視化は、ちゃんとしたデータの可視化というよりは、自分で分析の方針を立てるための事前調査とかのレベルで使ってます。つまり、細かいところにはあまりこだわらず、自分でデータの傾向が読み取れればそれでよいというレベル。
他人に共有したり、レポーティングしたりする場合は、pythonでのグラフも使いますが、必要に応じてtableauなどの別ルーツを使ったりもします。

大体、SQLでアクセスしたデータをDataFrameとしてpythonで読み込み、いろいろ可視化してみる(データの分布自体の可視化)→統計モデリング機械学習→結果をまた可視化(パラメータの分布を可視化)という感じです。


pd.DataFrame.plot()メソッド

まずは準備としてライブラリをインポートします。
※jupyter notebookで書くのを前提にしています。一応。
データは適当にDataFrameを作成。

In [1]: import matplotlib.pyplot as plt
        import pandas as pd
        import seaborn as sns
        sns.set_style('whitegrid')
        %matplotlib inline
        #ライブラリのインポートとか

In [2]: df_sample = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
        df_sample.columns = ['a','b','c']
        df_sample
        #適当なデータフレームを作成
out [2]: 
   a b c
ーーーーー
0| 1 2 3
1| 4 5 6
2| 7 8 9

 
DataFrameの一番簡単な可視化は、.plotメソッド。
デフォルトでは線グラフで描画されます。

df_sample.plot()

f:id:spitta8823:20170614015741p:plain
これだけで最低限の可視化は出来ます。

棒グラフ

何も考えずに棒グラフにしたい場合。

df_sample.plot(kind='bar')

f:id:spitta8823:20170614015755p:plain

ヒストグラム

値の度数分布を可視化したい場合。

df_sample.plot(kind='hist',bins=10)

引数binsに、分布をいくつに分解したいかを入力します。

 
また、ヒストグラムに関しては、matplotlib.pyplotを使って下記のような書き方もよくします。データによりますが、主にいくつかの系列別に分布を可視化したい場合に使います。
多少複雑になるので、DataFrameのメソッドを使うよりも小回りが効く感じです。

In [3]: df_sample = pd.DataFrame([[1,1,1,1,1,1,2,2,2,3,3,4,5,6,7,8,9,10,11,12],[1,1,1,1,1,2,2,2,3,3,3,4,5,6,7,8,9,10,11,12]])
        df_sample = df_sample.T
        df_sample.columns = ['a','b']
        df_sample
        #ヒストグラム的な適当なサンプルデータ
out[3]: 
   a b
ーーー
0| 1 1
1| 1 1
2| 1 1
3| 1 1
4| 1 1
5| 1 2
6| 2 2
7| 2 2
8| 2 3
9| 3 3
10| 3 3
...

In [4]: plt.hist(df_sample['a'], bins=12, alpha=0.2, histtype='stepfilled', color='r', range = (0, 12))
        plt.hist(df_sample['b'], bins=12, alpha=0.2, histtype='stepfilled', color='b', range = (0, 12))
        plt.xlabel('x_label')
        plt.ylabel('y_label')
        plt.title('Title')
        plt.legend(['a','b'])
        #matplotlib.pyplotで描画

plt.hitsでヒストグラムを描画して、引数として、alphaはグラフの透過度です。
plt.legend()では、系列と色の関係の説明を付けてます。