我有一个数据框和一系列费率。我的计算非常简单:
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。
答案 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)
只需使用感兴趣的data
切片
系列ret_rate
用于演示目的,其长度等于data
的列数
您将data
与ret_rate
沿{(1}})列{(1}}和axis=1
此DataFrame相乘,并添加初始DataFrame
代码:
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
上的解决方案