前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pandas三百题

Pandas三百题

作者头像
SingYi
发布2022-07-13 20:22:07
4.8K0
发布2022-07-13 20:22:07
举报
文章被收录于专栏:Lan小站

2 - pandas 个性化显示设置

1.显示全部列

pd.set_option('display.max_columns',None)

2.显示指定行/列

指定让 data 在预览时显示10列,7行 pd.set_option('display.max_cols',10) pd.set_option('display.max_rows',7)

3.还原行/列显示数

还原上面的显示设置 pd.reset_option("max_rows") pd.reset_option("max_columns")

4 修改每列最大字符宽度

即每列最多显示的字符长度,例如【每列最多显示10个字符,多余的会变成...】 pd.set_option('display.max_colwidth',10)

5 修改小数点精度

修改默认显示精度为小数点后5位 pd.set_option('precision',5)

6 还原所有显示设置

还原上面的全部显示设置 pd.reset_option('^display')

3-数据预览与预处理

数据查看

1 查看数据维度

先看看数据有多少行、多少列 df.shape

2 随机查看5条数据

df.sample(5)

3 查看数据前后5行

df.head() df.tail()

4-查看数据基本信息

看看数据类型,有误缺失值什么的 df.info()

5-查看数据统计信息|数值

查看数值型列的统计信息,计数,均值 df.describe().round(2).T

6-查看数据统计信息|离散

查看离散型列的统计信息,计数,频率 df.describe(include=['O'])

7-查看数据统计信息|整体

df.describe(include='all')

缺失值处理

8-计算缺失值|总计

先看看一共存在多少个缺失值 df.isnull().sum().sum()

9-计算缺失值|分列

具体每列有多少缺失值 df.isnull().sum()

10-查看缺失值

查看全部缺失值所在的行 df[df.isnull().T.any()==True]

11-高亮缺失值

df[df.isnull().T.any()==True].style.highlight_null(null_color='skyblue')

12-删除缺失值

缺失值出现的行全部删掉 df.dropna(how='any')

13-缺失值补全|整体填充

将全部缺失值替换为* df.fillna('*')

14-缺失值补全|向上填充

将评分列的缺失值,替换为上一个电影的评分 df['评分'] = df['评分'].fillna(method='ffill')

15-缺失值补全|整体均值填充

将评价人数列的缺失值,用整列的均值进行填充 df['评价人数'] = df['评价人数'].fillna(df['评价人数'].mean())

16-缺失值补全|上下均值填充

将评价人数列的缺失值,用整列的均值进行填充 df['评价人数'] = df['评价人数'].fillna(df['评价人数'].interpolate())

17-缺失值补全|匹配填充

现在填充 “语言” 列的缺失值,要求根据 “国家/地区” 列的值进行填充 例如 《海上钢琴师》国家/地区为 意大利,根据其他意大利国家对应的语言来看,应填充为 意大利语 df['语言']=df.groupby('国家/地区').语言.bfill()

重复值处理

18-查找重复值

df[df.duplicated()]

19-查找重复值|指定

查找 片名 列全部重复值 df[df['片名'].duplicated()]

20-删除重复值

删除全部的重复值 df.drop_duplicates()

21-删除重复值|指定

删除全部的重复值,但保留最后一次出现的值 df.drop_duplicates(keep='last')

4-数据统计描述性分析

数据探索

1-查看数据

查看数据前十行 df.head(10)

2-修改索引

数据已经安装降序排列,让学校当索引会更好 df.set_index(['学校'])

3-查看数据量

查看数据的行*列,总共单元格的数量 df.size

4-数据排序

按照总分升序排列,并展示前20个 df.sort_values(['总分']).head(20)

5-数据排序

将数据按照高端人才得分降序排序,展示前10位 df.sort_values(['高端人才得分'],ascending=False).head(10)

6-分列排名

查看各项得分最高的学校名称 df.iloc[:,3:].idxmax()

7-统计信息|均值

df['总分'].mean()

8-统计信息|中位数

df['总分'].median()

9-统计信息|众数

df['总分'].mode()

10-统计信息|部分

计算总分,高端人才得分,办学层次得分的最大最小值、中位数、均值 方法1: df.describe()[['总分','高端人才得分','办学层次得分']].T[['max','min','50%','mean']] 方法2: df.agg({"总分":["min", "max", "median", "mean"],"高端人才得分":["min", "max", "median", "mean"],"办学层次得分":["min", "max", "median", "mean"]})

