python 剔除极值
时间: 2024-06-06 18:04:38 浏览: 181
在 Python 中剔除极值可以使用很多方法,以下是其中的一些:
1. 使用 NumPy 库中的 percentile() 函数来计算数据的上下四分位数(Q1 和 Q3),然后通过计算 Q3+1.5×IQR(IQR = Q3-Q1) 和 Q1-1.5×IQR,来确定数据中的异常值,最后将它们从数据集中删除。
2. 使用 Z-Score 方法。这种方法需要先计算数据的平均值和标准差,然后计算每个数据点的 Z 分数。如果某个数据点的 Z 分数大于 3 或小于 -3,则可以将其视为异常值并将其删除。
3. 使用箱线图(boxplot)来识别异常值。箱线图可以很好地可视化数据分布情况,并且可以显示出数据的中位数、上下四分位数和异常值。
下面是一些相关问题:
相关问题
利用tushare获取数据,使用python根据以下要求处理数据:剔除了交易当天停牌、ST、以及涨跌停不能交易的股票;对获取的基本面数据进行了MAD(绝对中位值)去极值处理;ROE>15%;PE<=15;PEG较小的前10支股票纳入备买股票池
好的,根据你的要求,首先需要安装并引入tushare库,然后获取股票基本面数据并进行数据处理。在获取数据的过程中,我们需要注意剔除停牌、ST、涨跌停的股票,可以通过筛选条件实现。代码如下:
```python
import tushare as ts
import pandas as pd
import numpy as np
# 获取股票基本面数据
pro = ts.pro_api()
df = pro.query('daily_basic', ts_code='', trade_date='20210528',
fields='ts_code,trade_date,close,turnover_rate,pe,pb,total_share,total_mv,'
'circ_mv,roe,net_profit_ratio,eps')
# 剔除交易当天停牌、ST、以及涨跌停不能交易的股票
df = df[df['close'] != 0]
df = df[df['trade_date'] == '20210528']
df = df[df['turnover_rate'] != 0]
df = df[df['pe'] != 0]
df = df[df['pb'] != 0]
df = df[df['roe'] != 0]
df = df[df['net_profit_ratio'] != 0]
df = df[df['eps'] != 0]
df = df[(df['close'] < df['close'].rolling(window=20, min_periods=1).max() * 0.98) &
(df['close'] > df['close'].rolling(window=20, min_periods=1).min() * 1.02)]
df = df[df['name'].str.contains('ST') == False]
df = df[df['name'].str.contains('*ST') == False]
#MAD去极值处理
def mad_method(data,rate=3):
data_median = np.median(data)
mad_value = np.median(np.abs(data - data_median))
max_value = data_median + rate * mad_value
min_value = data_median - rate * mad_value
data[data > max_value] = max_value
data[data < min_value] = min_value
return data
df['roe'] = mad_method(df['roe'])
df = df[(df['roe'] > 15) & (df['pe'] <= 15)]
# 找出PEG较小的前10支股票
df['peg'] = df['pe'] / df['net_profit_ratio']
df = df.sort_values(by=['peg'], ascending=True)
stocks = df.head(10)['ts_code'].tolist()
print(stocks)
```
以上代码中,我们使用了mad_method函数进行MAD去极值处理,将ROE大于15%且PE小于等于15的股票筛选出来,并根据PEG大小排序,最后找出PEG较小的前10支股票作为备买股票池。
剔除了交易当天停牌、ST、以及涨跌停不能交易的股票;对获取的基本面数据进行了MAD(绝对中位值)去极值处理;PEG较小的前10支股票纳入备买股票池
好的,下面是根据您的要求,使用 akshare 获取股票数据并进行去极值处理和 PEG 值筛选的 Python 代码示例:
```python
import akshare as ak
import pandas as pd
import numpy as np
# 获取 A 股股票数据
stock_zh_a_daily_df = ak.stock_zh_a_daily()
# 获取股票基本面数据
stock_zh_a_profit_df = ak.stock_zh_a_profit()
# 合并数据
stock_data_df = pd.merge(stock_zh_a_daily_df, stock_zh_a_profit_df, on='代码')
# 剔除停牌、ST、涨跌停不能交易的股票
selected_stock_df = stock_data_df[(stock_data_df['开盘价'] != 0)
& (stock_data_df['收盘价'] != 0)
& (stock_data_df['涨跌幅'] != 0)
& (stock_data_df['ST'] == '否')
& (stock_data_df['是否涨停'] == '否')
& (stock_data_df['是否跌停'] == '否')]
# 计算 PEG 值
selected_stock_df['PEG'] = selected_stock_df['PE_TTM'] / selected_stock_df['每股收益同比增长率']
# MAD(绝对中位值)去极值处理
def mad_based_outlier(points, thresh=3.5):
if len(points.shape) == 1:
points = points[:,None]
median = np.median(points, axis=0)
difference = np.sum((points - median)**2, axis=-1)
difference = np.sqrt(difference)
median_difference = np.median(difference)
modified_z_score = 0.6745 * difference / median_difference
return modified_z_score > thresh
selected_stock_df = selected_stock_df[~mad_based_outlier(selected_stock_df['PEG
阅读全文