[Python] 311 pyenv環境へのpandasインストール[Apple Silicon]

[macOS Monterey 12.0.1]

これまでM1 Macにpipでpandasをインストールしようとしてもエラーになり、Miniforge環境でしかインストールできない状況が続いていました。

ようやくpandas開発元が昨日2021年10月30日にpandas1.3.4のM1 Mac用whlファイルをアップしてくれました。Python3.10にインストールできます。

以下に手順を書いておきます。

1. PyPIサイトから以下のwhlファイルをダウンロードする。
pandas-1.3.4-cp310-cp310-macosx_11_0_arm64.whl (10.3 MB)

2. pipコマンドでインストールする。

ファイルへのアクセスが拒否される場合はシステム環境設定でアクセスを許可するか、ファイルを適当な所に移動させてください。前者の場合、”セキュリティとプライバシー”でターミナルがダウンロードフォルダにアクセスできるようにします。

pip install pandas-1.3.4-cp310-cp310-macosx_11_0_arm64.whl
--------------------------------------------------

出力
--------------------------------------------------
Successfully installed numpy-1.21.3 pandas-1.3.4 python-dateutil-2.8.2 pytz-2021.3 six-1.16.0

whlファイルをダウンロードせずにいきなりpip install pandasを実行するとソースコードのtarファイルをダウンロードしますが、必ずビルドに失敗します。

昨年M1 MacBook Airを購入した際、pandasがどうしてもインストールできず、Rosetta2のもっさり感も気になってやむなく返品しました。11ヶ月後に今度はM1 Mac miniを購入して、相変わらずpandasがpipでインストールできずにがっかりしたんですが、3日後にwhlファイルがリリースされ本当に感謝の一言です。これでpyenvでの開発環境をM1 Macでも再現できそうです。

[Python] 310 matplotlib CSVから複数系列の棒グラフ作成

matplotlibを使ってCSVから複数系列の棒グラフを作成しました。

df.plotからplt.suptitleへの流れに唐突感がありますが、pandasからmatplotlibへグラフデータがしっかり引き継がれています。

import pandas as pd
import matplotlib.pyplot as plt
import datetime
 
df = pd.read_csv('tensorflow_macos_graph.csv',index_col=0,encoding = 'UTF8')

color_list = ['#1e90ff','#32cd32']
df.plot(kind='bar',color = color_list,figsize = (7,5),ylabel = 'Time(sec)',rot=0)
plt.suptitle('Keras Training Time', fontsize=18)

dt_now = datetime.datetime.now()
dt_now_str = dt_now.strftime('%y%m%d%H%M')

image ='{}_tensorflow_macos.png'.format(dt_now_str)

plt.savefig(image) 
plt.show()
,CPU,GPU
Intel Mac mini [Big Sur],61.5,172.1
M1 Mac mini [Monterey],39,194.9
M1 Mac mini [Big Sur],23.1,0

[Bash] 01 アプリの起動時間測定

[macOS Catalina 10.15.7]

Google Chromeを新しいウィンドウで起動する際の起動時間をBashで測定しました。

time open -na '/Applications/Google Chrome.app' --args --new-window
--------------------------------------------------

出力例
--------------------------------------------------
real	0m0.099s
user	0m0.012s
sys	0m0.013s

[Python] 309 日本語フォント名の抽出

[macOS Catalina 10.15.7]

Macに入っている日本語フォント名を抽出するコードを書きました。平仮名の”あ”に該当するグリフ(字体)の有無で判定しています。私の環境には24種類以上あることが分かりました。

ttcファイルおよびotfファイルについては中に入っている最初のフォントを判定しています。

Last Resort Fontというフォールバック用フォントの存在を初めて知りました。

from fontTools import ttLib
from pathlib import Path
import glob
import pprint

HOME = Path.home()
print(str(HOME))

OSXFontDirectories = [
    "/Library/Fonts/",
    "/Network/Library/Fonts/",
    "/System/Library/Fonts/",
    "/opt/local/share/fonts/",
    str(HOME / "Library/Fonts/"),
]

