DataAnalysis 读书笔记
import pandas as pd;
import numpy as np;
from pandas import Series, DataFrame;
from numpy.random import randn;
from scipy import stats as stats;
import matplotlib.pyplot as plt;
import seaborn as sns;
logstart
0 更改数据类型
astype(float) #change
x.atype # check
int('str')
str(int)
string.atof(s) # 转换成浮点数
1 设置小数点位数(格式化字符串)
%x '%.2f%' #两位小数
x.applymap(format)
2 排序
obj.sort_values(axis=0, ascending=False, by=[])
obj.order() #缺失值会放在末尾
3 排名
obj.rank(method='first|max|average', ascending=False, axis=1)
#axis=1 表示按行计算,0为按列,默认是0
#DataFrame里面相反1为列0为行
4 Series & DataFrame 选择数据
df = DataFrame(data, index=[], columns=[])
#Series是DataFrame的子集
Series: obj['a']
DataFrame:
obj.ix['a']
obj.ix[行, 列] #[:, 0] 指选取第一列全部数据
obj.ix[10: 20, ['echo', 'echo5', 'echo10']]
#列选择
df['book']
#行选择
df[1:3]
#只选一个数据
df.loc['', '']
df.at['', '']
#选择特定index和columns的数据
origin_data.loc['Agg Origin', 'echo5']
#选择多个列
origin_data = origin_data.ix[:, ['ear', 'ear5', 'ear10', 'ear15', 'ear20', 'echo', 'turn', 'turn5', 'turn10', 'turn15']]
#选择特定的行
indi_syl_df[indi_syl_df['emitter']=='L']['number']
#选择特定的行,多个条件选择
tran_df_transition = tran_df.loc[(tran_df['population'] == pl) & (tran_df['level'] == level)]['transition']
#插入新列
df['new'] = pd.Series(np.random.randn(10), index=df.index)
#删除列或行
data_origin_between.drop(['echo_ln'], axis=1, inplace=True)#列
data_origin_between.drop(['echo10_ln'], axis=0, inplace=True)#行
删除行或列
div class="codehilite"> seq_all_df.drop(seq_all_df.index[ind], inplace=True)
5 创建空值
np.nan
df.mean(axis=1, skipna=False) #不跳过空值,默认跳过
6 返回最大值或最小值的索引
7 唯一值(去重)
obj.unique()
obj.value_counts() #计算各值出现的频率 #默认降序排列
obj.isin() #是否在集合中,或是其子集,可用于选取子集
obj.isnull() #空值
obj.fillna({1: 0, 3: -1}) #用空值填充 #可以在不同列填充不同的值
obj.dropna(how='all', thresh=3) #过滤掉空值 #all表示全部为空才会过滤掉 #默认为行 #3表示全部都不为空
8 将multiindex(多重索引)重新安排到一个DataFrame中,行和列表示原来的索引
9 使用已有的列作为索引
frame.set_index(['',''], drop=False) #多个列也可以 #原有的列也可以不删除
frame.reset_index() #功能相反,将索引变成列
seq_all_df.reset_index(drop=True)#重设索引,并丢掉原来的索引
10 windows下的type命令等于UNIX下的cat命令
11 读取数据
pd.read_csv('filepath', skiprows=[1,2,3], na_values=['NULL'], nrows=5, chunksize=10)
#跳过某些行
#填充缺失值
#只读取前5行
#逐块读取,每10行读取一次
12 写入数据
data.to_csv('filepath', sep='|', na_rep='NULL', index|header=False)
#设定分隔符
#空字符串标记值
#不输出行和列的标签
with open('filepath', 'w') as f
writer = csv.writer(f, dialect='|')
writer.writerow(('A', 'B', 'C'))
var_writer = pd.ExcelWriter('filrpath')
var_df.to_excel(var_writer, 'Sheet1')
var_writer.save()
13 JSON
import json
json.loads()
json.dumps() #obj->json
14 读写其他格式
XML、HDDF、HTML、EXCEL、Web Api
xls_file = pd.ExcelFile('data.xls')
frame = xls_file.parse('Sheet1') #data -> DataFrame
15 数据库
SQLite 、SQL Server、PostgreSQL、MySQL、MongoDB
16 合并数据集
pandas.merge(df1, df2, on='id') #类似SQL数据库的连接操作 #也可以多键名连接on=['a', 'x']
#默认用共有的列名连接,也可以指定
pandas.merge(df1, df2, left_on='id', right_on='ID')
#也可以分别指定要连接的列名
pd.merge(df1, df2, how='outer|inner|left|right')
#默认取交集,其他数据会舍去,可设置取并集,或以左右某侧为主合并
pd.merge(left, right, on='id', suffixes=('_left', '_right'))
#若两个表存在同名键值,合并时可以加后缀以区分
pd.merge(left, right, left_on='id', right_index=True)
#左侧用键名,右侧用索引名
left.join(right, on='id') #另一种合并方式
pandas.concat([S1, S2, S3], axis=1, join='inner', keys=['a', 'b'])
# 3个Series #按列 #取交集 #为结果添加层次化索引
17 合并重叠数据
np.where(pd.isnull(), a, b) #if true a else b
S1.combine_first(S2) #另一个方式,可自动排序
18 长格式旋转为宽格式
pivoted = ldata.pivot('date', 'item', 'value')
#转换为DataFrame格式了
19 去除重复的行
data.duplicates()
data.drop_duplicates(['k1', 'k2'], take_last=True)
#保留最后一个出现的,默认是保留第一个
20 替换值
data.replace(origin, new) # 传入列表或字典也可以
df.replace({1: 'a', 2: 'b'}, inplace=True) #在原表中修改
data.rename(index={'': ''}, columns={'': ''}) #更改列名或行名,重命名
21 离散化和面元划分
pd.cut()
pd.qcut() #按四分位数进行切割
np.sign() #返回一个有1和-1组成的数组,表示原始值的符号
22 随机重排
np.random.permutation() #可以进行随机采样
df.take(np.random.permutation(len(df))[:3])
np.random.randint()
23 字符串操作
string.split(',')
str1+str2
val.index(':')
val.find(';')
val.count("a")
val.replace('|', '/')
data.str.contains('gmail') #处理矢量化字符串,可以跳过NA值
24 正则表达式
import re
regex = re.compile('\s+') #自己写正则 #提取字符串
r'C:\x' #转义的两种方式
'C:\\x'
regex.search(text) #返回找到的第一个
regex.findall(text) #返回全部
regex.match(text) #返回找到第一个的开头部分
regex.sub('new', text) #将匹配到的替换为指定的字符串
25 matplotlib
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(2, 2, 1|2|3|4)
plt.plot([1.5, 3.5, -2, 1.6]) #折线图
fig, axes = plt.subplots(2, 3)
axes[0, 0].scatter() #paint on the first figure
#调整间距
subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
#设置X轴刻度及名称
ticks = ax.set_xticks([0, 250, 500, 750, 1000])
labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'], rotation=30, fontsize='small')
ax.set_xlabel('stage')
#添加图例
ax.plot(randn(1000).cumsum(), 'k--', label='book|_nolegend_') #可以不添加图例
ax.legend(loc='best')
#注解
ax.text(x, y, 'hello world!') #xy表示添加位置的坐标
SEABORN作图
df = DataFrame(data)
#线图
import seaborn as sns
26 Series.plot 参数
#柱状图
df = DataFrame(data, index=[], columns=[], name='')
df.plot(kind='bar', stacked=True, alpha=0.5) #stacked:堆积
#直方图
df.hist(bins=50)
#密度图
#在直方图的基础上
df.plot(kind='kde', style="k--")
#散点图
plt.scatter(trans_data['m1'], trans_data['unemp'])
plt.title('')
pd.scatter_matrix(trans_data, diagonal='kde', c='b', alpha=0.3)
#两两矩阵作图
27 绘制地图
#basemap 工具集
#海岸线、国家、道路可以直接绘制,遍历数据点,依次绘制到地图上
28 统计相关的库
#统计推断的包
from scipy import stats as ss
#单样本T检验
ss.ttest_1samp(column|columns, popmean=100) #要统计的列或全部列,估计均值
#OUTPUT
(-1.1281738488299586, 0.26270472069109496) #统计量, 双侧尾概率值(P值)
#可视化模块
import matlibplot.pyplot as plt
df.plot(...)
#pandas模块中集成R的ggplot主题来美化图表
pd.options.display.mpl_style = 'default'
df.plot(...)
#seaborn模块,该模块是一个统计数据可视化库
import seaborn as sns
sns.boxplot(data, withs=0.5, color='default|pastel') #箱图
sns.violinplot(data, widths=o.5, color='default|pastel') #葫芦状箱图
sns.distplot(data, rug=True, bins=15) # 柱状图
with sns.axes_style('white'): #有密度曲线的热图
sns.jointplot(column1, column2, kind='kde')
sns.lmplot("column name 1", "column name 2", data) #有线性拟合的散点图
#调用R
from rpy2 improt robjects
r_dataFrame = com.convert_to_r_dataframe(df)
r = robjects.r
r.plot(r_df)
stats.normaltest()
stats.normaltest(list) # list 包含全部分组的数据
# 默认假设是符合正态分布的
# P>0.05 :符合正态分布
stats.levene()
stats.levene(list1, list2...) # 每个list属于一个分组
# 默认齐次,即该检测方法假设数据是齐次的
# P>0.05 :方差齐次,可以使用ANOVA,否则使用非参数检验方法(但是在SPSS里面,方差不齐也可以使用ANOVA,但要选择方差不齐的分析方法如Tamhane's T2等等)
stats.f_oneway(group1, group2, group3)
# 正态分布+方差齐次+样本独立
stats.kruskal(group1, group2, group3)
# Kruskal-Wallis H-test
# 样本不符合正态分布或方差不齐时,使用该方法
29 Miniconda3
conda create -n andrew python=3.10
conda env list
conda activate andrew
conda deactivate
conda remove -n andrew
conda install pandas
jupyter notebook --notebook-dir='d:/下载'
30 Vim
全部替换 :%s/abc/123/g
一个一个替换 :%s/abc/123/c
conda activate andrew