如何在python中创建缺少数据的趋势线?

如何在python中创建缺少数据的趋势线?,python,trendline,Python,Trendline,所以我对python和数据分析还不熟悉,但我的任务是创建散点图。我正在使用的数据集有许多元素不包含任何值。当我使用polyfit方法创建趋势线(最佳拟合线)时,我会得到非趋势线的错误。我尝试过使用列表和numpy数组,但结果很糟糕。我也尝试过掩蔽数组,掩蔽无效,等等。在多个配置中,但它一直给我一个数组,里面充满了Nones。有没有一种方法可以创建趋势线,这样我就不需要删除没有值的元素?我需要他们保持我的绘图尺寸正确。我正在使用Python 2.7。到目前为止,我得到的是: import matp

所以我对python和数据分析还不熟悉,但我的任务是创建散点图。我正在使用的数据集有许多元素不包含任何值。当我使用polyfit方法创建趋势线(最佳拟合线)时,我会得到非趋势线的错误。我尝试过使用列表和numpy数组,但结果很糟糕。我也尝试过掩蔽数组,掩蔽无效,等等。在多个配置中,但它一直给我一个数组,里面充满了Nones。有没有一种方法可以创建趋势线,这样我就不需要删除没有值的元素?我需要他们保持我的绘图尺寸正确。我正在使用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')  
由于某种原因,这给了我没有趋势线的散点图。没有错误,所以我想我已经准备好了。。。。
提前非常感谢

首先,如果你有数组,数组中应该没有
None
s,只有
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
s:

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
s。(这是设计的。)

那么这是怎么回事?
np.isnan(a[:,1])
返回一个布尔数组,每个位置都有
True
,在
a
的第1列中有
nan
,对于每个有效数字都有
False
。因为这与我们想要的正好相反,我们将通过在前面加减号来否定它。然后索引只选取有数字的行


如果X数据和Y数据位于两个不同的一维向量中,请执行以下操作:

# 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]) 

“blah”是一个只包含nans的数组。好的,我已经将包含Nones的列表更改为包含nans的数组。“isnan”函数中是否需要逗号?当我用逗号运行它时,我得到一个错误,说索引太多了。当我运行它时,我得到一个长度为零的空数组。我通过删除“[:,1]”使“isnan”方法可以工作。“b”的长度现在是287,但图形的x维是1440。有什么方法可以协调维度上的差异吗?@user3775711:请参阅编辑,了解一维向量的情况。