所以我是python和数据分析的新手,但我们的任务是创建一个散点图。我正在使用的数据集包含许多包含None值的元素。当我使用polyfit方法创建趋势线(最佳拟合线)时,我会得到Nones的错误。我已经尝试使用列表和numpy数组与令人沮丧的结果。我也尝试过masked_array,masked_invalid等。在MULTIPLE配置中,但它一直给我一个充满Nones的数组。有没有办法以这样的方式创建趋势线,我不需要删除具有None值的元素?我需要他们来保持我的情节尺寸正确。我正在使用Python 2.7。这是我到目前为止所得到的:
import matplotlib.pyplot as plt
import numpy as np
import numpy.ma as ma
import pylab
#The InterpolatedUnivariateSpline method popped up during my endeavor
#to extrapolate the trendline through the gaps in data.
#To be honest, I don't think its doing anything for me...
from scipy.interpolate import InterpolatedUnivariateSpline
fig, ax = plt.subplots(1,1)
ax.scatter(y, dbm, color = 'purple', marker = 'o', s = 100)
plt.xlim(min(y), max(y))
plt.xlabel('Temp - C')
dbm_array = np.asarray(dbm) #dbm and y are lists earlier in the program
y_array = np.asarray(y)
x = np.linspace(min(y), max(y), len(y))
order = 1
s = InterpolatedUnivariateSpline(y, dbm, k=order)
blah = s(x)
plt.plot(y, blah, '--k')
由于某些原因,这给了我没有趋势线的散点图。没有错误,所以我想我得到了... 非常感谢你!
答案 0 :(得分:0)
首先,如果你有数组,那么它们中应该没有None
,只有nan
s。这是因为None
是一个不能表示为数字的对象。所以,第一个问题可能在这里。我们来看看:
import numpy as np
a = np.array([None, 1, 2, 3, 4, None])
我们得到了什么?
>>> a
array([None, 1, 2, 3, 4, None], dtype=object)
这肯定是我们没有做到的。它是一个对象数组,大多数时候它不是很有用。你不能对那个进行任何计算:
>>> 2*a
unsupported operand type(s) for *: 'int' and 'NoneType'
这是因为逐元素乘法试图乘以2*None
。
所以,你真正想要的是:
>>> a = np.array([np.nan, 1, 2, 3, 4, np.nan])
>>> a
array([ nan, 1., 2., 3., 4., nan])
>>> a.dtype
dtype('float64')
>>> 2 * a
array([ nan, 2., 4., 6., 8., nan])
现在一切都按预期工作了。
因此,首先要检查输入数组是否具有正确的形式。如果您在曲线拟合方面遇到问题,可以创建一个没有令人讨厌的nan
的数组:
import numpy as np
a = np.array([[0,np.nan], [1, 1], [2, 1.5], [3.2, np.nan], [4, 5]])
b = a[-np.isnan(a[:,1])]
让我们看看a
和b
的内容:
>>> a
array([[ 0. , nan],
[ 1. , 1. ],
[ 2. , 1.5],
[ 3.2, nan],
[ 4. , 5. ]])
>>> b
array([[ 1. , 1. ],
[ 2. , 1.5],
[ 4. , 5. ]])
这就是你想要的。该曲线符合b
,没有任何nan
s,它们有习惯迁移并计算结果nan
。 (这是设计的。)
这是如何工作的呢? np.isnan(a[:,1])
在每个位置都返回一个True
的布尔数组,nan
的第1列为a
,每个有效数字为False
。由于这与我们想要的完全相反,我们将通过在前面添加减号来否定它。然后索引只选择有数字的行。
如果您将X数据和Y数据放在两个不同的1-D向量中,请执行以下操作:
# original y data: Y
# original x data: X
# both have the same length
# calculate a mask to be used (a boolean vector)
msk = -np.isnan(Y)
# use the mask to plot both X and Y only at the points where Y is not NaN
plot(X[msk], Y[msk])
在某些情况下,您可能根本没有X数据,但是您希望对这些点进行编号,例如: 0开始(如果您只给它一个向量,则为matplotlib
)。有几种可能性,但这是一个:
msk = -np.isnan(Y)
X = np.arange(len(Y))
plot(X[msk], Y[msk])