Pandasメモ (2018/05/21)

Pandasの使い方をよく忘れるのでメモする。

準備

この記事ではNumPyとPandasを使うので、ここでインポートしておく。

○以下のコマンドをIPythonに入力して「Enter」キーを押す。

import numpy as np
import pandas as pd

データフレーム

○以下のコマンドをIPythonに入力して「Enter」キーを押す。

a = pd.DataFrame([[1, 2], [3, 4], [5, 6]])
b = pd.DataFrame([[1, 2], [3, 4], [5, 6]], index=['row1', 'row2', 'row3'], columns=['col1', 'col2'])
print(a)
print(b)

   0  1
0  1  2
1  3  4
2  5  6
      col1  col2
row1     1     2
row2     3     4
row3     5     6

データフレームのインデックス名の変更

○以下のコマンドをIPythonに入力して「Enter」キーを押す。

df = pd.DataFrame(index=['1', '2', '3'], columns=['A', 'B', 'C'])
print(df)
print('\n')
df.index.name = 'index name'
print(df)
print('\n')
df.index.name = None
print(df)

     A    B    C
1  NaN  NaN  NaN
2  NaN  NaN  NaN
3  NaN  NaN  NaN


              A    B    C
index name
1           NaN  NaN  NaN
2           NaN  NaN  NaN
3           NaN  NaN  NaN


     A    B    C
1  NaN  NaN  NaN
2  NaN  NaN  NaN
3  NaN  NaN  NaN

Numpy配列をPandasシリーズに変換する場合の注意点

Numpy配列を生成した後、これをPandasシリーズに変換して別の変数にしたとする。ところが、Numpy配列の要素を何かに置き換えると、別の変数であるはずのPandasシリーズのデータも置き換えられてしまう。これに注意しないと予想外の問題を起こす。

①以下のコマンドをIPythonに入力して「Enter」キーを押す。

a = np.array([1, 2, 3])
s = pd.Series(a)
print('s =')
print(s)
print('\n')
a[0] = 4
a[1] = 5
a[2] = 6
print('sはそのままで、aの要素を置き換えると')
print('s =')
print(s)

s =
0    1
1    2
2    3
dtype: int64


sはそのままで、aの要素を置き換えると
s =
0    4
1    5
2    6
dtype: int64

ややこしいが、個々の要素ではなく、Numpy配列そのものを置き換えた場合は問題ない。

②以下のコマンドをIPythonに入力して「Enter」キーを押す。

a = np.array([1, 2, 3])
s = pd.Series(a)
print('s =')
print(s)
print('\n')
a = np.array([4, 5, 6])
print('sはそのままで、aそのものを置き換えると')
print('s =')
print(s)

s =
0    1
1    2
2    3
dtype: int64


sはそのままで、aそのものを置き換えると
s =
0    1
1    2
2    3
dtype: int64

NumPyとPandasの標準偏差の違い

標準偏差はNumPyでは母標準偏差、Pandasでは標本標準偏差である。

なお、母標準偏差と標本標準偏差の違いは以下の通りである。

\[ 母標準偏差 = \sqrt{\frac {1} {n} \sum_{i=1}^{n} (x_i - \overline{x})^{2}}\] \[ 標本標準偏差 = \sqrt{\frac {1} {n - 1} \sum_{i=1}^{n} (x_i - \overline{x})^{2}}\]

NumPyメモ (2018/05/21)

NumPyの使い方をよく忘れるのでメモする。

準備

この記事ではNumPyを使うので、ここでインポートしておく。

○以下のコマンドをIPythonに入力して「Enter」キーを押す。

import numpy as np

配列

○以下のコマンドをIPythonに入力して「Enter」キーを押す。

a = np.array([1, 2, 3])
print(a)

[1 2 3]

連続した整数の生成

○以下のコマンドをIPythonに入力して「Enter」キーを押す。

a = np.arange(-5, 5)
b = np.arange(-5, 5, 2)
print(a)
print(b)

[-5 -4 -3 -2 -1  0  1  2  3  4]
[-5 -3 -1  1  3]

非数値の確認

○以下のコマンドをIPythonに入力して「Enter」キーを押す。

a = np.array([np.nan, 1])
print(a)
print(np.isnan(a))

[ nan   1.]
[ True False]

切り上げ

○以下のコマンドをIPythonに入力して「Enter」キーを押す。

a = 1.2
print(a)
print(np.ceil(a))

1.2
2.0

切り捨て

○以下のコマンドをIPythonに入力して「Enter」キーを押す。

a = 1.8
print(a)
print(np.floor(a))

1.8
1.0

四捨五入

○以下のコマンドをIPythonに入力して「Enter」キーを押す。

a = 1.234
b = 9.876
print(a)
print(b)
print(np.round(a))
print(np.round(b))
print(np.round(a, 2))
print(np.round(b, 2))

