如何传递参数以正确应用

时间:2018-01-31 09:34:30

标签: python pandas dataframe

有api功能

get_next_trading_date(exchange='SZSE', date='2017-05-01')

我有一个DataFrame backTestRecordAfterModified显示如下

enter image description here 我跑的时候

backTestRecordAfterModified['createdAt']=backTestRecordAfterModified['createdAt'].apply(func=get_next_trading_date, exchange='SZSE')

控制台显示消息:TypeError: get_next_trading_date() got multiple values for argument 'exchange'

所以,如何正确传递参数

补充

backTestRecordAfterModified['createdAt'] = backTestRecordAfterModified['createdAt'].apply(lambda date: get_next_trading_date(date, exchange='SZSE'))

上面的代码仍会显示相同的错误。

enter image description here

我添加了get_next_trading_date

的定义

enter image description here

我刚才得到了最终答案。

backTestRecordAfterModified['createdAt']=backTestRecordAfterModified['createdAt'].apply(lambda date: get_next_trading_date(date=date,exchange='SZSE'))

3 个答案:

答案 0 :(得分:1)

您必须使用lambda函数将附加参数传递给get_next_trading_date()函数:

backTestRecordAfterModified['createdAt']=backTestRecordAfterModified['createdAt'].apply(lambda date: get_next_trading_date(date=date, exchange='SZSE'))

pandas.Series.apply()函数实际上支持函数的其他关键字参数,但函数的第一个参数始终是pandas系列的值。

如果 get_next_trading_date()的定义不同,则参数的顺序颠倒过来:

get_next_trading_date_2(date='2017-05-01', exchange='SZSE')
你可以用

backTestRecordAfterModified['createdAt']=backTestRecordAfterModified['createdAt'].apply(func=get_next_trading_date, exchange='SZSE').

答案 1 :(得分:0)

为pandas系列的每个值调用apply函数,默认情况下,该值作为参数传递给函数。

您指定的其他参数将在系列值之后传递。 所以在你的例子中,每次函数调用都是

get_next_trading_date(<i-th value of the series>, exchange='SZSE')

但是在你的函数中,第一个参数是exchange,所以<i-th value of the series>(当前日期)传递给exchange,然后又有另一个关键字参数试图设置相同的变量。这会导致错误。更多here

这里有两个选项。

a)更改函数定义以将date作为第一个参数,这样您就不必更改函数调用。但是请确保在您调用此功能的任何地方进行更改。

get_next_trading_date(date='2017-05-01', exchange='SZSE')

b)将您的函数调用更改为传递日期作为第二个参数。

backTestRecordAfterModified['createdAt'] = backTestRecordAfterModified['createdAt'].apply(lambda date: get_next_trading_date(date, exchange='SZSE'))

或简化为,

backTestRecordAfterModified['createdAt'].apply(lambda date: get_next_trading_date(date, exchange='SZSE'), inplace=True)

答案 2 :(得分:0)

一种选择是使用df.apply代替series.apply

df['createdAt'] = df.apply(lambda row: get_date(row['createdAt'], 'SZSE'), axis=1)

或者,如果您不想传递整个数据帧:

df['createdAt'] = [get_date(x, 'SZSE') for x in df['createdAt'].values]
相关问题