11-统计信息|完整

查看数值型数据的统计信息(均值,分位数),并保留两位小数 df.describe().round(2).T

12-统计信息|分组

计算各省市总分均值 df.groupby('省市').agg({'总分':'mean'})

13-统计信息|相关系数

相关系数矩阵,也就是每两列之间的相关性系数 df.corr()

14-相关系数|热力图

代码语言:javascript
复制
### 方法一 ###

df.corr().style.background_gradient(cmap='coolwarm').set_precision(2)

### 方法二 ###

借助 `matplotlib` 和 `seaborn` 

其中中文设置可以参考我的这篇文章 https://mp.weixin.qq.com/s/WKOGvQP-6QUAP00ZXjhweg

import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize = (9,6),dpi=100)
sns.set(font='Songti SC')
sns.heatmap(df.corr().round(2),annot=True,cmap='RdBu')
plt.show()

15-统计信息|频率

计算各省市出现的次数 df['省市'].values_count()

16-统计信息|热力地图

代码语言:javascript
复制
from pyecharts import options as opts
from pyecharts.charts import Map
list1 = list(pd.DataFrame(df.省市.value_counts()).index)
list2 = list(pd.DataFrame(df.省市.value_counts()).省市)

c = (
    Map()
    .add('', [list(z) for z in zip(list1,list2)], "china",is_map_symbol_show=False)
    .set_global_opts(
        title_opts=opts.TitleOpts(title="排名前100高校各省市占比"),
        visualmap_opts=opts.VisualMapOpts(max_=20),
       

    )
)
c.render_notebook()

17-统计信息|直方图

import seaborn as sns sns.set(font='Songti SC') sns.distplot(df['总分'])

5-数据筛选与修改

5-1数据修改

1-数据修改|列名

