给定 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) 使用字符串中的值创建新列,例如 '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)
我想知道如何在处理数百万行时以更快的方式通过代码过滤数据框。许多人建议使用 .loc
、numpy
,但我找不到可能的执行方式。
谢谢!
答案 0 :(得分:1)
我认为你需要numpy.where
:
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
编辑:这里可以将 GroupBy.apply
与自定义函数一起使用,主要将 Series 传递给 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)