【发布时间】:2014-10-02 01:19:29
【问题描述】:
我想用 Python 计算两个 Pandas 系列之间的差异。不幸的是,返回了一个我无法理解的错误。我的代码的相关部分是:
import urllib.request
import pandas as pd
base_url = "http://ichart.finance.yahoo.com/table.csv?s="
def get_data(base_url,ticker):
url = base_url + ticker
source = urllib.request.urlopen(url)
return pd.read_csv(source,index_col=0,parse_dates=True,header=None)
ticker_list = {'INTC': 'Intel'}
for ticker in ticker_list:
prices = get_data(base_url,ticker)
prices.columns = 'Open','High','Low','Close','Volume','Adj Close'
closing_prices = prices['Close']
begin = closing_prices.ix[['2013-01-03']]
end = closing_prices.ix[['2013-12-27']]
difference = end.sub(begin)
Python 返回以下错误:
TypeError: unsupported operand type(s) for -: 'str' and 'str'
但是,type(begin) 和 type(end) 一样返回 pandas.core.series.Series。我使用了end.sub() 的方法,因为我认为我想遵守此处所述的说明:http://pandas.pydata.org/pandas-docs/dev/generated/pandas.Series.sub.html。为了解决我的问题,我(除其他外)遵循了以下建议:Subtract a column from one pandas dataframe from another 无济于事。
您知道错误隐藏在我的代码中的什么地方吗?特别是,为什么 Python 声明我尝试减去字符串?我很感激任何帮助!
更新:在@EdChum 的评论之后,我想发布一些数据:输入begin 给出:
`2013-01-03 21.32
Name: Close, dtype: object
closing_prices.head() 给出:
`0
Date Close
2014-08-07 32.68
2014-08-06 32.85
2014-08-05 32.82
2014-08-04 34.05
Name: Close, dtype: object`
【问题讨论】:
-
Series 中的值的数据类型是什么(
begin和end)?试试begin.dtype(或者直接打印系列) -
begin.dtype返回dtype('O') -
df.info()或df.dtypes -
你必须转换它们,不确定
convert_objects是否可以处理这个,否则你必须像df['col'] = df['col'].apply(lambda x: float(x[0]))这样的东西 -
您必须发布一些数据,这里的问题是您的数据不是整数、浮点数或日期时间,因此减法没有什么意义。我已经发布了各种将 dtype 转换为 datetime 或 floats 的方法,因此您应该能够解决此问题。目前我很难重现您的错误,您需要打印一些数据并查看 dtypes 并修复它们