将原 df 列名 Unnamed: 2、Unnamed: 3、Unnamed: 4 修改为 金牌数、银牌数、铜牌数 df.rename(columns={'Unnamed: 2':'金牌数','Unnamed': 3':'银牌数','Unnamed: 4':'铜牌数')

2-数据修改|行索引

将第一列(排名)设置为索引 df.set_index(['排名'])

3-数据修改|修改索引名

修改索引名为 金牌排名 df.rename_axis('金牌排名')

4-数据修改|修改值

将 ROC(第一列第五行)修改为 俄奥委会 df.iloc[4,1] = '俄奥委会' df.loc[5,['国家奥委会']] = '俄奥委会'

5-数据修改|替换值(单值)

将金牌数字的数字0替换为无 df['金牌数'].replace(0,'无')

6-数据修改|替换值(多值)

  • 将无替换为缺失值
  • 将0替换为None

df.replace(['无,0],[np.nan,"None"])

7-数据查看

查看各列数据类型 df.dtypes

8-数据修改|修改类型

金牌数列类型修改为int df['金牌数'].fillna('0').astype('int')

9-数据增加|新增列(固定值)

新增一列比赛地点值为东京 df['比赛地点'] = '东京'

10-数据增加|新增列(计算值)

新增一列金银牌总数列,值为该国家金银牌总数 df['金银牌总数'] = df['金牌数'] + df['银牌数'] + df['铜牌数']

11-数据增加|新增列(比较值)

新增一列 最多奖牌数量列,值为该国 金、银、铜 牌数量中最多的一个奖牌数量 例如美国银牌最多,则为41,中国为38 df['最多奖牌数量'] = df[["金牌数", "银牌数",'铜牌数']].replace('None',0).fillna(0).max(axis=1)

12-数据增加|新增列(判断值)

新增一列 金牌大于30 如果一个国家的金牌数大于 30 则值为 是,反之为否 df['金牌大于30'] = df['金牌数'].apply(lambda x : '是' if x >30 else '否') df['金牌大于30'] = np.where(df['金牌数']>30,'是','否')

13-数据增加|增加多列

新增两列,分别是

  • 金铜牌总数(金牌数+铜牌数)
  • 银铜牌总数(银牌数+铜牌数)

df.assign(金铜牌数量=df.金牌数+df.铜牌数,银铜牌总数=df.银牌数+df.铜牌数)

14-数据增加|新增列(引用变量)

新增一列金牌占比为各国金牌数除以总金牌数(gold_sum) gold_sum = df['金牌数'].sum() df['金牌数'].apply(lambda x : str(round(x/gold_sum*100,2))+'%')

df.eval(f'金牌占比 = 金牌数 / {gold_sum}')

15-数据增加|新增行(末尾追加)

在df末尾追加一行,内容为0,1,2,3...一直到df列的长度 df1 = pd.DataFrame([[i for i in range(len(df.columns))]], columns=df.columns) df_new = df.append(df1)

16-数据增加|新增行(指定位置)

在第2行新增一行数据,即美国和中国之间。

代码语言:javascript
复制
df1 = df.iloc[:1,:]
df2 = df.iloc[1:,:]
df3 = pd.DataFrame([[i for i in range(len(df.columns))]],columns=df.columns)
df_new = pd.concat([df1,df3,df2],ignore_index=True)

17-数据删除|删除行

删除df第一行 dr.drop(1)

18-数据删除|删除行(条件)

df.drop(df[df.金牌数<20].index)

19-数据删除|删除列

df.drop(columns=['比赛地点'])

20-数据删除|删除列(按列号)

删除df的7,8,9,10列 df.drop(df.columns[[7,8,9,10]],axis=1)

5-2数据筛选

21-筛选列|通过行号

提取第1,2,3,4列 df.iloc[:,[1,2,3,4]]

22-筛选列|通过列名

提取 金牌数、银牌数、铜牌数 三列 df[['金牌数','银牌数','铜牌数']]

23-筛选列|条件(列号)

df.iloc[:,[i%2==1 for i in df.shape[1]]]

24-筛选列|条件(列名)

df.iloc[:,df.columns.str.endswith('数')]

25-筛选列|组合(行号+列名)

df.loc[10:20,'总分':]

26-筛选行|通过行号

提取第10行 df.loc[9:9]

27-筛选行|通过行号(多行)

提取第10行之后的全部行 df.loc[9:]

28-筛选行|固定间隔

提取0-50行,间隔为3 df.loc[0:50:3]

30-筛选行|判断(大于)

提取金牌数大于30的行 df[df['金牌数']>30]

31-筛选行|判断(等于)

提取金牌数等于10的行 df[df['金牌数']==10]

32-筛选行|判断(不等于)

提取金牌数不等于10的行 df[df['金牌数']!=10]

33-筛选行|条件(指定行号)

提取全部奇数行 df[[i%2==1 for i in range(len(df.index))]]

34-筛选行|条件(指定值)

提取中国、美国、英国、巴西、日本五行数据 df[df['国家奥委会'].isin(['中国','美国','英国','日本','巴西'])]

35-筛选行|多条件

在上一题的条件下,新增一个条件:金牌数小于30 df[(df['国家奥委会'].isin(['中国','美国','英国','日本','巴西']))&(df['金牌数']<30)

36 -筛选行|条件(包含指定值)

提取 国家奥委会 列中,所有包含国的行 df[df['国家奥委会'].str.contains('国')]

37-筛选某行某列

提取第0行第2列 df.iloc[0:1,[1]]

38-筛选多行多列

提取 第 0-2 行第 0-2 列 df.iloc[0:2,0:2]

39-筛选值|组合(行号+列号)

提取第 4 行,第 4 列的值 df.iloc[3,3]

40 - 筛选值|组合(行号+列名)

提取行索引为 4 ,列名为 金牌数 的值 df.at[4,'金牌数']

41 - 筛选值|条件

提取 国家奥委会 为 中国 的金牌数 df.loc[df['国家奥委会']=='中国']['金牌数']

42 - 筛选值 | query

使用query提取金牌数+银牌数 大于 15的国家 df.query('金牌数+银牌数 > 15')

43 - 筛选值|query(引用变量)

使用 query 提取 金牌数 大于 金牌均值的国家 gold_mean = df['金牌数'].mean() df.query(f'金牌数 > {gold_mean}')

6-数据分组与聚合

分组

1 - 分组统计|均值

计算各区(district)的薪资(salary)均值 df.groupby(['district']).agg({'salary':'mean'}) df[['district','salary']].groupby(by='district').mean() df.groupby("district")['salary'].mean()

2 - 分组统计|取消索引

重新按照上一题要求进行分组,但不使用 district 做为索引 df.groupby("district", as_index=False)['salary'].mean()

3 - 分组统计|排序

计算并提取平均薪资最高的区

df[['district','salary']].groupby(by='district').mean().sort_values(['salary'],ascending=False).head(1) df[['district','salary']].groupby(by='district').mean().sort_values('salary',ascending=False).head(1)

4 - 分组统计|频率

计算不同行政区(district),不同规模公司(companySize)出现的次数 df.groupby(['district','companySize']).size()

5 - 分组统计|修改索引名 将上一题的索引名修改为

  • district -> 行政区
  • companySize -> 公司规模

pd.DataFrame(df.groupby("district")['companySize'].value_counts()).rename_axis(["行政区", "公司规模"])

6 - 分组统计|计数

计算上一题,每个区出现的公司数量 df.groupby('district')['companySize'].count()

7 - 分组查看|全部

将数据按照 district、salary 进行分组,并查看各分组内容 df.groupby(['district','salary']).groups

8 - 分组查看|指定

将数据按照 district、salary 进行分组,并查看西湖区薪资为 30000 的工作 df.groupby(['district','salary']).get_group(('西湖区',30000))

9 - 分组规则|通过匿名函数1

根据 createTime 列,计算每天不同 行政区 新增的岗位数量 df.groupby([df.createTime.apply(lambda x:x.day)])['district'].value_counts().rename_axis(['发布日','行政区'])

10 - 分组规则|通过匿名函数2

计算各行政区的企业领域(industryField)包含电商的总数 df.groupby('district',sort=False)["industryField"].apply(lambda x:x.str.contains('电商').sum())

11 - 分组规则|通过内置函数

通过 positionName 的长度进行分组,并计算不同长度岗位名称的薪资均值 df.set_index('positionName').groupby(len)['salary'].mean()

12 - 分组规则|通过字典 将 score 和 matchScore 的和记为总分,与 salary 列同时进行分组,并查看结果 df.groupby({'salary':'薪资','score':'总分','matchScore':'总分'},axis=1).sum()

13 - 分组规则|通过多列

计算不同 工作年限(workYear)和 学历(education)之间的薪资均值 pd.DataFrame(df.groupby(['workYear','education'])['salary'].mean()).rename_axis(['工作年限','教育'])

14 - 分组转换| transform 在原数据框 df 新增一列,数值为该区的平均薪资水平 df['平均薪资'] = df[['district','salary']].groupby(by='district').transform('mean')

15 - 分组过滤|filter

提取平均工资小于 30000 的行政区的全部数据 df.groupby('district').filter(lambda x:x['salary'].mean()<30000)

16 - 分组可视化

对杭州市各区公司数量进行分组,并使用柱状图进行可视化

代码语言:javascript
复制
import matplotlib.pyplot as plt
data = df.groupby('district').count()['positionName']
data.plot(kind='bar',figsize=(20, 12), color='#5172F0', fontsize=12)
plt.xlabel('杭州市各区',fontsize=14)
plt.ylabel('公司数量',fontsize=14)
plt.show()

6-2聚合

17 - 聚合统计

分组计算不同行政区,薪水的最小值、最大值和平均值 df.groupby('district')['salary'].describe()[['min','max','mean']]

df.groupby('district')['salary'].agg([min, max, np.mean])

19 - 聚合统计|组合

对不同岗位(positionName)进行分组,并统计其薪水(salary)中位数和得分(score)均值 df.groupby('positionName').agg({'salary': 'median', 'score': 'mean'})

20 -聚合统计|多层 对不同行政区进行分组,并统计薪水的均值、中位数、方差,以及得分的均值 df.groupby('district').agg({'salary': [np.mean, np.median, np.std], 'score': np.mean})

21 - 聚合统计|自定义函数

在 18 题基础上,在聚合计算时新增一列计算最大值与平均值的差值

代码语言:javascript
复制
def myfunc(x):

    return x.max()-x.mean()

df.groupby('district').agg(最低工资=('salary', 'min'), 最高工资=(
    'salary', 'max'), 平均工资=('salary', 'mean'), 最大值与均值差值=('salary', myfunc)).rename_axis(["行政区"])

7-数据透视与合并

数据透视表

1 - 加载数据

读取当前目录下 "某超市销售数据.csv" 并设置千分位符号为 , pd.read_csv('某超市销售数据.csv',thousands=',')

2 - 数据透视|默认

制作各省「平均销售额」的数据透视表 pd.pivot_table(df,values=['销售额'],index='省/自治区']

3 - 数据透视|指定方法

制作各省「销售总额」的数据透视表 pd.pivot_table(df,values=['销售额'],index='省/自治区',aggfunc=sum)

4 - 数据透视|多方法

制作各省「销售总额」与「平均销售额」的数据透视表 pd.pivot_table(df,values=['销售额'],index='省/自治区',aggfunc=['mean','sum']

5 - 数据透视|多指标

制作各省市「销售总额」与「利润总额」的数据透视表 pd.pivot_table(df,values=['销售额','利润'],index='省/自治区',aggfunc=['sum'])

6 - 数据透视|多索引 制作「各省市」与「不同类别」产品「销售总额」的数据透视表 pd.pivot_table(df,values=['销售额'],index=['省/自治区','类别'],aggfunc=['sum'])

7 - 数据透视|多层

制作各省市「不同类别」产品的「销售总额」透视表 pd.pivot_table(df,values=['销售额'],index=['省/自治区'],columns='类别',aggfunc='sum')

8 - 数据透视|综合

制作「各省市」、「不同类别」产品「销售量与销售额」的「均值与总和」的数据透视表,并在最后追加一行『合计』 pd.pivot_table(df,values = ['销售额','数量'],index = ['省/自治区','类别'],aggfunc = ['mean',sum],margins=True)

9 - 数据透视|筛选 在上一题的基础上,查询 「类别」 等于 「办公用品」 的详情 ​

10 -数据透视|逆透视

逆透视就是将宽的表转换为长的表,例如将第 5 题的透视表进行逆透视,其中不需要转换的列为『数量』列 pd.pivot_table(df,values = ['销售额','利润','数量'],index = '类别',aggfunc = sum).melt(id_vars=['数量'],var_name='分类',value_name='金额')

数据合并

代码语言:javascript
复制
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 1, 2, 3])
 
 
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                    'B': ['B4', 'B5', 'B6', 'B7'],
                    'C': ['C4', 'C5', 'C6', 'C7'],
                    'D': ['D4', 'D5', 'D6', 'D7']},
                   index=[4, 5, 6, 7])
 
 
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
                    'B': ['B8', 'B9', 'B10', 'B11'],
                    'C': ['C8', 'C9', 'C10', 'C11'],
                    'D': ['D8', 'D9', 'D10', 'D11']},
                   index=[8, 9, 10, 11])
 
 
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                   index=[2, 3, 6, 7])

