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 返回最大值或最小值的索引

    df.idxmax()
    df.idxmin()

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中,行和列表示原来的索引

    unstack()
    stack() #逆运算

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

@张亢亢Andrew