我有下面的df和更多的日期。
df = {'Date': ('10/6/2015', '10/7/2015'),
'CAD 12M PR': (-7.4, -4.9),
'AUD 12M PR': (-2.3, -1.6),
'NOK 12M PR': (2.6, 8.6),
'SEK 12M PR': (6.7, 8.6),
'NZD 12M PR': (3.1, 2.9),
'EUR 12M PR': (2.7, 4.7),
'GBP 12M PR': (-3.6, -2.5),
'JPY 12M PR': (13.8, 15.7),
'CAD 1Y ZS': (3.1, 2.5),
'AUD 1Y ZS': (-1.7, -3.0),
'NOK 1Y ZS': (2.0, 1.8),
'SEK 1Y ZS': (2.6, 2.6),
'NZD 1Y ZS': (-4.5, -5.6),
'EUR 1Y ZS': (-3.8, -3.7),
'GBP 1Y ZS': (-1.6, -2.7),
'JPY 1Y ZS': (3.0, 2.1)
}在df中有8种货币(加元、澳元、挪威克朗、瑞典克朗、新西兰元、欧元、英镑、日元)和2个不同的数据点: 12M PR (12个月价格回报)和1Y ZS (1年z得分)。我想创建一个新的投资组合(列表)与前2个买入/卖出从这个df。对于第一类,我想将1200万公关从大到小进行排名,并将排名前4的货币按1200万公关放在“买入桶”中,将排名垫底的4种货币放在“卖出桶”中。第二种排序基于1Y ZS。对于买入,我想要具有最高1Y ZS的2种货币(来自排名前4位的12M公关桶),而对于卖出,我想要具有最低1Y ZS的2种货币(来自底部4位排名12M的公关桶)。
2015年10月6日,公关排名前4位的货币是日元、瑞典克朗、新西兰元和欧元。从这一点来看,日元和瑞典克朗的1YZS最高,所以他们应该是买入的。排名垫底的4种货币分别是加元、英镑、澳元和挪威克朗。从这一点来看,澳元和英镑的1YZS最低,所以他们是卖家。
为了在这些货币中获得最大的1200万公关,我尝试了:
df.apply(lambda row: row.nlargest(1).values[-1] in [['CAD 12M PR', 'AUD 12M PR', 'NOK 12M PR', 'SEK 12M PR', 'NZD 12M PR', 'EUR 12M PR', 'GBP 12M PR', 'JPY 12M PR']], axis=1)为了在这些货币中获得最小的1200万PR,我尝试了:
df.apply(lambda row: row.nsmallest(1).values[-1] in [['CAD 12M PR', 'AUD 12M PR', 'NOK 12M PR', 'SEK 12M PR', 'NZD 12M PR', 'EUR 12M PR', 'GBP 12M PR', 'JPY 12M PR']], axis=1)对于这两种情况,我都得到了这个错误:
TypeError: ("Cannot use method 'nlargest' with dtype object", 'occurred at index 0')我的计划是使用上面的代码将1200万个PR排序到买入/卖出存储桶中,然后执行相同的操作,在1Y ZS中找到第一/第二大/最小的。
发布于 2019-10-01 07:32:22
您应该在原始数据帧上尝试df.apply(lambda x: x.dtype)。您将看到所有数据都被转换为object,因为存在混合类型(日期是对象)。
例如:
df.info()<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 17 columns):
Date 2 non-null object
CAD 12M PR 2 non-null float64
AUD 12M PR 2 non-null float64
NOK 12M PR 2 non-null float64
SEK 12M PR 2 non-null float64
NZD 12M PR 2 non-null float64
EUR 12M PR 2 non-null float64
GBP 12M PR 2 non-null float64
JPY 12M PR 2 non-null float64
CAD 1Y ZS 2 non-null float64
AUD 1Y ZS 2 non-null float64
NOK 1Y ZS 2 non-null float64
SEK 1Y ZS 2 non-null float64
NZD 1Y ZS 2 non-null float64
EUR 1Y ZS 2 non-null float64
GBP 1Y ZS 2 non-null float64
JPY 1Y ZS 2 non-null float64
dtypes: float64(16), object(1)
memory usage: 352.0+ bytes当您尝试在apply中使用这些混合类型时:
df.apply(lambda x: x.dtype)你会得到:
Date object
CAD 12M PR object
AUD 12M PR object
NOK 12M PR object
SEK 12M PR object
NZD 12M PR object
EUR 12M PR object
GBP 12M PR object
JPY 12M PR object
CAD 1Y ZS object
AUD 1Y ZS object
NOK 1Y ZS object
SEK 1Y ZS object
NZD 1Y ZS object
EUR 1Y ZS object
GBP 1Y ZS object
JPY 1Y ZS object..。由于混合类型。
相反,您应该将日期设置为DateTimeIndex,这样列中的所有数据类型都是浮点型。
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')这将为您提供可以应用nlargest的值。我没有应用您的任何附加逻辑,因为我假设您的主要问题是dtype。
但是,您应该发布您的预期结果,以获得更完整的答案。我怀疑你的应用方式,你将获得最大的1200万美元的PR,每种货币在所有日期(相当于max)。如果你想要前4名,你需要做一个额外的nlargest(4)来捕获它们。例如,
df[['CAD 12M PR', 'AUD 12M PR', 'NOK 12M PR', 'SEK 12M PR', 'NZD 12M PR',
'EUR 12M PR', 'GBP 12M PR', 'JPY 12M PR']].max(axis=0).nlargest(4)提供所有日期和货币的4个最大的1200万PR分数。这可能是你想要的,也可能不是,很难说。
https://stackoverflow.com/questions/58176266
复制相似问题