11 - concat|默认拼接

拼接 df1 和 df2 pd.concat([df1,df2])

12 - concat|拼接多个

垂直拼接 df1、df2、df3,效果如下图所示 pd.concat([df1,df2,df3])

13 - concat|重置索引 垂直拼接 df1 和 df4,并按顺序重新生成索引, pd.concat([df1, df4], ignore_index=True)

14 - concat|横向拼接 横向拼接 df1、df4,效果如下图所示 pd.concat([df1,df4],axis=1)

15 - concat|横向拼接(取交集)

在上一题的基础上,只取结果的交集 pd.concat([df1,df4],axis=1,join='inner')

16 - concat|横向拼接(取指定) 在 14 题基础上,只取包含 df1 索引的部分 pd.concat([df1, df4], axis=1).reindex(df1.index)

17 - concat|新增索引 拼接 df1、df2、df3,同时新增一个索引(x、y、z)来区分不同的表数据来源 pd.concat([df1,df2,df3],keys=['x','y','z'])

merge - 数据连接

18 - merge|按单键

根据 key 连接 left 和 right

代码语言:javascript
复制
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                     'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})

pd.merge(left,right,on='key')

19 - merge|按多键

根据 key1 和 key2 连接 left 和 right

代码语言:javascript
复制
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                     'key2': ['K0', 'K1', 'K0', 'K1'],
                     'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']})


