掌握这些数据分析指令,让你成为数据驱动决策的高手
欢迎大家关注此公众号,后台点击按钮【免费资料】可免费获取【Python入门30节课】电子书
此外小庄推荐一本适合于新手\小白入手一本 Python基础书籍,欢迎大家订阅,也感谢大家支持,我才有更新的动力
Python数据分析工程师需要掌握数据处理、清洗、分析和可视化的核心技能。本文将系统性地介绍数据分析工程师必须掌握的指令和库,帮助你高效地从数据中提取价值。
pip install numpy
pip install pandas
pip install matplotlib
pip install seaborn
pip install plotly
pip install scipy
pip install scikit-learn
pip install openpyxl
pip install xlrd
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
import numpy as np
# 创建一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1)
# 创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
# 创建特殊数组
zeros = np.zeros((3, 4)) # 全0数组
ones = np.ones((2, 3)) # 全1数组
empty = np.empty((3, 3)) # 空数组
eye = np.eye(3) # 单位矩阵
arange = np.arange(0, 10, 2) # 等差数组
linspace = np.linspace(0, 1, 5) # 等间隔数组
# 随机数组
random_uniform = np.random.rand(3, 4) # 均匀分布
random_normal = np.random.randn(3, 4) # 正态分布
random_int = np.random.randint(0, 10, (3, 4)) # 随机整数
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 基本属性
print(f'形状: {arr.shape}') # (2, 3)
print(f'维度: {arr.ndim}') # 2
print(f'元素总数: {arr.size}') # 6
print(f'数据类型: {arr.dtype}') # int32
# 改变形状
reshaped = arr.reshape(3, 2)
flattened = arr.flatten()
# 转置
transposed = arr.T
# 切片
print(arr[0, :]) # 第一行
print(arr[:, 0]) # 第一列
print(arr[0:2, 1:3]) # 子数组
# 条件筛选
arr = np.array([1, 2, 3, 4, 5, 6])
filtered = arr[arr > 3] # [4, 5, 6]
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 基本运算
print(a + b) # [5, 7, 9]
print(a - b) # [-3, -3, -3]
print(a * b) # [4, 10, 18]
print(a / b) # [0.25, 0.4, 0.5]
print(a ** 2) # [1, 4, 9]
# 聚合函数
print(np.sum(a)) # 6
print(np.mean(a)) # 2.0
print(np.std(a)) # 标准差
print(np.var(a)) # 方差
print(np.min(a)) # 1
print(np.max(a)) # 3
print(np.argmin(a)) # 最小值索引
print(np.argmax(a)) # 最大值索引
# 矩阵运算
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(np.dot(A, B)) # 矩阵乘法
print(A @ B) # 矩阵乘法(Python 3.5+)
print(np.linalg.inv(A)) # 矩阵求逆
print(np.linalg.det(A)) # 行列式
import numpy as np
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 基本统计
print(f'均值: {np.mean(data)}')
print(f'中位数: {np.median(data)}')
print(f'标准差: {np.std(data)}')
print(f'方差: {np.var(data)}')
print(f'最小值: {np.min(data)}')
print(f'最大值: {np.max(data)}')
print(f'求和: {np.sum(data)}')
print(f'累积和: {np.cumsum(data)}')
# 百分位数
print(f'25%分位数: {np.percentile(data, 25)}')
print(f'50%分位数: {np.percentile(data, 50)}')
print(f'75%分位数: {np.percentile(data, 75)}')
# 相关系数
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])
correlation = np.corrcoef(x, y)
print(f'相关系数矩阵:\n{correlation}')
import pandas as pd
# 从字典创建
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'City': ['New York', 'London', 'Paris', 'Tokyo']
}
df = pd.DataFrame(data)
print(df)
# 从列表创建
data = [['Alice', 25], ['Bob', 30], ['Charlie', 35]]
df = pd.DataFrame(data, columns=['Name', 'Age'])
# 从CSV文件创建
df = pd.read_csv('data.csv')
# 从Excel文件创建
df = pd.read_excel('data.xlsx')
# 从JSON文件创建
df = pd.read_json('data.json')
# 从数据库创建
import sqlite3
conn = sqlite3.connect('database.db')
df = pd.read_sql('SELECT * FROM table_name', conn)
import pandas as pd
# 假设df已经创建
# 查看前几行
print(df.head())
print(df.head(10))
# 查看后几行
print(df.tail())
print(df.tail(10))
# 查看基本信息
print(df.info())
# 查看统计描述
print(df.describe())
# 查看形状
print(df.shape)
# 查看列名
print(df.columns)
# 查看数据类型
print(df.dtypes)
# 查看唯一值
print(df['City'].unique())
# 查看值计数
print(df['City'].value_counts())
import pandas as pd
# 选择单列
ages = df['Age']
print(ages)
# 选择多列
subset = df[['Name', 'Age']]
print(subset)
# 使用loc选择(基于标签)
print(df.loc[0]) # 选择第一行
print(df.loc[0:2]) # 选择前3行
print(df.loc[0:2, ['Name', 'Age']]) # 选择特定行和列
# 使用iloc选择(基于位置)
print(df.iloc[0]) # 选择第一行
print(df.iloc[0:2]) # 选择前3行
print(df.iloc[0:2, 0:2]) # 选择特定行和列
# 条件筛选
young_people = df[df['Age'] < 30]
print(young_people)
# 多条件筛选
filtered = df[(df['Age'] > 25) & (df['City'] == 'London')]
print(filtered)
# 使用query方法
filtered = df.query('Age > 25 and City == "London"')
print(filtered)
import pandas as pd
import numpy as np
# 处理缺失值
print(df.isnull()) # 检查缺失值
print(df.isnull().sum()) # 统计缺失值数量
# 删除缺失值
df_cleaned = df.dropna() # 删除包含缺失值的行
df_cleaned = df.dropna(subset=['Age']) # 删除Age列有缺失值的行
df_cleaned = df.dropna(how='all') # 删除全为缺失值的行
# 填充缺失值
df_filled = df.fillna(0) # 用0填充
df_filled = df.fillna({'Age': df['Age'].mean()}) # 用均值填充
df_filled = df.fillna(method='ffill') # 用前一个值填充
df_filled = df.fillna(method='bfill') # 用后一个值填充
# 处理重复值
print(df.duplicated()) # 检查重复值
print(df.duplicated().sum()) # 统计重复值数量
df_unique = df.drop_duplicates() # 删除重复值
df_unique = df.drop_duplicates(subset=['Name']) # 根据特定列删除重复值
# 数据类型转换
df['Age'] = df['Age'].astype(int)
df['Date'] = pd.to_datetime(df['Date'])
# 字符串处理
df['Name'] = df['Name'].str.lower() # 转换为小写
df['Name'] = df['Name'].str.upper() # 转换为大写
df['Name'] = df['Name'].str.strip() # 去除空格
df['Name'] = df['Name'].str.replace('old', 'new') # 替换
import pandas as pd
# 排序
df_sorted = df.sort_values('Age') # 按Age升序
df_sorted = df.sort_values('Age', ascending=False) # 按Age降序
df_sorted = df.sort_values(['Age', 'Name']) # 多列排序
# 重命名列
df_renamed = df.rename(columns={'Name': '姓名', 'Age': '年龄'})
# 添加新列
df['Age_Group'] = pd.cut(df['Age'], bins=[0, 25, 35, 100], labels=['Young', 'Middle', 'Senior'])
# 删除列
df_dropped = df.drop(columns=['City'])
# 删除行
df_dropped = df.drop(index=[0, 1])
# 应用函数
df['Age_Doubled'] = df['Age'].apply(lambda x: x * 2)
# 映射值
city_mapping = {'New York': 'NY', 'London': 'LDN', 'Paris': 'PRS'}
df['City_Code'] = df['City'].map(city_mapping)
# 替换值
df_replaced = df.replace({'City': {'New York': 'NYC'}})
import pandas as pd
# 分组聚合
grouped = df.groupby('City')
print(grouped.mean()) # 计算均值
print(grouped.sum()) # 计算总和
print(grouped.count()) # 计数
print(grouped.min()) # 最小值
print(grouped.max()) # 最大值
# 多列分组
grouped = df.groupby(['City', 'Age_Group'])
print(grouped.mean())
# 自定义聚合
def custom_agg(x):
return pd.Series({
'mean': x.mean(),
'std': x.std(),
'range': x.max() - x.min()
})
result = df.groupby('City')['Age'].apply(custom_agg)
print(result)
# 透视表
pivot_table = df.pivot_table(
values='Age',
index='City',
columns='Age_Group',
aggfunc='mean'
)
print(pivot_table)
# 交叉表
cross_tab = pd.crosstab(df['City'], df['Age_Group'])
print(cross_tab)
import pandas as pd
# 创建示例数据
df1 = pd.DataFrame({
'ID': [1, 2, 3],
'Name': ['Alice', 'Bob', 'Charlie']
})
df2 = pd.DataFrame({
'ID': [2, 3, 4],
'Age': [30, 35, 40]
})
# 内连接
merged = pd.merge(df1, df2, on='ID', how='inner')
print(merged)
# 左连接
merged = pd.merge(df1, df2, on='ID', how='left')
print(merged)
# 右连接
merged = pd.merge(df1, df2, on='ID', how='right')
print(merged)
# 外连接
merged = pd.merge(df1, df2, on='ID', how='outer')
print(merged)
# 拼接
concatenated = pd.concat([df1, df2], axis=0) # 纵向拼接
concatenated = pd.concat([df1, df2], axis=1) # 横向拼接
import pandas as pd
# 导出为CSV
df.to_csv('output.csv', index=False, encoding='utf-8-sig')
# 导出为Excel
df.to_excel('output.xlsx', index=False, sheet_name='Sheet1')
# 导出为JSON
df.to_json('output.json', orient='records', force_ascii=False)
# 导出为SQL
import sqlite3
conn = sqlite3.connect('output.db')
df.to_sql('table_name', conn, if_exists='replace', index=False)
conn.close()
import matplotlib.pyplot as plt
import numpy as np
# 折线图
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='sin(x)', color='blue', linewidth=2)
plt.title('正弦函数')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
plt.show()
# 散点图
x = np.random.randn(100)
y = np.random.randn(100)
plt.figure(figsize=(10, 6))
plt.scatter(x, y, c='red', alpha=0.5, s=50)
plt.title('散点图')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
# 柱状图
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 78, 32]
plt.figure(figsize=(10, 6))
plt.bar(categories, values, color='skyblue')
plt.title('柱状图')
plt.xlabel('类别')
plt.ylabel('值')
plt.show()
# 饼图
labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10]
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue']
plt.figure(figsize=(8, 8))
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', startangle=90)
plt.title('饼图')
plt.show()
import matplotlib.pyplot as plt
import numpy as np
# 子图
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 第一个子图
axes[0, 0].plot([1, 2, 3], [1, 4, 9])
axes[0, 0].set_title('折线图')
# 第二个子图
axes[0, 1].bar([1, 2, 3], [1, 4, 9])
axes[0, 1].set_title('柱状图')
# 第三个子图
axes[1, 0].scatter([1, 2, 3], [1, 4, 9])
axes[1, 0].set_title('散点图')
# 第四个子图
axes[1, 1].hist(np.random.randn(100), bins=20)
axes[1, 1].set_title('直方图')
plt.tight_layout()
plt.show()
# 箱线图
data = [np.random.normal(0, std, 100) for std in range(1, 4)]
plt.figure(figsize=(10, 6))
plt.boxplot(data, labels=['A', 'B', 'C'])
plt.title('箱线图')
plt.show()
# 热力图
data = np.random.rand(10, 10)
plt.figure(figsize=(10, 8))
plt.imshow(data, cmap='hot', interpolation='nearest')
plt.colorbar()
plt.title('热力图')
plt.show()
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False# 用来正常显示负号
# 设置风格
plt.style.use('seaborn-v0_8') # 使用seaborn风格
# 自定义颜色
colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7']
# 创建精美图形
fig, ax = plt.subplots(figsize=(12, 8))
x = np.linspace(0, 10, 100)
for i, color in enumerate(colors):
y = np.sin(x + i * 0.5) * (i + 1)
ax.plot(x, y, color=color, linewidth=2, label=f'Line {i+1}')
ax.set_title('精美图形示例', fontsize=20, fontweight='bold')
ax.set_xlabel('X轴', fontsize=14)
ax.set_ylabel('Y轴', fontsize=14)
ax.legend(fontsize=12)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 加载示例数据集
tips = sns.load_dataset('tips')
# 散点图
plt.figure(figsize=(10, 6))
sns.scatterplot(data=tips, x='total_bill', y='tip', hue='time', size='size')
plt.title('账单与小费关系')
plt.show()
# 线图
plt.figure(figsize=(10, 6))
sns.lineplot(data=tips, x='total_bill', y='tip', hue='day')
plt.title('账单与小费趋势')
plt.show()
# 柱状图
plt.figure(figsize=(10, 6))
sns.barplot(data=tips, x='day', y='total_bill', hue='sex')
plt.title('每日账单统计')
plt.show()
# 箱线图
plt.figure(figsize=(10, 6))
sns.boxplot(data=tips, x='day', y='total_bill', hue='time')
plt.title('每日账单分布')
plt.show()
# 小提琴图
plt.figure(figsize=(10, 6))
sns.violinplot(data=tips, x='day', y='total_bill', hue='sex', split=True)
plt.title('每日账单分布')
plt.show()
import seaborn as sns
import matplotlib.pyplot as plt
# 直方图
plt.figure(figsize=(10, 6))
sns.histplot(data=tips, x='total_bill', bins=30, kde=True)
plt.title('账单分布')
plt.show()
# 核密度图
plt.figure(figsize=(10, 6))
sns.kdeplot(data=tips, x='total_bill', hue='time', fill=True)
plt.title('账单核密度分布')
plt.show()
# 联合图
plt.figure(figsize=(10, 8))
sns.jointplot(data=tips, x='total_bill', y='tip', kind='hex')
plt.show()
# 配对图
sns.pairplot(tips, hue='time', vars=['total_bill', 'tip', 'size'])
plt.show()
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# 相关系数热力图
corr_matrix = tips[['total_bill', 'tip', 'size']].corr()
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('相关系数热力图')
plt.show()
# 透视表热力图
pivot_table = tips.pivot_table(values='total_bill', index='day', columns='time', aggfunc='mean')
plt.figure(figsize=(8, 6))
sns.heatmap(pivot_table, annot=True, fmt='.1f', cmap='YlOrRd')
plt.title('每日账单热力图')
plt.show()
from scipy import stats
import numpy as np
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 描述性统计
desc = stats.describe(data)
print(f'样本数量: {desc.nobs}')
print(f'最小值: {desc.minmax[0]}')
print(f'最大值: {desc.minmax[1]}')
print(f'均值: {desc.mean}')
print(f'方差: {desc.variance}')
print(f'偏度: {desc.skewness}')
print(f'峰度: {desc.kurtosis}')
from scipy import stats
import numpy as np
# 单样本t检验
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
t_stat, p_value = stats.ttest_1samp(data, 5)
print(f't统计量: {t_stat}, p值: {p_value}')
# 双样本t检验
group1 = np.array([1, 2, 3, 4, 5])
group2 = np.array([6, 7, 8, 9, 10])
t_stat, p_value = stats.ttest_ind(group1, group2)
print(f't统计量: {t_stat}, p值: {p_value}')
# 卡方检验
observed = np.array([[10, 20], [30, 40]])
chi2, p_value, dof, expected = stats.chi2_contingency(observed)
print(f'卡方统计量: {chi2}, p值: {p_value}')
# 正态性检验
data = np.random.normal(0, 1, 100)
stat, p_value = stats.shapiro(data)
print(f'Shapiro-Wilk检验 p值: {p_value}')
# 方差齐性检验
group1 = np.random.normal(0, 1, 100)
group2 = np.random.normal(0, 1, 100)
stat, p_value = stats.levene(group1, group2)
print(f'Levene检验 p值: {p_value}')
from scipy import stats
import numpy as np
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])
# 皮尔逊相关系数
corr, p_value = stats.pearsonr(x, y)
print(f'皮尔逊相关系数: {corr}, p值: {p_value}')
# 斯皮尔曼相关系数
corr, p_value = stats.spearmanr(x, y)
print(f'斯皮尔曼相关系数: {corr}, p值: {p_value}')
# 肯德尔相关系数
corr, p_value = stats.kendalltau(x, y)
print(f'肯德尔相关系数: {corr}, p值: {p_value}')
from scipy import stats
import numpy as np
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])
# 线性回归
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
print(f'斜率: {slope}')
print(f'截距: {intercept}')
print(f'R²: {r_value**2}')
print(f'p值: {p_value}')
# 预测
y_pred = slope * x + intercept
print(f'预测值: {y_pred}')
import pandas as pd
# 创建时间序列
dates = pd.date_range('2023-01-01', periods=100, freq='D')
ts = pd.Series(np.random.randn(100), index=dates)
# 重采样
monthly = ts.resample('M').mean() # 按月重采样
weekly = ts.resample('W').sum() # 按周重采样
# 滚动计算
rolling_mean = ts.rolling(window=7).mean() # 7天滚动均值
rolling_std = ts.rolling(window=7).std() # 7天滚动标准差
# 差分
diff = ts.diff()
# 百分比变化
pct_change = ts.pct_change()
import pandas as pd
# 创建示例数据
df = pd.DataFrame({
'text': ['Hello World', 'Python Programming', 'Data Analysis']
})
# 字符串方法
df['text_lower'] = df['text'].str.lower()
df['text_upper'] = df['text'].str.upper()
df['text_len'] = df['text'].str.len()
df['text_words'] = df['text'].str.split()
# 正则表达式
df['text_clean'] = df['text'].str.replace(r'[^\w\s]', '', regex=True)
# 提取信息
df['first_word'] = df['text'].str.split().str[0]
# 包含检查
df['contains_python'] = df['text'].str.contains('Python', case=False)
import pandas as pd
import numpy as np
# 创建含缺失值的数据
df = pd.DataFrame({
'A': [1, 2, np.nan, 4, 5],
'B': [np.nan, 2, 3, np.nan, 5],
'C': [1, 2, 3, 4, 5]
})
# 插值填充
df_interpolated = df.interpolate(method='linear')
# 前向填充
df_ffill = df.fillna(method='ffill')
# 后向填充
df_bfill = df.fillna(method='bfill')
# 使用KNN填充
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=2)
df_knn = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 创建销售数据
sales_data = pd.DataFrame({
'Month': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
'Sales': [1200, 1500, 1800, 1600, 2000, 2200],
'Profit': [300, 400, 500, 450, 600, 700]
})
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 创建组合图形
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 折线图
axes[0, 0].plot(sales_data['Month'], sales_data['Sales'], marker='o', linewidth=2)
axes[0, 0].set_title('月度销售额趋势')
axes[0, 0].set_ylabel('销售额')
axes[0, 0].grid(True, alpha=0.3)
# 柱状图
axes[0, 1].bar(sales_data['Month'], sales_data['Profit'], color='green')
axes[0, 1].set_title('月度利润')
axes[0, 1].set_ylabel('利润')
# 散点图
axes[1, 0].scatter(sales_data['Sales'], sales_data['Profit'], s=100, alpha=0.6)
axes[1, 0].set_title('销售额与利润关系')
axes[1, 0].set_xlabel('销售额')
axes[1, 0].set_ylabel('利润')
# 饼图
axes[1, 1].pie(sales_data['Sales'], labels=sales_data['Month'], autopct='%1.1f%%')
axes[1, 1].set_title('各月销售占比')
plt.tight_layout()
plt.show()
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 创建用户行为数据
user_data = pd.DataFrame({
'User_ID': range(1, 101),
'Age': np.random.randint(18, 65, 100),
'Purchase_Amount': np.random.exponential(100, 100),
'Visit_Count': np.random.poisson(10, 100),
'Category': np.random.choice(['Electronics', 'Clothing', 'Food', 'Books'], 100)
})
# 用户年龄分布
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
sns.histplot(data=user_data, x='Age', bins=20, kde=True)
plt.title('用户年龄分布')
plt.subplot(1, 2, 2)
sns.boxplot(data=user_data, x='Category', y='Purchase_Amount')
plt.title('各类别消费金额分布')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# 相关性热力图
plt.figure(figsize=(8, 6))
corr = user_data[['Age', 'Purchase_Amount', 'Visit_Count']].corr()
sns.heatmap(corr, annot=True, cmap='coolwarm', center=0)
plt.title('变量相关性热力图')
plt.show()
作为Python数据分析工程师,掌握这些指令是核心技能:
掌握这些工具,你就能从数据中提取有价值的洞察。
关注我,获取更多Python技术干货!