Чтобы дать правильный ответ, мне нужно некоторое представление о том, на что похож ваш 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)