right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})
pd.merge(left, right, on=['key1', 'key2'])

20 - merge|左外连接

如下图所示的结果连接 left 和 right,保留左表全部键

pd.merge(left,right,how='left')

21 - merge|右外连接

如下图所示的结果连接 left 和 right,保留右表全部键

pd.merge(left,right,how='right', on=['key1', 'key2'])

22 -merge|全外连接

如下图所示的结果连接 left 和 right,保留全部键

pd.merge(left,right,how='outer', on=['key1', 'key2'])

23 -merge|内连接 如下图所示的结果连接 left 和 right,保留交集

pd.merge(left,right,how='inner', on=['key1', 'key2'])

24 - merge|重复索引 重新产生数据并按下图所示进行连接

pd.merge(left, right, on='k', suffixes=['_l', '_r'])

join - 组合

25 - join|左对齐

合并 left 和 right,并按照 left 的索引进行对齐

left.join(right)

26 -join|左对齐(外连接) 按下图所示进行连接 思考:merge 做法

left.join(right,how='outer')

27 - join|左对齐(内连接)

按下图所示进行连接

left.join(right,how='inner')

28 -join|按索引

重新产生数据并按下图所示进行连接(根据 key)

left.join(right,on='key')

29 - join|按索引(多个)

重新产生数据并按下图所示进行连接(根据 key1 和 key2)

