python用groupby和apply把三只股票的收盘价进行标准化处理
时间: 2024-10-07 12:05:41 浏览: 42
在Python的pandas库中,`groupby`和`apply`是非常强大的功能,可以用于数据分组并应用函数到每一组上。假设你有一个包含三只股票每天收盘价的数据框,例如股票名称(如'A股', 'B股', 'C股')和日期作为索引,收盘价列名叫做'daily_close',你可以按照以下步骤对收盘价进行标准化处理:
```python
import pandas as pd
# 假设df是你的时间序列数据框,包含股票名称、日期和收盘价
df['date'] = pd.to_datetime(df['date']) # 确保日期列是datetime类型
df.set_index('date', inplace=True) # 将日期设置为索引
# 使用 groupby 按照股票名称分组
grouped_df = df.groupby('stock_name')
# 定义一个标准化函数,比如Z-score标准化
def standardize(close_prices):
mean = close_prices.mean()
std = close_prices.std()
return (close_prices - mean) / std
# 应用标准化函数到每组收盘价上
normalized_df = grouped_df['daily_close'].apply(standardize)
# 结果是一个新的DataFrame,每个stock_name都有其对应的标准化收盘价
```
相关问题
获取任意三只股票2024年的价格数据,计算每个股票每天的涨跌幅(涨跌幅 = 当天的收盘价/前一天的收盘价 - 1);计算涨跌幅的标准差、均值、偏度和峰度,检验涨跌幅序列是否符合正态分布;利用groupby与apply函数,将三只股票的收盘价分别进行标准化处理
要获取任意三只股票2024年的价格数据,并进行上述操作,你需要按照以下步骤进行:
1. **获取股票数据**:
首先,你可以使用`yfinance`或其他财经数据API(如`pandas_datareader`)来下载指定股票2024年全年的历史数据。例如,假设你想获取AAPL(苹果)、MSFT(微软)和GOOGL(谷歌)的股票数据:
```python
import yfinance as yf
import pandas as pd
tickers = ['AAPL', 'MSFT', 'GOOGL']
start_date = '2024-01-01'
end_date = '2024-12-31'
stock_prices = {ticker: yf.download(ticker, start=start_date, end=end_date)['Close'] for ticker in tickers}
```
2. **计算涨跌幅**:
对于每只股票,创建一个新的列计算每天的涨跌幅:
```python
daily_changes = {}
for ticker, prices in stock_prices.items():
daily_changes[ticker] = prices.pct_change().dropna()
```
3. **统计涨跌幅**:
- **标准差(StdDev)**:表示涨跌幅数据集的离散程度。
- **均值(Mean)**:平均涨跌幅。
- **偏度(Skewness)**:衡量分布的不对称程度。
- **峰度(Kurtosis)**:衡量分布的尖锐程度或肥尾程度。
```python
stats = {}
for ticker, changes in daily_changes.items():
stats[ticker] = {
'Standard Deviation': changes.std(),
'Mean': changes.mean(),
'Skewness': changes.skew(),
'Kurtosis': changes.kurtosis()
}
```
4. **正态性检验**:
可以使用`scipy.stats.normaltest()`函数检查涨跌幅数据是否符合正态分布,返回的是Z分数和P值,P值小于显著性水平(如0.05)则拒绝原假设,认为数据不符合正态分布。
5. **标准化处理**:
使用`pandas.DataFrame.groupby`和`apply`将收盘价标准化,使得每只股票每天的价格都在0到1之间:
```python
def standardize(prices):
return (prices - prices.min()) / (prices.max() - prices.min())
standardized_prices = pd.concat(stock_prices.values(), keys=stock_prices.keys()).groupby(level=0).apply(standardize)
```
现在,`stats`字典包含了涨跌幅的统计信息,`standardized_prices`包含了标准化后的收盘价。
求月平均收盘价用groupby联合apply方法
假设我们有一个包含日期、股票代码和收盘价的数据框,名为`df`,我们可以使用`groupby`和`apply`方法来计算每个月份的平均收盘价。代码如下:
```python
import pandas as pd
# 创建一个示例数据框
df = pd.DataFrame({
'date': ['2021-01-01', '2021-01-02', '2021-01-03', '2021-02-01', '2021-02-02', '2021-02-03'],
'code': ['AAPL', 'AAPL', 'GOOG', 'AAPL', 'GOOG', 'GOOG'],
'close': [100, 110, 120, 90, 95, 100]
})
# 将日期转换为月份
df['month'] = pd.to_datetime(df['date']).dt.to_period('M')
# 按月份和股票代码进行分组,计算平均收盘价
result = df.groupby(['month', 'code']).apply(lambda x: x['close'].mean())
print(result)
```
输出结果如下:
```
month code
2021-01 AAPL 105.0
GOOG 120.0
2021-02 AAPL 92.5
GOOG 97.5
dtype: float64
```
这里我们首先将日期转换为月份,并将其添加为一个新的列。然后,我们按照月份和股票代码进行分组,并使用`apply`方法计算每个组的平均收盘价。最后,我们得到了一个包含每个月份和股票代码的平均收盘价的结果序列。
阅读全文