Pandas df.corr () возвращает nan, когда np.corrcoef () возвращает значения, если только NaN в наборе данных - PullRequest
0 голосов
/ 20 февраля 2020

Мой вопрос очень похож на pandas df.corr () возвращает NaN, несмотря на то, что данные загружаются с заполненными данными , но приведенные в нем решения не работают для меня как мои данные dtypes: float64(2) и describe() возвращает non-null float64.

Я использую pandas: 0,19,0 с python 2,7

У меня есть два кадра данных со столбцом ненулевых данных с плавающей точкой, называемым WindSp_mean. Я создаю эти два периода времени, просматривая набор указанных дат в основном наборе данных, чтобы создать df_turbine0 и df_turbine1 для каждого временного шага на основе уникального идентификатора в другом столбце.

для каждого временного шага I хотите вычислить коэффициент корреляции Пирсона между столбцом WindSp_mean в двух информационных кадрах. Некоторые кадры данных могут содержать nans, поэтому я хочу использовать df.corr(), чтобы найти корреляцию Пирсона между их WindSp_mean столбцами, а не np.corrcoef()

, проверяя df.corr(), сравнивая WindSp_mean в первом df с Сам дает ожидаемый ответ 1.

pcorr1 = df_turbine0['WindSp_mean'].corr(df_turbine0['WindSp_mean'])

, пробуя это с тем же столбцом, оба кадра данных

pcorr2 = df_turbine0['WindSp_mean'].corr(df_turbine1['WindSp_mean'])

возвращает nan, несмотря на там 144 непустых числа с плавающей точкой в ​​обоих столбцах.

, если я использую np.corrcoef() с теми же самыми используемыми значениями.

turbine0_windspeed = df_turbine0['WindSp_mean']
turbine1_windspeed = df_turbine1['WindSp_mean']
pcorr1 = np.corrcoef(turbine1_windspeed, turbine0_windspeed)

Я получаю результаты со значениями, близкими к 1 для всех временных шагов в моем l oop, пока некоторые наны не разбивают код с помощью ValueError: all the input array dimensions except for the concatenation axis must match exactly.

enter image description here

Пример данных для 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() не возвращает значений nan в df_turbine0 или df_turbine1. Каждый df содержит 144 ненулевых значения, а df_pcorr1 составляет 288 строк. Если в столбце 1 есть значение, в столбце 2 указывается значение nan, и наоборот

Я предполагаю, что поскольку df_turbine0 и df_turbine1 являются подмножеством одного и того же набора данных, они содержат индексирование из исходный df, который может вызывать ошибки.

Однако изменение индекса на datetime или сброс его не имеет никакого значения для вычисления pcorr1() или индекса.

df_turbine0.set_index(['datetime'])

df_turbine0.reset_index()

1 Ответ

0 голосов
/ 06 марта 2020

Это была ошибка индексации. Все меньшие df_turbine были взяты из того же исходного Dataframe, и индекс был сохранен. Это было исправлено путем сброса индекса с помощью inplace =True

df_turbine1.reset_index(drop = True, inplace=True)

...