1.234
9.876
1.0
10.0
1.23
9.88

要素へのアクセス

○以下のコマンドをIPythonに入力して「Enter」キーを押す。

a = np.arange(-5, 5)
print(a)
print(a[2])

[-5 -4 -3 -2 -1  0  1  2  3  4]
-3

要素の検索

○以下のコマンドをIPythonに入力して「Enter」キーを押す。

a = np.arange(1, 10)
print(a)
print(a[a==5])
print(a[a>5])
print(a[(a>3) & (a<8)])
print(a[(a<3) | (a>8)])

[1 2 3 4 5 6 7 8 9]
[5]
[6 7 8 9]
[4 5 6 7]
[1 2 9]

MarkdownをHTMLに変換(自分用) (2018/05/17)

Markdownで書いたブログ記事をHTMLに変換する。私はブログ記事をMarkdownで書き、それをHTMLに変換してからブログにアップしている。

markdownのインストール

MarkdownをHTMLに変換するに当たり、Pythonの「markdown」ライブラリを利用している。そこで、このライブラリをインストールしておく。

○以下のコマンドを端末に入力して「Enter」キーを押す。

$ conda install markdown

もし「Proceed ([y]/n)?」と表示されたら「Enter」キーを押す。

プログラムの作成

下のコードを「~/py」フォルダーに「convert_markdown_to_html.py」ファイルとして保存する。

# coding: utf-8

import sys
import markdown

def convert_markdown_to_html(md_file):
    '''markdownで書かれたファイルをhtmlに変換し、別ファイルとして作成する。
        Args:
            md_file: mdファイル名。
    '''
    # ファイルを読み込む。
    input_file = markdown.codecs.open(md_file, mode='r', encoding='utf-8')
    text = input_file.read()
    # htmlに変換する。
    html = (
        '<script src="https://cdn.rawgit.com/google/code-prettify/master/' +
        'loader/run_prettify.js"></script>\n' +
        '<script type="text/x-mathjax-config">' +
        'MathJax.Hub.Config({displayAlign: "left", displayIndent: "2em"});' +
        '</script>\n' +
        '<script type="text/javascript" src="https://cdn.mathjax.org/' +
        'mathjax/latest/MathJax.js?config=TeX-AMS-MML_SVG"></script>\n\n')
    temp = markdown.markdown(text)
    html = "{}{}".format(html, temp)
    html = html.replace('<pre>', '<pre class="prettyprint">')
    # 書き込み用のファイルを作成する。
    html_file = md_file.replace('.md', '.html')
    output_file = markdown.codecs.open(html_file, 'w', encoding='utf-8',
                                       errors='xmlcharrefreplace')
    # ファイルを書き込む。
    output_file.write(html)

if __name__ == '__main__':
    # 設定を読み込む。
    argv = sys.argv
    md_file = argv[1]
    # markdownで書かれたファイルをhtmlに変換し、別ファイルとして作成する。
    convert_markdown_to_html(md_file)

このプログラムではシンタックスハイライトとMathJaxが利用できるようにしている。また、エスケープ処理も行っている。

エスケープ処理はMarkdownで書かれたもののみ実行される。MarkdownとHTMLを併用した場合、HTMLで書かれた部分は処理されない。特にコードをpreタグで囲んだりするとその部分はエスケープ処理が行われないので注意。

プログラムの実行

「~/ドキュメント/blog/00」フォルダーにMarkdownで書かれた「00.md」ファイルがあるとして説明する。

○以下のコマンドをIPythonに入力して「Enter」キーを押す。

%run ~/py/convert_markdown_to_html.py ~/ドキュメント/blog/00/00.md

「~/ドキュメント/blog/00」フォルダーにhtmlに変換された「00.html」ファイルが生成する。

Python環境の構築 (2018/04/29)

Ubuntuには初めからPythonがインストールされている。だが、ここではAnacondaをインストールして、その中のPythonを使うことにする。いくつかのライブラリはAnacondaからのほうが導入が楽だからである。

環境

CPU:Core i7 2600K

OS:Ubuntu 18.04 LTS

ブラウザ:Firefox 59.0.2(64 ビット)

Anacondaのインストール

①以下のアドレスをクリックする。

https://www.anaconda.com/download/#linux

②「Anaconda 5.1 For Linux Installer」で「Python 3.6 version」の「Download」ボタンをクリックする。

環境によってダウンロードされるファイルが違うようである。私の場合は「Anaconda3-5.1.0-Linux-x86_64.sh」ファイルがダウンロードされる。

③「Anaconda3-5.1.0-Linux-x86_64.sh を開く」で「ファイルを保存する」を選択し、「OK」ボタンをクリックする。

私の環境ではファイルは「~/ダウンロード」フォルダーに保存される。サイズが大きいのでしばらく待つ。

