Как можно устранить «неподдерживаемые типы операндов» для -: 'str' и 'str' "следующим образом? - PullRequest
1 голос
/ 14 января 2020

Когда я запускаю следующий код,

def difference(dataset, interval=1):
    diff = list()
    for i in range(interval, len(dataset)):
        value = dataset[i] - dataset[i - interval]
        diff.append(value)
    return numpy.array(diff)

series = read_csv('Houston_weather.csv', header=None)
X = series.values
days_in_year = 365
differenced = difference(X, days_in_year)

Я получаю следующую ошибку, есть ли способ ее устранить? Я работаю над временными рядами погоды.

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-70-a0a67d687691> in <module>
      4 X = series.values
      5 days_in_year = 365
----> 6 differenced = difference(X, days_in_year)

<ipython-input-64-b7e841922d29> in difference(dataset, interval)
      3     diff = list()
      4     for i in range(interval, len(dataset)):
----> 5         value = dataset[i] - dataset[i - interval]
      6         diff.append(value)
      7     return numpy.array(diff)

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

Мой фрейм данных: enter image description here

Ответы [ 3 ]

2 голосов
/ 14 января 2020

Это просто говорит о том, что «вы пытаетесь использовать оператор - между 2 строками». Вы должны преобразовать их в число.

value = int(dataset[i]) - int(dataset[i - interval]) может помочь, если они являются целыми числами.

value = float(dataset[i]) - float(dataset[i - interval]) может помочь, если они являются числами с плавающей запятой.

Также документация pandas говорит, что лучше использовать to_numpy() вместо values.

Внимание! Рекомендуется использовать DataFrame.to_ numpy ().

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.values.html

0 голосов
/ 14 января 2020

Чтобы дать правильный ответ, мне нужно некоторое представление о том, на что похож ваш csv файл, или если вы предпочитаете переменные series или X.

Но я могу сделать некоторые разумные предположения - если только для образовательных целей.

Начните с простого файла с одним столбцом (так как вы называете выходную серию):

In [82]: data = pd.read_csv('stack59728678.csv', header=None)                                    
In [83]: data                                                                                    
Out[83]: 
   0
0  1
1  2
2  3
3  4
4  5
In [84]: X = data.values                                                                         
In [85]: X                                                                                       
Out[85]: 
array([[1],
       [2],
       [3],
       [4],
       [5]])
In [86]: X.shape                                                                                 
Out[86]: (5, 1)
In [87]: X[3]-X[1]                                                                               
Out[87]: array([2])

Так что, если данные csv являются цифрами c, массив данных будет иметь номер c, как и массив. Это вычитание работает нормально.

со столбцом метки

Позволяет развернуть файл, включив в него столбец метки:

a, 1
b, 2
c, 3
d, 4
e, 5

Теперь загрузка состоит из двух столбцов данных:

In [88]: data = pd.read_csv('stack59728678.csv', header=None)                                    
In [89]: data                                                                                    
Out[89]: 
   0  1
0  a  1
1  b  2
2  c  3
3  d  4
4  e  5
In [90]: X = data.values                                                                         
In [91]: X                                                                                       
Out[91]: 
array([['a', 1],
       ['b', 2],
       ['c', 3],
       ['d', 4],
       ['e', 5]], dtype=object)
In [92]: X.shape                                                                                 
Out[92]: (5, 2)
In [93]: X[3]-X[1]                                                                               
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-93-d04faaa95e8e> in <module>
----> 1 X[3]-X[1]

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

это ваше сообщение об ошибке. Он пытается вычесть строку 'b' из 'd'.

Другие ответы предлагали применить функцию int для преобразования строк в числа:

In [94]: int(X[3])-int(X[1])                                                                     
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-94-ec49f350c7b3> in <module>
----> 1 int(X[3])-int(X[1])

TypeError: only size-1 arrays can be converted to Python scalars

Но ряд X - это массив, который не работает как входные данные для функции int:

In [95]: X[3]                                                                                    
Out[95]: array(['d', 4], dtype=object)

Посмотрите на info или dtypes кадра данных:

In [98]: data.info()                                                                             
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 2 columns):
0    5 non-null object
1    5 non-null int64
dtypes: int64(1), object(1)
memory usage: 208.0+ bytes

Рабочее решение будет зависеть от данных. В этом примере мы могли бы извлечь столбцы с цифрами c:

In [100]: X=data[1].to_numpy()                                                                   
In [101]: X                                                                                      
Out[101]: array([1, 2, 3, 4, 5])

В других случаях может оказаться возможным преобразовать строки столбцов объекта в числа или типы 'date', которые реализуют вычитание.

с датами

Изменение файла для включения дат:

In [104]: data = pd.read_csv('stack59728678.csv', header=None)                                   
In [105]: data                                                                                   
Out[105]: 
            0  1
0  2009-01-01  1
1  2009-01-02  2
2  2009-01-03  3
3  2009-01-04  4
4  2009-01-05  5
In [106]: data.info()                                                                            
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 2 columns):
0    5 non-null object
1    5 non-null int64
dtypes: int64(1), object(1)
memory usage: 208.0+ bytes

У нас еще есть строки. Но мы изменим этот столбец:

In [107]: data[0].astype('datetime64[D]')                                                        
Out[107]: 
0   2009-01-01
1   2009-01-02
2   2009-01-03
3   2009-01-04
4   2009-01-05
Name: 0, dtype: datetime64[ns]
In [108]: data[0]=data[0].astype('datetime64[D]')                                                
In [109]: data.info()                                                                            
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 2 columns):
0    5 non-null datetime64[ns]
1    5 non-null int64
dtypes: datetime64[ns](1), int64(1)
memory usage: 208.0 bytes

X по-прежнему является объектом типа d, но в нем есть Timestep объекты вместо строк, и возможно вычитание:

In [110]: X=data.to_numpy()                                                                      
In [111]: X                                                                                      
Out[111]: 
array([[Timestamp('2009-01-01 00:00:00'), 1],
       [Timestamp('2009-01-02 00:00:00'), 2],
       [Timestamp('2009-01-03 00:00:00'), 3],
       [Timestamp('2009-01-04 00:00:00'), 4],
       [Timestamp('2009-01-05 00:00:00'), 5]], dtype=object)
In [112]: X[3]-X[1]                                                                              
Out[112]: array([Timedelta('2 days 00:00:00'), 2], dtype=object)
0 голосов
/ 14 января 2020

В этой строке есть ошибка:

----> 5 значение = набор данных [i] - набор данных [i - интервал]

Причина, по которой вы ошибка:

Ошибка типа: неподдерживаемый тип (ы) операндов для -: 'str' и 'str'

Вам нужно cast значения int (или любые другие типы чисел c, такие как long, float, double, и т. Д. c., Основанные на вашем наборе данных) для выполнения этого вычисления.

Вы можете привести значения от string до int, как это и перезапустите ваше приложение:

value = int(dataset[i]) - int(dataset[i - interval])

Надеюсь, это поможет.

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