【EDA】常用函数,python
dataframe
- 删除
1.1 删除重复列名
data = data.loc[:, ~data.columns.duplicated()]
1.2 删除空值所在的行
data_n.dropna(axis=0, inplace=True)
1.3 删除某列
del data['col']
or
删除一列
df.drop('state', axis=1)
删除多列
df.drop(['state', 'point'], axis=1)
1.4 dataframe 删除重复列
方法1:
df3.T.drop_duplicates().T
方法2:
df=df.groupby(level=0,axis=1).first() #按列名合并,保留第一个列名的值
2.dataframe 分割 split
data1 = data.iloc[:,0].str.split(';', n-1, expand=True)
EDA
-
info
data.shape, describe(), info() -
缺失值
isnull().sum()
missingno.bar()
.matrix()
.heatmap()
删除缺失值所在的行:
data11 = data1.dropna(axis=0, subset=[, , ]) -
数据分布
sns.distplot()
value_counts() -
相关性
sns.heatmap(data.corr())
时间序列EDA
TLCC
时间滞后互相关(TLCC)可以定义两个信号之间的方向性,例如引导-追随关系,在这种关系中,引导信号会初始化一个响应,追随信号则重复它。
WTLCC窗口时间滞后互相关
reference:
https://www.zhihu.com/question/23525783
周期性:自相关ACF和傅里叶变换。
相关性:皮尔逊相关系数和斯皮尔曼相关系数。皮尔逊相关系数适用于线性关系的测量,而斯皮尔曼相关系数适用于非线性关系的测量。
互相关性cross correlation。
标准化的自相关(Normalized Auto-Correlation)
标准化的互相关与时移(Normalized Cross-Correlation with Time Shift)
标准化的自相关与时移(Normalized Auto-Correlation with Time Shift)
滞后性:自相关函数(ACF)和偏自相关函数(PACF)
趋势性:简单移动平均、加权移动平均和趋势线拟合等
离群值:箱线图、Z分数、3σ原则和孤立森林等
reference:https://blog.csdn.net/Eaton18/article/details/103116059
plot
twinx
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0., np.e, 0.01)
y1 = np.exp(-x)
y2 = np.log(x)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(x, y1,'r',label="right");
ax1.legend(loc=1)
ax1.set_ylabel('Y values for exp(-x)');
ax2 = ax1.twinx() # this is the important function
ax2.plot(x, y2, 'g',label = "left")
ax2.legend(loc=2)
ax2.set_xlim([0, np.e]);
ax2.set_ylabel('Y values for ln(x)');
ax2.set_xlabel('Same X for both exp(-x) and ln(x)');
plt.show()
画图常用设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
pd.set_option('display.max_colwidth', None) # 显示所有列
pd.set_option('display.max_rows', None) # 显示所有行
dict
定义值为空的dict
dict() 字典构造器
key = [1, 2, 3, 4]
a = dict([(k, []) for k in key])
fromkeys()
key = [1, 2, 3, 4]
# 使用 fromkeys()
b = {}.fromkeys(key, [])
时序数据常用处理
找寻时间不连续点
from pandas import NaT
def time_split(df):
data = df.copy()
data.reset_index(drop=True, inplace=True)
data['time_diff_on'] = data['_time'].diff(1)
data['time_diff_on'] = [_.total_seconds() for _ in data['time_diff_on'] if _ != NaT]
data['time_diff_on'].fillna(0, inplace=True)
data['on'] = [0 if i < -50 else 1 for i in data['time_diff_on']]
lst_on = data.loc[data['on'] == 0, '_time'].tolist()
lst_on = [pd.to_datetime(data['_time'].values[0])] + lst_on
data['time_diff_off'] = data['_time'].diff(-1)
data['time_diff_off'] = [_.total_seconds() for _ in data['time_diff_off'] if _ != NaT]
data['time_diff_off'].fillna(0, inplace=True)
data['off'] = [0 if i < -50 else 1 for i in data['time_diff_off']]
lst_off = data.loc[data['off'] == 0, '_time'].tolist()
lst_off = lst_off + [pd.to_datetime(data['_time'].values[-1])]
return lst_on, lst_off
读取拼接一个文件夹里的多个文件
def concat_data(path_base):
# path_base = r'E:\data'
path_list = os.listdir(path_base)
df_ = pd.DataFrame()
for i in range(len(path_list)):
path = os.path.join(path_base, path_list[i])
df = pd.read_csv(path)
df_ = pd.concat([df_, df], axis=0)
return df_
评估一份数据的质量
可能的分析角度:
数据采集频率
数据精度
数据测量误差:如果是手动记录的数据,可以尝试计算时间的差分,数值的差分。
数据缺失值
数据异常值
数据方差
数据偏态
数据有效生产时长占比