Ошибка типа с Python: str и int

1

Я получил эту ошибку при попытке скомпилировать мой код. Я извлек данные из файла xlsx и создал фрейм данных, заменил нулевые значения на 0, преобразовал все значения в sting, чтобы иметь возможность рассеивать диаграмму, и когда я попытался показать результаты своей линейной регрессии, я получил эту ошибку.

 TypeError: unsupported operand type(s) for /: 'str' and 'int'

и это код, который я сделал до сих пор

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def predict(x):
return slope * x + intercept
from scipy import stats
xlsxfile = pd.ExcelFile("C:\\Users\\AchourAh\\Desktop\\PL14_IPC_03_09_2018_SP_Level.xlsx") 
data = xlsxfile.parse('Sheet1', index_col = None, header = None) 
data1 = data.fillna(0) #Replace null values of the whole dataset with 0
data1 = data1.astype(str)
print(data1)
X = data1.iloc[0:len(data1),1] 
print(X)
Y = data1.iloc[0:len(data1),2] 
print(Y)
axes = plt.axes()
axes.grid() 
plt.scatter(X,Y)     
slope, intercept, r_value, p_value, std_err = stats.linregress(X, Y)

Чтобы заметить, что я начинаю с этим. Последняя строка вызывает ошибку. Это первые столбцы COP COR и PAUS для данных, которые я пытаюсь применить к линейной регрессии:

 0            PP   SP000045856 COP COR  SP000045856 PAUS   
 1          201723                    0              2000   
 2          201724                12560             40060   
 3          201725               -17760             15040   
 4          201726                -5840             16960   
 5          201727                10600             4480   
 6          201728                    0             14700   
 7          201729                 4760             46820  

... до строки 27

  • 0
    Здравствуйте, добро пожаловать в ТАК. Зачем converted all the values to string to be able to scatterplot ?? Почему вы думаете, что вам нужны строки, чтобы создать точечный график? Однако - stats.linregress нуждается в массиве (-ах) чисел, потому что он вычисляет линейную регрессию, например, некоторых измеренных, например, шумных данных, по некоторой независимой переменной, например, по времени или как угодно ... Возможно, вы кратко изучите документацию эта функция: docs.scipy.org/doc/scipy/reference/generated/…
  • 0
    И просто для полноты - моя рекомендация такова: просто не приводите свои данные в строку для того, чего вы хотите достичь. Тот факт, что scatter работает и не выдает ошибку с двумя строковыми массивами в качестве аргументов, не обязательно означает, что результат полезен или значим для вас.
Показать ещё 9 комментариев
Теги:
statistics
linear-regression
scatter-plot

1 ответ

1
Лучший ответ

Данные в вашем файле Excel содержат информацию заголовка в первой строке, поэтому настройка header=None - причина, по которой в ваших данных есть строковые значения вместо того, чтобы помещать их в имена столбцов.
Если вы удалите заголовок kwarg

xlsxfile = pd.ExcelFile("C:\\Users\\AchourAh\\Desktop\\PL14_IPC_03_09_2018_SP_Level.xlsx") 
data = xlsxfile.parse('Sheet1', index_col = None)

все должно работать, и вы должны получить такую структуру данных:

data

   0      PP  SP000045856 COP COR  SP000045856 PAUS
0  1  201723                    0              2000
1  2  201724                12560             40060
2  3  201725               -17760             15040
3  4  201726                -5840             16960
4  5  201727                10600              4480
5  6  201728                    0             14700
6  7  201729                 4760             46820

Тем не менее, вы можете сделать то же самое даже немного короче, напрямую используя read_excel -function из pandas:

data = pd.read_excel('C:\\Users\\AchourAh\\Desktop\\PL14_IPC_03_09_2018_SP_Level.xlsx', 'Sheet1')

Затем ваш график рассеяния можно сделать, например, как

data.plot('SP000045856 COP COR', 'SP000045856 PAUS', 'scatter')

или, возможно, более читаемые, но идентичные:

data.plot.scatter('SP000045856 COP COR', 'SP000045856 PAUS')

И линейная регрессия может быть выполнена как

slope, intercept, r_value, p_value, std_err = stats.linregress(data['SP000045856 COP COR'], data['SP000045856 PAUS'])

Ещё вопросы

Сообщество Overcoder
Наверх
Меню