left.join(right,on=['key1','key2'])

8-金融数据与时间处理

8-1pandas中的时间操作

1-时间生成|当前时间

使用pandas获取当前时间 pd.Timestamp('now')

Timestamp('2021-12-15 11:32:16.625393')

2-时间生成|指定范围

使用pandas按天生成2021年1月1日至2021年9月1日的全部日期 pd.date_range('1/1/2021','9/11/2021')

DatetimeIndex(['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-06', '2021-01-07', '2021-01-08', '2021-01-09', '2021-01-10', ... '2021-09-02', '2021-09-03', '2021-09-04', '2021-09-05', '2021-09-06', '2021-09-07', '2021-09-08', '2021-09-09', '2021-09-10', '2021-09-11'], dtype='datetime64[ns]', length=254, freq='D')

3-时间生成|指定长度

使用pandas从2021年1月1日开始,按天生成10天日期 pd.date_range('2021-01-01',periods=10)

DatetimeIndex(['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-06', '2021-01-07', '2021-01-08', '2021-01-09', '2021-01-10'], dtype='datetime64[ns]', freq='D')

股票数据分析

11 - 查看数据类型 查看 df1 各列的数据类型 df1.info()

12 - 时间类型转换

将 df1 和 df2 的 日期 列转换为 pandas 支持的时间格式 df1['日期'] = pd.to_datetime(df1['日期']) df2['时间'] = pd.to_datetime(df2['时间'])

13 - 日期筛选|区间

筛选出 df2 时间在 2021-08-03 09:35:00 与 2021-08-04 15:00:00 之间的数据 df2[(df2['时间']> '2021-08-03 09:35:00') & (df2['时间']< '2021-08-04 15:00:00' )]

14 - 日期筛选|指定

筛选 df2 时间为 2021-08-03 的全部数据 df2.set_index('时间').truncate(after=pd.Timestamp('2021-08-04'))

15 - 金融计算|涨跌额

df1 新增一列 涨跌,计算前后两日收盘价之差 注意:虽然我们的df1包含涨跌额列,但是这个操作很常用,所以练习一下 df1.收盘.diff()

16 - 金融计算|涨跌幅

df1 新增一列 涨跌变化率,计算前后两日收盘价之差的变化率 注意:虽然我们的df1包含涨跌幅列,但是这个操作很常用,所以练习一下,结果可以用于验证 df1['涨跌变化率'] = (df1.收盘.pct_change()).apply(lambda x: format(x, '.2%'))

17 - 金融计算|移动均值

计算收盘价的5日移动均线 df1.收盘.rolling(window=5).mean()

18 - 金融计算|移动均值(可视化)

计算并绘制收盘价的5日移动均线 df1.收盘.rolling(window=5).mean().plot()

19 - 金融计算|移动均值(可视化)

同时计算并绘制 df1 的收盘价、5日均线、20日均线

代码语言:javascript
复制
df1.set_index("日期")['收盘'].rolling(window=5).mean().plot()
df1.set_index("日期")['收盘'].rolling(window=20).mean().plot()
df1.set_index("日期")['收盘'].plot()

