ファイル名が一部不明な場合のリネーム (2017/04/08)

ファイル名が一部不明な場合にリネームするコードをPythonで書いてみる。

例えば「text@@@@.txt」というファイルがあるとする。これを「text.txt」にリネームしたい。だが、ファイル名が「text」から始まっているのは知っているが、「@@@@」が何か分からない場合、どうするか。

ワイルドカードを使って、「text*.txt」としてもエラーになる。「*.txt」ならエラーにはならないが、それでは拡張子がtxtのすべてのファイルが対象になってしまう。簡単そうで、意外と難しい(私だけ?)。

あれこれ試行錯誤した結果、あまりすっきりはしないが、一応の方法を見つけた。例として、作業ディレクトリに「text1234.txt」ファイルがあるとして、これを「text.txt」にリネームする。だが、「1234」の部分が正確にはどうであるかは分かっていない。

import glob
import os
new_name = 'text.txt'
for old_name in glob.glob('text*.txt'):
    os.rename(old_name, new_name)


「text1234.txt」ファイルが「text.txt」ファイルにリネームされる。「なんだ、「text*.txt」でもできるじゃないか」と思われるかもしれない。だが、これはglobを噛ませているからできるのである。

単にos.rename('text*.txt', new_name)とやるとエラーになる。

PandasのSeries、DataFrameの型変換 (2017/04/05)

pandasのSeriesやDataFrameの要素を型変換したい場合はastype()メソッドを使う。

例としてSeriesのfloat型の要素をint型に変換してみる。

import pandas as pd
s_float = pd.Series([1.0, 2.0, 3.0, 4.0, 5.0])
s_int = s_float.astype(int)
print('float型 =')
print(s_float)
print('int型 =')
print(s_int)


float型 =
0    1.0
1    2.0
2    3.0
3    4.0
4    5.0
dtype: float64
int型 =
0    1
1    2
2    3
3    4
4    5
dtype: int64

NumPyとPandasの標準偏差の違い

よく忘れるのでメモしておく。

NumPyは母標準偏差、Pandasは標本標準偏差

標準偏差の計算をするとき、NumPyではstd()関数、Pandasでもstd()関数を使う。だが、同じstd()関数でもデフォルトの設定の場合、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}}\]

式を見れば分かるように、nが十分に大きければ、差はほとんど無い。移動ウィンドウで計算する場合はnが小さいときがある。こういうときは標本標準偏差のほうがいいのかなと思う。

名称の整理

ところで、標準偏差は呼び方が紛らわしい。そこで簡単に整理する。

母標準偏差の別の呼び方

  • 標本標準偏差(えっ?)

標本標準偏差の別の呼び方

  • 不偏標準偏差
  • 標本不偏標準偏差
(2017/02/14更新)

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

Pandasデータフレームのインデックス名を変更したい場合は例えば以下のようにする。

○以下のコマンドをSpyderの「IPython console」にコピー&ペーストして「Enter」キーを2回押す。

import pandas as pd

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
(2017/02/06更新)

MarkdownをHTMLに変換 (2017/04/02)

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

以下はそのためのプログラム作成と実行の手順である。

markdownのインストール

これから作成するプログラムを実行するには、あらかじめ「markdown」ライブラリをインストールしておく必要がある。

  1. 以下のコマンドを端末にコピー&ペーストして「Enter」キーを押す。

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

プログラムの作成

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

# coding: utf-8

import sys
import markdown

def markdown2html(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に変換し、別ファイルとして作成する。
    markdown2html(md_file)

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

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

プログラムの実行

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

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

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