scipy.interpolate.make_interp_spline выдает ошибку «x и y несовместимы» - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь создать плавный график распределения частот. Код работает для определенного набора данных, но выдает следующее сообщение об ошибке для другого набора данных:

spl1 = make_interp_spline(bins1, data1['Frequency'].values)

File "/<path_to_anaconda3>/envs/mlpy37/lib/python3.7/site-packages/scipy/interpolate/_bsplines.py", line 805, in make_interp_spline
    raise ValueError('x and y are incompatible.')
ValueError: x and y are incompatible.

Вот код с набором данных, который работает нормально:

import math
import numpy as np
import pandas as pd
import statistics
from scipy.stats import skew
from matplotlib import pyplot as plt
from scipy.interpolate import make_interp_spline

raw_data1 = [212, 869, 220, 654, 11, 624, 420, 121, 428, 865, 799, 405, 230, 670, 870, 366, 99, 55, 489, 312, 493, 163, 221, 84, 144, 48, 375, 86, 168, 100]
min_value1 = min(raw_data1)
max_value1 = max(raw_data1)
step1 = math.ceil((max_value1 - min_value1) / 10)
bin_edges1 = [i for i in range(min_value1 - 1, max_value1 + 1, step1)]
bins1 = [i for i in range(min_value1, max_value1 + 1, step1)]
if max(bin_edges1) < max_value1:
    bin_edges1.append(max(bin_edges1) + step1)
    bins1.append(max(bins1) + step1)
data1 = pd.DataFrame({'Frequency': pd.cut(raw_data1, bin_edges1).value_counts()})
x1 = np.linspace(min(bins1), max(bins1), 250)
spl1 = make_interp_spline(bins1, data1['Frequency'].values)
smooth_curve1 = spl1(x1)

print(data1)
mean1 = statistics.mean(raw_data1)
median1 = statistics.median(raw_data1)
print('Mean: {:.2f}'.format(mean1))
print('Median: {:.2f}'.format(median1))
try:
    print('Mode: {:.2f}'.format(statistics.mode(raw_data1)))
except Exception as e:
    print(e)
skewness1 = skew(raw_data1)
if mean1 > median1:
    print('Positive Skewness: ' + str(skewness1))
elif mean1 < median1:
    print('Negative Skewness: ' + str(skewness1))
else:
    print('No skewness: ' + str(skewness1))

plt.figure()

plt.subplot(111)
plt.plot(x1, smooth_curve1)
plt.title('Numerical Variables Exercise Skewness')
plt.xlabel('Data')
plt.ylabel('Frequency')

plt.show()

Если заменить приведенный выше код со следующим набором данных, он не работает:

raw_data1 = [586, 760, 495, 678, 559, 415, 370, 659, 119, 288, 241, 787, 522, 207, 160, 526, 656, 848, 720, 676, 581, 929, 653, 661, 770, 800, 529, 975, 995, 947]

И полное сообщение об ошибке, которое я получаю, это:

Traceback (most recent call last):
  File "/<path_to_file>/NumericalVariablesExercise_Skewness.py", line 20, in <module>
    spl1 = make_interp_spline(bins1, data1['Frequency'].values)
  File "/<path_to_anaconda3>/envs/mlpy37/lib/python3.7/site-packages/scipy/interpolate/_bsplines.py", line 805, in make_interp_spline
    raise ValueError('x and y are incompatible.')
ValueError: x and y are incompatible.

Может кто-нибудь, пожалуйста, помогите в идентификации ошибка в моем коде или логи c?

1 Ответ

1 голос
/ 05 февраля 2020

Комментирование строки фактически решает проблему (или, по крайней мере, она запускается, я не могу проверить вывод). Сообщение об ошибке полезно: x и y должны иметь одинаковую длину.

if max(bin_edges1) < max_value1:
    bin_edges1.append(max(bin_edges1) + step1)
    # bins1.append(max(bins1) + step1) <-- this one

Кроме того, ваш код сложен для понимания, потому что вы перепутали свои инструменты. Вы определяете raw_data1 как python списки и bins1 также с пониманием списка.

raw_data1 = [212, 869, 220, 654, 11, 624, 420, 121, 428, 865, 799, 405, 230, 670, 870, 366, 99, 55, 489, 312, 493, 163, 221, 84, 144, 48, 375, 86, 168, 100]
..
bins1 = [i for i in range(min_value1, max_value1 + 1, step1)]

Затем вы используете numpy .linspace для x1.

x1 = np.linspace(min(bins1), max(bins1), 250)

, а также включает pandas:

data1 = pd.DataFrame({'Frequency': pd.cut(raw_data1, bin_edges1).value_counts()})

Я бы рекомендовал в основном использовать один, и использовать другие инструменты только тогда, когда это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...