问题描述
计算结果list中结果有nan,请问如何删除nan并求list中实数值的均值?????
list长度事先不能确定。
可以转换数据类型为DataFrame等。
解决方案
在量化交易的数据处理中,经常会遇到计算结果列表中包含 nan(Not a Number)的情况。要删除 nan 并求剩余实数值的均值,有几种非常简便的方法。由于您提到可以转换数据类型,推荐使用 numpy 或 pandas,它们在处理这类问题时非常高效。
以下是三种常用的方法:
方法一:使用 numpy.nanmean(推荐,最简单高效)
numpy 提供了一个专门用于计算包含 nan 的数组均值的函数 nanmean,它会自动忽略 nan 值。
import numpy as np
# 假设这是您的列表
data_list = [1.0, 2.5, np.nan, 4.0, np.nan, 5.5]
# 直接使用 np.nanmean 求均值
mean_value = np.nanmean(data_list)
print("均值为:", mean_value)
方法二:转换为 pandas.Series
正如您所说,可以转换为 pandas 的数据结构。pandas.Series 的 mean() 方法默认会跳过 nan 值(skipna=True)。
import pandas as pd
import numpy as np
# 假设这是您的列表
data_list = [1.0, 2.5, np.nan, 4.0, np.nan, 5.5]
# 转换为 Series
s = pd.Series(data_list)
# 求均值,默认自动忽略 NaN
mean_value = s.mean()
# 如果您确实需要一个没有 NaN 的新列表,可以使用 dropna()
# clean_list = s.dropna().tolist()
print("均值为:", mean_value)
方法三:使用纯 Python 列表推导式过滤
如果您不想依赖外部库,可以使用 math.isnan 过滤掉 nan,然后再求均值。
import math
# 假设这是您的列表 (这里用 float('nan') 模拟)
data_list = [1.0, 2.5, float('nan'), 4.0, float('nan'), 5.5]
# 过滤掉 nan
clean_list = [x for x in data_list if not math.isnan(x)]
# 求均值
if len(clean_list) > 0:
mean_value = sum(clean_list) / len(clean_list)
else:
mean_value = float('nan') # 如果全都是 nan,避免除以 0 报错
print("过滤后的列表:", clean_list)
print("均值为:", mean_value)
总结
在 JoinQuant 等量化平台中,通常已经内置了 numpy 和 pandas。强烈推荐使用方法一(np.nanmean)或方法二(pd.Series.mean),因为它们不仅代码简洁,而且底层经过 C 语言优化,计算速度远快于纯 Python 的循环,特别是在列表长度较大时优势明显。