font_paths = list()
for dir in OSXFontDirectories:
    paths_ttf = glob.glob(dir + "*.ttf")
    paths_ttc = glob.glob(dir + "*.ttc")
    paths_otf = glob.glob(dir + "*.otf")
    paths = paths_ttf + paths_ttc + paths_otf
    for path in paths:
        font_paths.append(path)

list_jfont = {}
for path in font_paths:
    font = ttLib.TTFont(path, fontNumber=0)
    cmap = font["cmap"]
    fontfile = path.split('/')[-1]
    for uni, id in cmap.getBestCmap().items():
        if uni == 12354:
            list_jfont.update({fontfile:id})

pprint.pprint(list_jfont)
print(len(list_jfont))
--------------------------------------------------

出力
--------------------------------------------------
{'AppleSDGothicNeo.ttc': 'cid00852',
 'AquaKana.ttc': '.notdef#16152',
 'Arial Unicode.ttf': 'uni3042',
 'BIZ-UDGothicB.ttc': 'uni3042',
 'BIZ-UDGothicR.ttc': 'uni3042',
 'BIZ-UDMinchoM.ttc': 'uni3042',
 'Hiragino Sans GB.ttc': 'cid00357',
 'LastResort.otf': 'lastresorttemplate',
 'PingFang.ttc': 'cid00856',
 'STHeiti Light.ttc': 'uni3042',
 'STHeiti Medium.ttc': 'uni3042',
 'ipamjm.ttf': 'aj843',
 'ヒラギノ丸ゴ ProN W4.ttc': 'cid00843',
 'ヒラギノ明朝 ProN.ttc': 'cid00843',
 'ヒラギノ角ゴシック W0.ttc': 'cid00843',
 'ヒラギノ角ゴシック W1.ttc': 'cid00843',
 'ヒラギノ角ゴシック W2.ttc': 'cid00843',
 'ヒラギノ角ゴシック W3.ttc': 'cid00843',
 'ヒラギノ角ゴシック W4.ttc': 'cid00843',
 'ヒラギノ角ゴシック W5.ttc': 'cid00843',
 'ヒラギノ角ゴシック W6.ttc': 'cid00843',
 'ヒラギノ角ゴシック W7.ttc': 'cid00843',
 'ヒラギノ角ゴシック W8.ttc': 'cid00843',
 'ヒラギノ角ゴシック W9.ttc': 'cid00843'}
24

[Python] 308 matplotlib 日本語フォント

[macOS Catalina 10.15.7]

matplotlibで使える日本語フォントを探すため、使用可能な全フォントについて”あいうえお”をグラフとして表示させてみました。私の環境では全体で301種類のフォントが使用可能です。

元々macOSのFont Bookアプリで日本語フォントを確認できますが、今回はアプリを使わずに検索しています。

下図から”あいうえお”と表示されているフォントをmatplotlibでグラフ作成する際に指定すればOKなのですが、いちいちフォント名を目視で拾い出す作業が不毛なので効率的な方法を模索しています。

例えば、”あ”のユニコードは10進数で12354(16進数では3042)ですから、フォントデータ内をユニコードで検索し該当するグリフ(字体)があれば日本語フォントであると判定できます。

フォントファイルのパスをリスト化するなどしたいのですが、ttfファイルはともかくttcファイル内にあるフォントの確認方法が分からず停滞しています。

import matplotlib.pyplot as plt
import matplotlib

image_font ='font.png'

fonts = set([f.name for f in matplotlib.font_manager.fontManager.ttflist])
print(fonts)
print(f'フォント数 {len(fonts)}')

# 図のサイズ設定
fig = plt.figure(figsize=(10,len(fonts)/4))

# グラフへのフォント表示
for i, font in enumerate(fonts):
    plt.text(0, i, f"あいうえお:{font}", fontname=font)

# グラフ設定
plt.ylim(0, len(fonts))
plt.axis("off")

plt.show()
fig.savefig(image_font)