【问题标题】:row(n-1)*rate + row(n) in a pandas dataframe熊猫数据框中的行(n-1)*速率+行(n)
【发布时间】:2017-07-09 15:16:47
【问题描述】:

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

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.

【问题讨论】:

  • 感谢您提出这个问题。它帮助我解决了类似的问题

标签: python pandas dataframe statistics time-series


【解决方案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

【讨论】:

    【解决方案2】:

    我不确定这是否是您想要实现的目标 - 但这更简单,并且是您给出的公式的直接翻译

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

    【讨论】:

    • 可能是我犯了一个愚蠢的错误......但这只会给我第一行输出。其余都是 NaN。
    【解决方案3】:
    1. 只需使用感兴趣的data 切片

    2. 系列ret_rate 用于演示一个长度等于data 的列数的范围

    3. 你将 dataret_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 
    

    所以所有的计算都只是一行 pandas。

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

    【讨论】:

    • ret_rate 在 csv 中有值。将其转换为以 data.columns 为索引的系列时面临困难。任何帮助请...ret_rate_s = pd.Series(ret_rate.ix[:,0], index=data.columns)给我所有的NaN
    • 要将 csv 作为系列读取,您应该使用 pandas 函数 read_csv。要么 csv 只有一列,要么通过参数usecols 定义要使用的列。在任何一种情况下,如果您设置squeeze=Trueread_csv 函数将返回一个 Series 而不是 DataFrame。阅读 csv 后,您可以设置 ret_rate.index = data.columns
    • 成功了! @elcombato。我可以创建一个系列,但后来才意识到 df.multiply 无法处理浮点类型。只允许整数!真可惜!
    • @Nil df.multiply()float 应该没有问题!
    • 正确!我发现我有一些文本字段。我的错!
    猜你喜欢
    • 1970-01-01
    • 2018-02-28
    • 2014-09-23
    • 2020-11-25
    • 2019-04-01
    • 1970-01-01
    • 2023-04-01
    • 2022-11-10
    • 2020-05-11
    相关资源
    最近更新 更多