【问题标题】:Computing the column value based on previous rows根据前几行计算列值
【发布时间】:2017-07-08 15:33:54
【问题描述】:

我想在每一行添加一个新的 Y 列,这将告诉我 X 列 val 大于过去 10 条记录的 > 1 的百分比次数

stock price history

   ticker       date    adj_open   ad_close       X(%) 
0    ABC     2017-10-06   12.10      13.11        8.0
1    ABC     2017-12-05   11.11      11.87        5.0
2    ABC     2017-12-04   12.08      11.40       -7.0
3    ABC     2017-12-03   12.01      13.03       10.1
4    ABC     2017-07-04   9.01        9.59        8.0
5    ABC     2017-07-03   7.89        8.19        4.0

Resultant transformed data set

    ticker       date    adj_open ad_close    X(%)     Y(%)    
0    ABC     2017-10-06   12.10    13.11      8.0        80
1    ABC     2017-12-05   11.11    11.87      5.0        75
2    ABC     2017-12-04   12.08    11.40     -7.0       100
3    ABC     2017-12-03   12.01    13.03     10.1       100
4    ABC     2017-07-04   9.01     9.59       8.0       100
5    ABC     2017-07-03   7.89     8.19       4.0        0

【问题讨论】:

标签: python pandas numpy dataframe


【解决方案1】:

尝试使用 try exceptsimple 循环,这是基于您的示例输出,请尝试根据您的 data 修改它

n=5 #your example
df['boolean']=df['X(%)']>1
A=[]
for i in range(len(df)):
     try :
         A.append(sum(df.boolean[i+1:i+n+1])/len(df.boolean[i+1:i+n+1]))
     except:
         A.append(0)

df['Y(%)']=A


df

     ticker       date  adj_open  ad_close   X(%) boolean Y(%)
   0    ABC  10/6/2017     12.10     13.11   8.0   True  0.80
   1    ABC  12/5/2017     11.11     11.87   5.0   True  0.75
   2    ABC  12/4/2017     12.08     11.40  -7.0  False  1.00
   3    ABC  12/3/2017     12.01     13.03  10.1   True  1.00
   4    ABC   7/4/2017      9.01      9.59   8.0   True  1.00
   5    ABC   7/3/2017      7.89      8.19   4.0   True  0.00

【讨论】:

    【解决方案2】:

    你有:

    df
        ticker  date        adj_open    ad_close    X(%)
    0   ABC     2017-10-06  12.10       13.11       8.0
    1   ABC     2017-12-05  11.11       11.87       5.0
    2   ABC     2017-12-04  12.08       11.40      -7.0
    3   ABC     2017-12-03  12.01       13.03       10.1
    4   ABC     2017-07-04  9.01        9.59        8.0
    5   ABC     2017-07-03  7.89        8.19        4.0
    

    让我们定义window 和一个计算所需数量的函数:

    w = 2
    def count_pcnt(x, window = w):
        return (np.sum(x>1)/window)*100.0
    

    最后,让我们应用函数:

    df["Y(%)"] = df["X(%)"].rolling(window=w).apply(count_pcnt)
    df
    
        ticker  date        adj_open    ad_close    X(%)    Y(%)
    0   ABC     2017-10-06  12.10       13.11       8.0     NaN
    1   ABC     2017-12-05  11.11       11.87       5.0     100.0
    2   ABC     2017-12-04  12.08       11.40      -7.0     50.0
    3   ABC     2017-12-03  12.01       13.03      10.1     50.0
    4   ABC     2017-07-04  9.01         9.59       8.0     100.0
    5   ABC     2017-07-03  7.89         8.19       4.0     100.0
    

    您可以将w 更改为10,因为您有更多数据。

    编辑

    如果你愿意:

    w=4
    df["Y(%)"] = df["X(%)"].rolling(window=w).apply(lambda x: count_pcnt(x, window = w))
    
    df
        ticker  date        adj_open    ad_close    X(%)    Y(%)
    0   ABC     2017-10-06  12.10       13.11       8.0     NaN
    1   ABC     2017-12-05  11.11       11.87       5.0     NaN
    2   ABC     2017-12-04  12.08       11.40      -7.0     NaN
    3   ABC     2017-12-03  12.01       13.03      10.1     75.0
    4   ABC     2017-07-04  9.01        9.59        8.0     75.0
    5   ABC     2017-07-03  7.89        8.19        4.0     75.0
    

    编辑 2

    w=4 # specify the desired window
    df["Y(%)"] = df["X(%)"].rolling(window=w).apply(lambda x: (np.sum(x>1)/x.shape[0])* 100.0)
    

    编辑 3

    w=4
    df["Y(%)"] = df["X(%)"].rolling(window=w
                                    ,min_periods = 0).apply(lambda x: (np.sum(x>1)/x.shape[0])* 100.0)
    df
    
    ticker  date    adj_open    ad_close    X(%)    Y(%)
    0   ABC 2017-10-06  12.10   13.11   8.0     100.000000
    1   ABC 2017-12-05  11.11   11.87   5.0     100.000000
    2   ABC 2017-12-04  12.08   11.40   -7.0    66.666667
    3   ABC 2017-12-03  12.01   13.03   10.1    75.000000
    4   ABC 2017-07-04  9.01    9.59    8.0     75.000000
    5   ABC 2017-07-03  7.89    8.19    4.0     75.000000
    

    【讨论】:

    • 得到一个错误 count_pcnt() 只需要 1 个参数(给定 0)
    • @user845405 在这里完美运行。我建议您仔细检查您是否正确复制了代码,包括列名............
    • 我使用了编辑 2 ,现在得到所有的 NaN 值?甚至你的一些结果也有 NaN
    • @user845405 我们有NaNs,直到我们获得整个窗口的数据。您可以使用第 3 版更改此默认行为,其中我引入了 min_periods = 0 参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多