筛选数据帧和创建新列的更快方法

2024-05-16 19:08:14 发布

您现在位置:Python中文网/ 问答频道 /正文

给定df

   ticker  close   open
0    AAPL    1.2    1.1
1    TSLA   25.0   27.0
2    TSLA   83.0   80.0
3    TSLA   95.0   93.0
4    CCL   234.0  234.2
5    AAPL  512.0  520.0

我的目的:

(1)将函数应用于每个股票代码数据帧(子集)

(2)为每个ticker数据帧创建新列,列中的值为字符串,如“exist”

我的预期产出

   ticker  close   open  candlestick   SMA_20     SMA_50
0    AAPL    1.2    1.1  bullish      (number)   (number)
1    TSLA   25.0   27.0  bearish      (number)   (number)
2    TSLA   83.0   80.0  bullish      (number)   (number)
3    TSLA   95.0   93.0  bullish      (number)   (number)
4    CCL   234.0  234.2  bearish      (number)   (number)
5    AAPL  512.0  520.0  bearish      (number)   (number)

我试过这个代码,速度非常慢

for x in df.ticker:
    df_ticker = df[df.ticker == x]
    df_close_price = pd.DataFrame(df_ticker.close)
    for days in [20,50]:
       df_ticker[f'SMA_{days}'] = df_close_price.apply(lambda c: abstract.SMA(c, days))
    ......
    df_result = df_result.append(df_ticker)

我想知道在处理数百万行时,如何通过ticker更快地过滤数据帧。许多人建议使用.locnumpy,但我找不到一种可能的执行方法

谢谢


Tags: 数据innumberdfforcloseopendays
1条回答
网友
1楼 · 发布于 2024-05-16 19:08:14

我想你需要^{}

df['candlestick'] = np.where(df['close'] > df['open'], 'bullish', 'bearish')
print (df)
  ticker  close   open candlestick
0   AAPL    1.2    1.1     bullish
1   TSLA   25.0   27.0     bearish
2   TSLA   83.0   80.0     bullish
3   TSLA   95.0   93.0     bullish
4    CCL  234.0  234.2     bearish
5   AAPL  512.0  520.0     bearish

编辑:这里可以将^{}与自定义函数一起使用,主要将序列传递给abstract.SMA,而不是.apply(lambda c: abstract.SMA(c, days)

def f(x):
    for days in [20,50]:
        x[f'SMA_{days}'] = abstract.SMA(x.close, days)
    return x  
    
df = df.groupby('ticker')['close'].apply(f)
print (df)

相关问题 更多 >