pandas数据帧中的行(n-1)* rate + row(n)

时间:2017-02-20 11:07:58

标签: python pandas dataframe statistics time-series

我有一个数据框和一系列费率。我的计算非常简单:

  

new_row(n)= new_row(n-1)* rate + old_row(n)

我的数据框中有20个列。 rate 是一系列20(每列1个)。我用循环编写了一个代码,需要将近9秒才能运行。我相信,这不是进行这项练习的理想方式。我想找到一种Pythonic方法。

data = pd.read_csv('data.csv')
ret_rate = pd.read_csv('Retention_Rate.csv')

ret_dat = data.copy()
for i in range(4, ret_dat.shape[1]):
    for j in range(1, ret_dat.shape[0]):
        if (ret_dat['MARKET_ID'][j] == ret_dat['MARKET_ID'][j-1]):
        ret_dat.iloc[j, i] = ret_dat.iloc[j, i] + ret_rate.iloc[i-4,0]*ret_dat.iloc[j-1, i]

ret_dat.to_csv('adstock_data_v3.csv')

我已将数据in a Google sheet

3 个答案:

答案 0 :(得分:0)

我不确定这是否是你想要达到的目标 - 但这更简单,直接翻译你给出的公式

data = pd.read_csv('data.csv')
ret_rate = pd.read_csv('Retention_Rate.csv',usecols=['rate'])
# since you require only the 5th column onwards
ret_data = data.ix[:,4:]

# you can apply broad operations over rows instead of individual cells now
for i in range(1,len(ret_data)):
    ret_data.iloc[i] = ret_data.iloc[i-1].multiply(ret_rate.rate.iloc[i-1]) + ret_dat.iloc[i]

ret_data.to_csv('your_filename.csv',sep=',')

答案 1 :(得分:-1)

  1. 只需使用感兴趣的data切片

  2. 系列ret_rate用于演示目的,其长度等于data的列数

  3. 您将dataret_rate沿{(1}})列{(1}}和axis=1此DataFrame相乘,并添加初始DataFrame

  4. 代码:

    shift

    所以所有的计算只是一行熊猫。

    对于data = pd.read_csv("data_so.csv").iloc[:,4:] ret_rate = pd.Series(range(df.shape[1]), index=df.columns) data.multiply(ret_rate, 1).shift() + data multiply()的索引等于ret_rate的列名非常重要。

答案 2 :(得分:-1)

终于找到了解决方案。在这一点上,我能找到最优的解决方案。利用scipy.signal.lfilter的信号处理。这是解决方案:

for media_var in self.config.media_vars: adstocked_vals = lfilter([1], [1, -ret_rate[media_var]], data[media_var])

感谢所有给出不同答案的人。它确实以某种方式帮助了我。感谢Warren Weckesser在另一个帖子here

上的解决方案