一、文件的读取和写入
1. 文件读取
pandas 读取excel是比直接用python方便点。
要用xlrd和xlwt读写excel,还要下载安装xlrd和xlwt这两个库。
readbook = xlrd.open_workbook()
parse_dates 表示需要转化为时间的列:pd.read_csv(‘data/my_csv.csv’, parse_dates=[‘col5’])。觉得这个可能会很有用,可以规范格式,后期如果按时间进行排序,统计可能会方便不少。
2. 数据写入
我记得R语言写入默认不写索引的,python这个就不太方便,也可能是索引有更重要的意义。
二、基本数据结构
1. Series
pandas可以自定义索引,而不是默认为数字序号,感觉这个就类似于字典了
2. DataFrame
感觉比array强的地方是可以自定义索引
三、常用基本函数
1. 汇总函数
head, tail,info, describe对于快速预览表格很有帮助
2. 特征统计函数
需要注意的是:axis ,默认为0代表逐列聚合,如果设置为1则表示逐行聚合
3. 唯一值函数
value_counts 可以得到唯一值和其对应出现的频数,在统计的时候会很有帮助。
drop_duplicates可以去掉列组合的重复值,在sql里还要用group函数分组才行
4. 替换函数
replace 一种特殊的方向替换,指定 method 参数为 ffill 向前替换和 bfill向后替换就比较有意思。
where和mas是相对的两个函数,其实只用一个函数就可以实现所有功能
clip的用觉得可能是:先用clip截取固定范围的数据,再用别的函数把其他不在这个范围被调整为两个边界值的数据一次性去掉。
5. 排序函数
用sort_value的多级排序还是比较方便的的,比sql的group by好用
6. apply方法
麻烦,还是尽量用内置的函数
四、窗口对象
滑动窗口 rolling 、扩张窗口 expanding 以及指数加权窗口 ewm。
刚看到这部分很疑惑什么是窗口,后来发现其实窗口这个名字很形象。滑动窗口就像一个固定宽度的窗口左右滑动,来框选不同的值。
1. 滑窗对象
pct_change可以用来计算同比增长率
2. 扩张窗口
练习
Exe1
df = pd.read_csv('data/pokemon.csv')
(df[['HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed']].sum(1)!=df['Total']).mean()
0.0
a.
dp_dup = df.drop_duplicates('#', keep='first')
dp_dup['Type 1'].nunique()
18
dp_dup['Type 1'].value_counts().index[:3]
Index(['Water', 'Normal', 'Grass'], dtype='object')
b.
attr_dup = dp_dup.drop_duplicates(['Type 1', 'Type 2'])
attr_dup.shape[0]
143
c.
[i+' '+j for i in df['Type 1'].unique() for j in (df['Type 1'].unique().tolist() + [''])]
L_part = [i+' '+j for i, j in zip(df['Type 1'], df['Type 2'].replace(np.nan, ''))]
res = set(L_full).difference(set(L_part))
a.
df['Attack'].mask(df['Attack']>120, 'high').mask(df['Attack']<50, 'low').mask((50<=df['Attack'])&(df['Attack']<=120), 'mid').head()
0 low
1 mid
2 mid
3 mid
4 mid
Name: Attack, dtype: object
b.
df['Type 1'].replace({i:str.upper(i) for i in df['Type 1'].unique()}).head()
0 GRASS
1 GRASS
2 GRASS
3 GRASS
4 FIRE
Name: Type 1, dtype: object
df['Type 1'].apply(lambda x:str.upper(x)).head()
0 GRASS
1 GRASS
2 GRASS
3 GRASS
4 FIRE
Name: Type 1, dtype: object
c.
df['Deviation'] = df[['HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed']].apply(lambda x:np.max((x-x.median()).abs()), 1)
In [44]: df.sort_values('Deviation', ascending=False).head()
# Name Type 1 Type 2 Total HP Attack Defense Sp. Atk Sp. Def Speed Deviation
230 213 Shuckle Bug Rock 505 20 10 230 10 230 5 215.0
121 113 Chansey Normal NaN 450 250 5 5 35 105 50 207.5
261 242 Blissey Normal NaN 540 255 10 10 75 135 55 190.0
333 306 AggronMega Aggron Steel NaN 630 70 140 230 60 80 50 155.0
224 208 SteelixMega Steelix Steel Ground 610 75 125 230 55 95 30 145.0
Ex2
np.random.seed(0)
s = pd.Series(np.random.randint(-1,2,30).cumsum())
s.ewm(alpha=0.2).mean().head()
0 -1.000000
1 -1.000000
2 -1.409836
3 -1.609756
4 -1.725845
dtype: float64
def ewm_func(x, alpha=0.2):win = (1-alpha)**np.arange(x.shape[0])[::-1]res = (win*x).sum()/win.sum()return res
s.expanding().apply(ewm_func).head()
0 -1.000000
1 -1.000000
2 -1.409836
3 -1.609756
4 -1.725845
dtype: float64
总结
都是需要记忆的知识,记住就好,后期应该多研究研究如何灵活运用这些基础操作。