質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

860閲覧

Pandas DataFrameで特定のカラムの標準偏差を求めるとinfになってしまう。

Omihiro

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/05/04 14:52

実現したいこと

標本標準偏差をstd()を用いて値を求めたい。

前提

とあるDataFrame型に対して、インデックス参照で特定カラムの最大値や最小値、平均や中央値は普通に求まりましたが、標準偏差を求めようとした際にinfと表示されました。
エラーではないのですが、なぜinfになるのかと思い質問させて頂きました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

python

1import numpy as np 2import pandas as pd 3 4df = pd.read_pickle("./data/health.pickle") 5print(df.head()) 6 7#max()メソッドを使ってあるカラムの最大値を求める。 8print(df["摂取カロリー"].max()) #2500.0 9 10#min()メソッドを使ってあるカラムの最大値を求める。 11print(df["摂取カロリー"].min())  #1800.0 12 13print(df["摂取カロリー"].mode()) # 0 2300.0 dtype: float16 14 15print(df["摂取カロリー"].mean()) #2027.0 16 17print(df["摂取カロリー"].median()) #1945.0 18 19print(df["摂取カロリー"].std()) #inf 20df.dtypes

出力結果

date 歩数 摂取カロリー 歩数/カロリー 運動指数

2022-04-01 5439 2500.0 2.175600 Low
2022-04-02 2510 2300.0 1.091304 Low
2022-04-03 10238 1950.0 5.250256 Mid
2022-04-04 8209 1850.0 4.437297 Mid
2022-04-05 9434 1930.0 4.888083 Mid
2500.0(最大値)
1800.0(最小値)
0 2300.0 (最頻値)
dtype: float16
2027.0 (平均値)
1945.0 (中央値)
inf (標準偏差 : 何故か無限大になっている)
歩数 int64
摂取カロリー float16
歩数/カロリー float64
運動指数 object
dtype: object

試したこと

pd.Series([2500,2300,1950,1850,1930,1800,1940,2300]).std()
⇒257.15128954427917

元のDataFrameのデータを何度見返しても全て1800~2500の範囲に収まっています。

補足情報(FW/ツールのバージョンなど)

大元のデータ(見辛くてすみません)
歩数  摂取カロリー 歩数/カロリー 運動指数
date
2022-04-01 5439 2500.0 2.175600 Low
2022-04-02 2510 2300.0 1.091304 Low
2022-04-03 10238 1950.0 5.250256 Mid
2022-04-04 8209 1850.0 4.437297 Mid
2022-04-05 9434 1930.0 4.888083 Mid
2022-04-06 7593 1800.0 4.218333 Mid
2022-04-07 9320 1940.0 4.804124 Mid
2022-04-08 4873 2300.0 2.118696 Low
2022-04-09 12045 1950.0 6.176923 High
2022-04-10 7493 1850.0 4.050270 Mid
2022-04-11 7289 1930.0 3.776684 Mid
2022-04-12 6481 2300.0 2.817826 Low
2022-04-13 10287 1800.0 5.715000 Mid
2022-04-14 8043 1940.0 4.145876 Mid
2022-04-15 7435 2300.0 3.232609 Mid
2022-04-16 7529 2300.0 3.273478 Mid
2022-04-17 8031 1940.0 4.139691 Mid
2022-04-18 8475 2300.0 3.684783 Mid
2022-04-19 8132 1950.0 4.170256 Mid
2022-04-20 15328 1800.0 8.515556 High
2022-04-21 12849 1940.0 6.623196 High
2022-04-22 4029 2300.0 1.751739 Low
2022-04-23 3890 1950.0 1.994872 Low
2022-04-24 8093 1850.0 4.374595 Mid
2022-04-25 7823 1950.0 4.011795 Mid
2022-04-26 7492 1850.0 4.049730 Mid
2022-04-27 7203 1930.0 3.732124 Mid
2022-04-28 7302 1850.0 3.947027 Mid
2022-04-29 6033 2300.0 2.623043 Low
2022-04-30 4093 1950.0 2.098974 Low

python3.8.8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2023/05/04 16:16 編集

手元の環境は Pandas 2.0.1, Numpy 1.24.3 なのですが、DataFrame にして std() を実行すると正しい値が返ります。(精度は低いですが) >>> df["摂取カロリー"].dtype dtype('float16') >>> df["摂取カロリー"].std() # pandas.Series.std() inf >>> df[["摂取カロリー"]].std() # pandas.DataFrame.std() 摂取カロリー 205.5 dtype: float16
guest

回答1

0

ベストアンサー

特定のカラムの標準偏差を求めるとinfになってしまう

摂取カロリー float16

型が原因かもしれません。他の型(float32など)に変更してみてはどうでしょうか?

Python: Pandas で np.float16 はサポートされていない

投稿2023/05/04 15:19

編集2023/05/04 15:19
meg_

総合スコア10580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Omihiro

2023/05/04 16:14

回答ありがとうございます! 早速試してみたところ、上手く数値が返されました! df["摂取カロリー"] = df["摂取カロリー"].astype(np.float32) df["摂取カロリー"].std()⇒205.54943 float16のメリットとしては、 ”メモリを節約するために、高い精度が必要ないカラムには指定したくなる場面もあるだろうから。” とあるように、メリットはあるみたいですが、 ”プラットフォームによっては float16 を利用できないため対応が難しいらしい” というサポートされていない理由(背景)も分かり勉強になりました。 改めて有難うございます!
otn

2023/05/04 19:05

仮にサポートされていても、有効数値3桁では今回の計算だとすごく丸まった結果になってしまいますね。 丸め誤差が重なるとすごく離れた結果になったかも。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問