20 - 金融计算|指数移动平均值(EMA)

根据 df1 计算 EMA20 df1['EMA20'] = df1['收盘'].ewm(span=20,min_periods=0,adjust=False,ignore_na=False).mean()

21 - 金融计算|MACD

计算 df1 的 MACD 指标

代码语言:javascript
复制
exp1 = df1['收盘'].ewm(span=12, adjust=False).mean()
exp2 = df1['收盘'].ewm(span=26, adjust=False).mean()
df1['MACD'] = exp1 - exp2
df1['Signal line'] = df1['MACD'].ewm(span=9, adjust=False).mean()

22 - 金融计算|布林指标 计算并绘制布林指标,计算方法参考百度百科

代码语言:javascript
复制
df1['former 30 days rolling Close mean'] = df1['收盘'].rolling(20).mean()
df1['upper bound'] = df1['former 30 days rolling Close mean'] + \
    2*df1['收盘'].rolling(20).std()  # 在这里我们取20天内的标准差
df1['lower bound'] = df1['former 30 days rolling Close mean'] - \
    2*df1['收盘'].rolling(20).std()

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Songti SC'] #设置中文,如果本句代码导致失效,可以点击https://mp.weixin.qq.com/s/WKOGvQP-6QUAP00ZXjhweg

df1.set_index("日期")[['收盘', 'former 30 days rolling Close mean','upper bound','lower bound' ]].plot(figsize=(16, 6))

plt.show()

23 - 日期移动|值 将 df1 的索引设置为日期,将 df1 数据向后移动一天 df1.set_index(['日期']).shift(1)

25 - 日期重采样|日 -> 周 按周对 df1 进行重采样,保留每周最后一个数据 df1.set_index('日期').resample('W').last()

26 - 日期重采样|日 -> 月

按月对 df1 进行重采样,保留每月最后一个数据 df1.set_index('日期').resample('M').last()

27 - 日期重采样|分钟 -> 日

按日对 df2 进行重采样,保留每天最后一个数据 df2.set_index('时间').resample('D').last()

