This post is also available in: English-US (英語)
python3でファイナンス系のデータを扱っている時に、astype(float) 関数でfloat型に変換しようとすると、データ内のマイナス記号が原因でエラーが出ることがたまにあります。
ValueError: could not convert string to float: '−12'
これは、マイナスを表す記号がいくつか存在する事が原因だったりするので、対処法をメモ代わりに書いています。
Contents
この記事の内容を要約して、動画にしたバージョン
マイナスを表す記号はいくつかあるらしい
慣れ親しんだキーボードから入力しているマイナス記号は、下記のマイナスとなります。
HYPHEN-MINUS(ハイフンマイナス、U+002D)と呼ばれるものらしいです。
import unicodedata
# HYPHEN-MINUS
print(unicodedata.name("-")) # HYPHEN-MINUS
print("-".encode('utf-8')) # b'-'
print(b'-'.decode('utf-8')) # -
ですが、マイナスっぽい記号はいくつか存在します。
下記は、MINUS SIGN(マイナス記号,U+2212)と呼ばれるものらしいです。
import unicodedata
# MINUS SIGN
print(unicodedata.name("−")) # MINUS SIGN
print("−".encode('utf-8')) # b'\xe2\x88\x92'
print(b'\xe2\x88\x92'.decode('utf-8')) # −
MINUS SIGN(マイナス記号,U+2212)がついた数字を astype(float) 関数でfloat型に変換しようとすると、"ValueError: could not convert string to float" というエラーが出ます。
マイナス記号(MINUS SIGN)がついた数字を、float型に変換するサンプルコード
「MINUS SIGN」がマイナス記号として付与されているサンプルデータを、「HYPHEN-MINUS」に置換して、float型に変換するサンプルコードです。
ファイナンス系のデータはだいたいパーセントが付いていると思いますので、サンプルデータも%を付けてあります。
import pandas as pd
# MINUS SIGN が付与されているサンプルデータ
sample = [["−12%","10%","0%"],["−8%","−4%","5%"]]
df = pd.DataFrame(sample)
print(df)
"""
0 1 2
0 −12% 10% 0%
1 −8% −4% 5%
"""
# カラム名/列名を順番にループ
# % と MINUS SIGN を置換して、float型に変換
for i in df.columns:
df[i] = df[i].str.replace('%','').str.replace('−','-').astype(float)
print(df)
"""
0 1 2
0 -12.0 10.0 0.0
1 -8.0 -4.0 5.0
"""





