【发布时间】:2020-06-04 21:41:54
【问题描述】:
我的问题与pandas df.corr() returns NaN despite data fed having populated data 非常相似,但其中给出的解决方案对我不起作用,因为我的数据dtypes: float64(2) 和describe() 返回non-null float64。
我正在使用 pandas:0.19.0 和 python 2.7
我有两个数据框,其中有一列名为WindSp_mean 的非空浮点数据。我通过循环访问主数据集中的一组指定日期来创建这两个日期帧,以根据另一列中的唯一标识符为每个时间步创建 df_turbine0 和 df_turbine1。
对于每个时间步,我想计算两个数据帧中 WindSp_mean 列之间的 pearson 相关系数。一些数据帧可能包含 nans,所以我想使用 df.corr() 来查找它们的 WindSp_meancolumns 而不是 np.corrcoef() 之间的 pearson 相关性
通过将第一个 df 中的 WindSp_mean 与其自身进行比较来测试 df.corr(),得到预期答案 1。
pcorr1 = df_turbine0['WindSp_mean'].corr(df_turbine0['WindSp_mean'])
在两个数据框的同一列中尝试此操作
pcorr2 = df_turbine0['WindSp_mean'].corr(df_turbine1['WindSp_mean'])
尽管两列中有 144 个非空浮点数,但仍返回 nan。
如果我使用具有相同值的np.corrcoef()。`
turbine0_windspeed = df_turbine0['WindSp_mean']
turbine1_windspeed = df_turbine1['WindSp_mean']
pcorr1 = np.corrcoef(turbine1_windspeed, turbine0_windspeed)
我的循环中所有时间步长的值都接近 1,直到一些 nan 用 ValueError: all the input array dimensions except for the concatenation axis must match exactly 破坏代码。
df_turbine1、df_turbine0 的示例数据
datetime WindSp_max WindSp_mean
218705 28/12/2017 18:40 15.4 10.39798
218706 28/12/2017 18:50 14.1 10.49598
218707 28/12/2017 19:00 13.01 9.025653
218708 28/12/2017 19:10 13.68 9.276702
218709 28/12/2017 19:20 14.02 9.125614
218710 28/12/2017 19:30 12.51 8.900918
218711 28/12/2017 19:40 12.76 9.177135
218712 28/12/2017 19:50 12.84 9.082051
218713 28/12/2017 20:00 12.17 8.60314
datetime WindSp_max WindSp_mean
109120 28/12/2017 18:40 13.93 11.08517
109121 28/12/2017 18:50 13.77 10.16184
109122 28/12/2017 19:00 12.93 10.20069
109123 28/12/2017 19:10 14.19 10.64296
109124 28/12/2017 19:20 13.93 10.50484
109125 28/12/2017 19:30 13.77 10.60769
109126 28/12/2017 19:40 14.02 10.81324
109127 28/12/2017 19:50 14.35 10.45523
109128 28/12/2017 20:00 13.68 10.32253
对于这个时间步,print df_turbine0.isnull().sum() 在df_turbine0 或df_turbine1 中都不返回任何 nan 值。每个df 包含144 个非空值,df_pcorr1 是288 行。每当第 1 列中有值时,第 2 列中就有 nan,反之亦然
我假设因为 df_turbine0 和 df_turbine1 是同一数据集的子集,它们携带来自原始 df 的索引,这可能会导致错误。
但是,将索引更改为日期时间或将其重置对pcorr1() 的计算或索引没有任何影响。
df_turbine0.set_index(['datetime'])
df_turbine0.reset_index()
【问题讨论】:
-
我不确定我是否遵循。您运行
df_pcorr1 = pd.concat([turbine1_windspeed, turbine0_windspeed], axis=1),它连接两个数据帧(或系列),在您的情况下可能都是长度为 1。你为什么把它比作对np.corrcoeff的调用?连接数据帧与计算相关系数不同。我错过了什么? -
非常好!您错过了它,因为我没有包含所有代码。现在编辑以包括我与
np.corrcoeff()、pcorr1 = df_pcorr1.corr()比较的行 -
您的串联数据框是什么样的?例如,
df_pcorr1和朋友?这些应该足够短,以便在您的问题中完整列出。 -
(旁白:你的代码可能会更短,因为你实际上已经复制粘贴了四次相同的代码,而不是使用适当的循环。我提到它,因为它也会提出问题更清晰,也就是说,不会因大量重复代码而变得模糊。或者,只需从示例代码中删除 2 个涡轮机,以便您的左侧至少有一个好的(没有 NaN)和一组坏的连接数据帧。从技术上讲,我们没有甚至不需要
turbine5= turbine_list[5]; df_turbine5 = df_24hour[df_24hour['StationName'].str.contains(turbine5)]和朋友,只需df_turbine5的值。)
标签: python python-2.7 numpy dataframe correlation