2017-10-10 90 views
2

目标:将N个int列表传递给函数,并将这些int用于1)。在熊猫数据框中创建并命名N列; 2)。使用这些整数作为回溯期来计算滚动平均值。在for循环中创建并命名大熊猫系列

这里是该函数的代码(与重复性数据拉):收到

import pandas as pd 
import pandas_datareader as web 

test_df = web.DataReader('GDP', data_source = 'fred') 

def sma(df, sma_lookbacks = [1,2]): 
    import pandas as pd 

    df = pd.DataFrame(df) 
    df = df.dropna() 

    for lookback in sma_lookbacks: 
     df[str('SMA' + str(lookback))] = df.rolling(window = lookback).mean() 
    return df.tail() 

sma(test_df) 

错误:

ValueError: Wrong number of items passed 2, placement implies 1

难道我在这里有一个逻辑问题?我相信在for循环中它应该按顺序传递整数,所以我不太明白它是如何一次传递多个值的。因此,我不确定如何解决问题。

根据这篇文章,当您同时将多个值传递给只能取一个值的容器时,会引发此错误。不应该for循环地址? ValueError: Wrong number of items passed - Meaning and suggestions?

回答

2

我认为熊猫在分配从数据框应用的函数返回的值之前搜索列名称。因此,分配系列初始化之前在开始时有些标柱从函数返回该列即

import pandas as pd 
import pandas_datareader as web 

test_df = web.DataReader('GDP', data_source = 'fred') 

def sma(df, sma_lookbacks = [1,2]): 

    df = pd.DataFrame(df) 
    df = df.dropna() 

    for lookback in sma_lookbacks: 
     df[str('SMA' + str(lookback))] = 0 
     df[str('SMA' + str(lookback))] = df.rolling(window = lookback).mean() 
    return df.tail() 
 
       GDP  SMA1  SMA2 
DATE         
2016-04-01 18538.0 18538.0 18431.60 
2016-07-01 18729.1 18729.1 18633.55 
2016-10-01 18905.5 18905.5 18817.30 
2017-01-01 19057.7 19057.7 18981.60 
2017-04-01 19250.0 19250.0 19153.85