28 - 日期重采样|低频 -> 高频 将 df2 的 5分钟 数据改为 3分钟,缺失数据向前填充 df_3min = df2.set_index('时间').resample('3min').last() df_3min.ffill()

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2 - pandas 个性化显示设置
    • 1.显示全部列
      • 2.显示指定行/列
        • 3.还原行/列显示数
          • 4 修改每列最大字符宽度
            • 5 修改小数点精度
              • 6 还原所有显示设置
              • 3-数据预览与预处理
                • 数据查看
                  • 1 查看数据维度
                  • 2 随机查看5条数据
                  • 3 查看数据前后5行
                  • 4-查看数据基本信息
                  • 5-查看数据统计信息|数值
                  • 6-查看数据统计信息|离散
                  • 7-查看数据统计信息|整体
                • 缺失值处理
                  • 8-计算缺失值|总计
                  • 9-计算缺失值|分列
                  • 10-查看缺失值
                  • 11-高亮缺失值
                  • 12-删除缺失值
                  • 13-缺失值补全|整体填充
                  • 14-缺失值补全|向上填充
                  • 15-缺失值补全|整体均值填充
                  • 16-缺失值补全|上下均值填充
                  • 17-缺失值补全|匹配填充
                • 重复值处理
                  • 18-查找重复值
                  • 19-查找重复值|指定
                  • 20-删除重复值
                  • 21-删除重复值|指定
              • 4-数据统计描述性分析
                • 数据探索
                  • 1-查看数据
                  • 2-修改索引
                  • 3-查看数据量
                  • 4-数据排序
                  • 5-数据排序
                  • 6-分列排名
                  • 7-统计信息|均值
                  • 8-统计信息|中位数
                  • 9-统计信息|众数
                  • 10-统计信息|部分
                  • 11-统计信息|完整
                  • 12-统计信息|分组
                  • 13-统计信息|相关系数
                  • 14-相关系数|热力图
                  • 15-统计信息|频率
                  • 16-统计信息|热力地图
                  • 17-统计信息|直方图
              • 5-数据筛选与修改
                • 5-1数据修改
                  • 1-数据修改|列名
                  • 2-数据修改|行索引
                  • 3-数据修改|修改索引名
                  • 4-数据修改|修改值
                  • 5-数据修改|替换值(单值)
                  • 6-数据修改|替换值(多值)
                  • 7-数据查看
                  • 8-数据修改|修改类型
                  • 9-数据增加|新增列(固定值)
                  • 10-数据增加|新增列(计算值)
                  • 11-数据增加|新增列(比较值)
                  • 12-数据增加|新增列(判断值)
                  • 13-数据增加|增加多列
                  • 14-数据增加|新增列(引用变量)
                  • 15-数据增加|新增行(末尾追加)
                  • 16-数据增加|新增行(指定位置)
                  • 17-数据删除|删除行
                  • 18-数据删除|删除行(条件)
                  • 19-数据删除|删除列
                  • 20-数据删除|删除列(按列号)
                • 5-2数据筛选
                  • 21-筛选列|通过行号
                  • 22-筛选列|通过列名
                  • 23-筛选列|条件(列号)
                  • 24-筛选列|条件(列名)
                  • 25-筛选列|组合(行号+列名)
                  • 26-筛选行|通过行号
                  • 27-筛选行|通过行号(多行)
                  • 28-筛选行|固定间隔
                  • 30-筛选行|判断(大于)
                  • 31-筛选行|判断(等于)
                  • 32-筛选行|判断(不等于)
                  • 33-筛选行|条件(指定行号)
                  • 34-筛选行|条件(指定值)
                  • 35-筛选行|多条件
                  • 36 -筛选行|条件(包含指定值)
                  • 37-筛选某行某列
                  • 38-筛选多行多列
                  • 39-筛选值|组合(行号+列号)
                  • 40 - 筛选值|组合(行号+列名)
                  • 41 - 筛选值|条件
                  • 42 - 筛选值 | query
                  • 43 - 筛选值|query(引用变量)
              • 6-数据分组与聚合
                • 分组
                  • 1 - 分组统计|均值
                  • 2 - 分组统计|取消索引
                  • 3 - 分组统计|排序
                  • 4 - 分组统计|频率
                  • 6 - 分组统计|计数
                  • 7 - 分组查看|全部
                  • 8 - 分组查看|指定
                  • 9 - 分组规则|通过匿名函数1
                  • 10 - 分组规则|通过匿名函数2
                  • 11 - 分组规则|通过内置函数
                  • 13 - 分组规则|通过多列
                  • 15 - 分组过滤|filter
                  • 16 - 分组可视化
                • 6-2聚合
                  • 17 - 聚合统计
                  • 19 - 聚合统计|组合
                  • 21 - 聚合统计|自定义函数
              • 7-数据透视与合并
                • 数据透视表
                  • 1 - 加载数据
                  • 2 - 数据透视|默认
                  • 3 - 数据透视|指定方法
                  • 4 - 数据透视|多方法
                  • 5 - 数据透视|多指标
                  • 7 - 数据透视|多层
                  • 8 - 数据透视|综合
                  • 10 -数据透视|逆透视
                • 数据合并
                  • 11 - concat|默认拼接
                  • 12 - concat|拼接多个
                  • 15 - concat|横向拼接(取交集)
                • merge - 数据连接
                  • 18 - merge|按单键
                  • 19 - merge|按多键
                  • 20 - merge|左外连接
                  • 21 - merge|右外连接
                  • 22 -merge|全外连接
                • join - 组合
                  • 25 - join|左对齐
                  • 27 - join|左对齐(内连接)
                  • 28 -join|按索引
                  • 29 - join|按索引(多个)
              • 8-金融数据与时间处理
                • 8-1pandas中的时间操作
                  • 1-时间生成|当前时间
                  • 2-时间生成|指定范围
                  • 3-时间生成|指定长度
                • 股票数据分析
                  • 12 - 时间类型转换
                  • 13 - 日期筛选|区间
                  • 14 - 日期筛选|指定
                  • 15 - 金融计算|涨跌额
                  • 16 - 金融计算|涨跌幅
                  • 17 - 金融计算|移动均值
                  • 18 - 金融计算|移动均值(可视化)
                  • 19 - 金融计算|移动均值(可视化)
                  • 20 - 金融计算|指数移动平均值(EMA)
                  • 21 - 金融计算|MACD
                  • 26 - 日期重采样|日 -> 月
                  • 27 - 日期重采样|分钟 -> 日
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档