计算返回时操作数类型错误
Posted
技术标签:
【中文标题】计算返回时操作数类型错误【英文标题】:Operand type error while computing returns 【发布时间】:2021-09-09 19:21:00 【问题描述】:TypeError: unsupported operand type(s) for /: 'str' and 'str'
所以这段代码是在我的金融课上编写的,基本上是在给定宏观经济条件的情况下导入金融股票数据。问题在于变量“macro_etf_df_mom”,由于某种原因,返回的计算不起作用。我明白问题一定出在这行代码里
macro_etf_df_mom = macro_etf_df[macro_etf_df.columns[~macro_etf_df.columns.isin(['Date'])]].pct_change()
但即使我环顾四周,我也无法修复它。如果有人能够帮助我,将不胜感激!
谢谢!
#ETF_data = ETF_data.filter(like='Close',axis=1).iloc[:,n:2*n]
ETF_data = ETF_data.dropna()
ETF_data = ETF_data.reset_index() # convert index to column (date)
#ETF_data = ETF_data.rename(columns='Date':'date')
# manipulating column names from multiIndex to normal
#ETF_data.columns = ['_'.join(x) for x in ETF_data.columns]
#ETF_data.columns = ETF_data.columns.str.lstrip('Close_')
#ETF_data = ETF_data.rename(columns='date_':'date')
#ETF_data['date'] = ETF_data['date'].dt.strftime('%Y-%m-%d')
ETF_data['Date'] = pd.to_datetime(ETF_data['Date'])
ETF_data['Date'] = ETF_data['Date'].dt.strftime('%Y-%m-%d')
print('Tickers in us:')
print(tickers)
# load macro factors data
import os
os.chdir('/Users//Downloads/IPM Final Project')
macro_factors = pd.read_csv("macro_ip_int2y.csv")
macro_factors = macro_factors.dropna()
n_macro_factors = len(macro_factors.columns)-1 # because 1st column is date
n_dates = len(macro_factors)
# deleting rows and columns that got unintentionally loaded
#macro_factors = macro_factors.iloc[0:(n_dates+1),0:(n_macro_factors+1)]
print(macro_factors.columns)
macro_factors['Date'] = pd.to_datetime(macro_factors['Date'], format='%d/%m/%Y')
macro_factors['Date'] = macro_factors['Date'].dt.strftime('%Y-%m-%d')
macro_factors['Date'] = macro_factors['Date'].values.astype('datetime64[M]') # need to floor the dates on this file in order to marge it with the ETF file
macro_factors['Date'] = macro_factors['Date'].dt.strftime('%Y-%m-%d')
# merging the two data frames
macro_etf_df = pd.merge(ETF_data, macro_factors, on = 'Date')
macro_etf_df = macro_etf_df.set_index('Date')
# Computing returns!!
macro_etf_df_mom = macro_etf_df[macro_etf_df.columns[~macro_etf_df.columns.isin(['Date'])]].pct_change()
macro_etf_df_mom = macro_etf_df_mom.add_suffix('_mom')
# joining the DF with the MoM rates to the original DF
macro_etf_df = macro_etf_df.join(macro_etf_df_mom)
#macro_etf_df = macro_etf_df.dropna()
###########################################################################################################
# Macro-Cycle investing or Factor Timing
# The idea is to estimate which factors out(under)perform in which stages of the macro-cycle and position your portfolio accordingly
# lets calculate some stuff up to Dec 2018 and test it in 2019-2021
# 1. we want to know when IP is above (below) average
## example for gdp
# mgdp['current-level-avg'] = mgdp[:(len(mgdp)-24)].mean()
macro_etf_df['m_gdp_av'] = macro_etf_df.m_gdp[:(len(macro_etf_df)-24)].mean()
macro_etf_df['us_2y_av'] = macro_etf_df.us_2y[:(len(macro_etf_df)-24)].mean()
# 2. Create an indicator for the 4 possible states ip > av & us_2y > av, ip < av & us_2y > av, etc...
【问题讨论】:
看起来你要求 pct_change 日期(作为字符串)因此错误。假设这是您想要做的,您应该将日期转换为数字值,例如时间戳,如果您想对它们执行数字运算。如果您将 Date 列保留为 datetime 类型,pandas 可能会足够聪明地执行此操作(我不确定),但是一旦您使用 strftime 将它们转换为字符串,pandas 就不再知道该列代表日期。跨度> 感谢您的回答!所以你建议我应该删除strftime?我只是有点困惑,因为这段代码的骨架来自我的教授,他设法像这样运行代码(代码比我复制的要多,他部分而不是整体运行(不确定如果这有所作为))。并且数值运算应该在其他值而不是日期列上(因此我很惊讶他能够像这样运行它)。亲切的问候,瓦西里 如果这是您和您的教授之间传递的研究代码(并且不使用版本控制),那么您可能没有运行完全相同的代码:) 我对其进行了调整——输入我的数字、更改目录和调整变量。唯一的区别应该是所选的 ETF 和宏观经济条件。在您发表评论后,我刚刚尝试将变量“日期”更改为数字变量(SP500 的收盘价),但仍然收到相同的错误。我是编码新手,所以任何指针都将不胜感激如何解决这个问题!:) 尝试使用您的数据框的简化实例(例如,仅包含日期列的实例),看看您是否可以提出Minimal Reproducible Example。如果你删掉所有不相关的代码,只关注手头的一个问题,它可能会让你更清楚。 【参考方案1】:您可以使用检查数据帧数据类型
print(macro_etf_df.dtypes)
并确保您对数字使用数学,而不是字符串。如果您看到您的数据框具有“对象”类型,请尝试将该列转换为整数。请参阅下面的玩具代码,它以所有值作为字符串开头,因此数学失败,然后将列转换为整数,因此数学有效。
row1list = ['100', '2020/03/01']
row2list = ['200', '2020/03/01']
row3list = ['110', '2020/03/02']
df = pd.DataFrame([row1list, row2list, row3list],
columns=['number', 'date'])
# fail = df['number'].pct_change()
# TypeError: unsupported operand type(s) for /: 'str' and 'float'
print(df.dtypes)
# number object
# date object
# dtype: object
df['number'] = df['number'].astype(int)
print(df.dtypes)
# number int64
# date object
# dtype: object
works = df['number'].pct_change()
print(works)
# 0 NaN
# 1 1.00
# 2 -0.45
【讨论】:
以上是关于计算返回时操作数类型错误的主要内容,如果未能解决你的问题,请参考以下文章
Java错误:HashMap中二进制运算符的错误操作数类型[重复]