2017-02-20 46 views
0

我有一个数据帧和一系列速率。我的计算是非常简单的:行(n-1)* rate + row(n)在熊猫数据帧中

NEW_ROW(N)= NEW_ROW(N-1)*率+ old_row(N)

我有我的数据帧20列。 是一系列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

终于找到了解决办法。在这一点上,我可以找到最优化的解决方案。利用来自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

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

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

  3. 列数的范围内你乘data沿着ret_rate列(axis=1)和shift这个DataFrame加1,并加上初始DataFrame

代码:

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 

因此,所有的计算IST只有一行大熊猫。

对于multiply()重要的是,ret_rate的索引等于data的列名称。

+0

ret_rate在csv中具有值。在将索引转换为data.columns时遇到困难。任何帮助,请... 'ret_rate_s = pd.Series(ret_rate.ix [:,0],index = data.columns)' 给我所有NaN – Nil

+0

要读取csv作为系列,你应该使用熊猫函数['read_csv'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)。或者csv只有一列,或者您定义要与参数usecols一起使用的列。无论哪种情况,如果您设置'squeeze = True','read_csv'函数将返回一个Series而不是DataFrame。读完csv后,你可以设置'ret_rate.index = data.columns' – elcombato

+0

它工作! @elcombato。我可以创建一个系列,但是,然后,只有意识到df.multiply不能处理浮动类型。只有整合者允许!无赖! – Nil

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=',') 
+0

可能是我犯了一个愚蠢的错误......但这只给了我第一行输出。其余的都是NaN。 – Nil