④ブラウザに戻って「Thank You For Downloading Anaconda!」で「No Thanks」ボタンをクリックする。

⑤端末で以下のコマンドを実行する。

$ bash ~/ダウンロード/Anaconda3-5.1.0-Linux-x86_64.sh

⑥端末の

Please, press ENTER to continue
>>>

で、

Please answer 'yes' or 'no':'
>>>

と表示されるまで「Enter」キーを押し続ける。

⑦「yes」と入力して「Enter」キーを押す。

⑧端末の

[/home/****/anaconda3] >>>

で「Enter」キーを押す。インストールが始まるので、しばらく待つ。

⑨端末の

[no] >>>

で「yes」と入力して「Enter」キーを押す。

⑩端末の

Do you wish to proceed with the installation of Microsoft VSCode? [yes|no]
>>>

で「no」と入力して「Enter」キーを押す。

マイクロソフトのVisual Studio Codeがインストールできるようだが、とりあえず使う予定がないのでここではインストールしない。

⑪端末を再起動する。

設定を反映させるにはこの手順が必要なようである。

Anacondaのアップデート

①端末で以下のコマンドを実行する。

$ conda update conda;conda update anaconda;conda update --all

②もし端末で

Proceed ([y]/n)?

と表示されたら「Enter」キーを押す。さらに数回表示される可能性があるが、同様に「Enter」キーを押す。

作業用フォルダーの作成

○端末で以下のコマンドを実行する。

$ mkdir ~/py

「ホーム」フォルダーに「py」フォルダーが生成する。これを作業用フォルダーとする。

SpyderのLauncherへの登録

現在(2018年4月29日)の時点でSpyderにはバグがあるらしく、起動できない。このため、下の手順は未確認。

①端末で以下のコマンドを実行する。

$ spyder

Spyderが起動する。

②Launcher上の「Spyder (Python 3.4)」を右クリックする。

③「お気に入りに追加」を選択する。

Spyderの設定

同上。

①Spyderのメニューバーで「ツール」をクリックする。

②「設定」をクリックする。

③「設定」で「現在の作業ディレクトリ」をクリックする。

④「コンソールディレクトリ」で「以下のディレクトリ」を選択する。

⑤続いて「/home/****/py」を選択する。

⑥「設定」で「IPythonコンソール」をクリックする。

⑨「グラフィックス」タブをクリックする。

⑩「画像のサポート(Matplotlib)」で「サポートを有効化」にチェックを入れる。

⑪「設定」で「OK」ボタンをクリックする。

ライブラリのインストール

Anacondaにはデフォルトで含まれていないライブラリがある。その中で私がよく使うものをここでインストールする。

以下の手順で、もし端末に

Proceed ([y]/n)?

と表示されたら、その都度「Enter」キーを押す。

OANDA API

現在(2018年4月29日)の時点で以下の手順ではうまくいかない。とりあえず保留。

①端末で以下のコマンドを実行する。

$ pip install git+https://github.com/oanda/oandapy.git

TensorFlow

②端末で以下のコマンドを実行する。

$ pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.8.0-cp36-cp36m-linux_x86_64.whl

私のPCは古いので、ここではPython 3.6対応、CPUのみのバージョンをインストールする。

また、TensorFlowのチュートリアルによると、先ずTensorFlow用の環境を作り、そこにインストールすることを推奨しているようだ。だが、私としては使い勝手が悪いので、ここでは直接インストールすることにする。

CVXOPT

③端末で以下のコマンドを実行する。

$ conda install cvxopt

pandas-datareader

④端末で以下のコマンドを実行する。

$ conda install pandas-datareader

jupyter

⑤端末で以下のコマンドを実行する。

$ conda install -c conda-forge jupyter_contrib_nbextensions

markdown

⑥端末で以下のコマンドを実行する。

$ conda install markdown

ライブラリのチュートリアル(入門レベル)

pandas

http://pandas.pydata.org/pandas-docs/stable/10min.html

scikit-learn

http://scikit-learn.org/stable/tutorial/basic/tutorial.html

TensorFlow

https://www.tensorflow.org/get_started/get_started_for_beginners

tf.estimator

https://www.tensorflow.org/get_started/premade_estimators

OverflowError: signed integer is greater than maximum (2017/11/23)

MatplotlibでPandasのデータをグラフにしようとすると、

OverflowError: signed integer is greater than maximum

というエラーが出るようになった。最近のPandasのアップデートが原因らしい。

とりあえず、プログラムに以下をおまじないとして加えるとエラーは解消する。

import pandas.plotting._converter as pandacnv
pandacnv.register()

参考リンク

https://stackoverflow.com/questions/47404653/pandas-0-21-0-timestamp-compatibility-issue-with-matplotlib