栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

在国社科中的学习Module1:借助Pandas进行数据分析

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在国社科中的学习Module1:借助Pandas进行数据分析

在开篇之前先说一下哦,本章节笔记主要参考的教材是《Python量化金融编程从入门到精通》

一、Series类型数据

1.关于Series类型数据的基本认知:Series可以看作是一个一维数组,只不过它相比普通的一维数组多了数据的标签,比数组的实用性更强;

2.Series对象的创建

(1)Series是一个类,所有我们需要通过Series的构造函数来创建它的实例化对象

(2)方法一:通过传入数据的index属性和value属性,来创建Series对象;同时在创建Series对象时,也可以不指定数据的index属性,这样得到的Series序列的index属性就是默认的0到n-1

import pandas as pd
sr = pd.Series(data = [3700, 3705, 3710, 3715, 3710],
               index = ['11/01', '11/02', '11/03', '11/04', '11/05'])
print(sr)

(3) 方法二:通过传入字典的方式,来创建Series对象;同时在创建Series对象时,还可以通过Series对象及其索引的name属性,来对其name进行赋值

import pandas as pd
dict = {'11/01':3700, '11/02': 3705, '11/03':3710, '11/04':3715, '11/05':3710}
sr = pd.Series(data=dict)
sr.name = 'prices'
sr.index.name = 'date'

3. 通过sr.values属性来访问Series对象中数据的值,通过sr.index.values来访问Series对象索引的值(总结Series对象的常见属性有index属性、values属性以及name属性)

print(sr.values)
print(sr.index.values)

4. Series对象的索引与切片

(1)利用数值位置进行Series对象的索引与切片,在进行切片时数值位置的指定满足差一行为

  (2) 利用标签进行Series对象的索引与切片,在进行切片时利用标签进行位置指定时无需满足差一行为

  (3) 通过传入布尔表达式对Series对象进行索引或切片

import pandas as pd
sr = pd.Series(data = [3700, 3705, 3710, 3715, 3710],
               index = ['11/01', '11/02', '11/03', '11/04', '11/05'])
print(sr[1])
print(sr['11/02']
print(sr[:3])
print(sr['11/01':'11/03']
print(sr[sr>=3710])

5.Series对象的常用操作

(1)利用函数diff()进行差分操作,并且diff()函数默认的差分是一阶的,如果想得到高阶差分,需要指定参数periods的值

import pandas as pd
sr = pd.Series(data = [3700, 3705, 3710, 3715, 3710],
               index = ['11/01', '11/02', '11/03', '11/04', '11/05'])
print(sr.diff(2))

(2) 利用函数append()进行拼接操作

import pandas as pd
sr1 = pd.Series(data = [3700, 3705, 3710, 3715, 3710],
               index = ['11/01', '11/02', '11/03', '11/04', '11/05'])
sr2 = pd.Series(data = [3715, 3715, 3720, 3715, 3725],
                index = ['11/06', '11/07', '11/08', '11/09', '11/10']
result = sr1 . append(sr2)
print(result)

(3) 利用函数drop()指定要删除数据索引标签的方式来进行删除数据的操作:对于有索引标签的Series来说,传入函数的参数就是指定的索引标签,如果没有索引标签,则以默认的数值索引进行删除操作;如果想同时删除多个数据,则向函数传递索引标签列表即可。

import pandas as pd
sr = pd.Series(data = [3700, 3705, 3710, 3715, 3710],
               index = ['11/01', '11/02', '11/03', '11/04', '11/05'])
result = sr.drop(['11/01', '11/02'])

二、Dataframe类型数据

1.关于Dataframe类型数据的基本认知:Dataframe数据是Pandas的另一个数据结构,可以将其看作是一个二维数组,既具有行索引也具有列索引

2.Dataframe对象的创建

(1)同Series一样,Dataframe在Pandas中也是一个类,在创建Dataframe实例化对象时也需要用到其对应的构造函数

(2)方法一:通过传入数据的value属性、行索引index参数,以及列索引columns参数的方式来创建Dataframe对象

import pandas as pd
ohlc_data = [[16.45, 16.48, 16.31, 16.41], [16.30, 16.30, 15.70, 15.85],
             [15.75, 15.87, 15.63, 15.86], [15.89, 15.92, 15.55, 15.59]]
date_index = ['2019-11-19', '2019-11-20', '2019-11-21', '2019-11-22']
ohlc_columns = ['Open', 'High', 'Low', 'Close']
df = pd.Dataframe(data=ohlc_data, index=date_index, columns=ohlc_columns)
print(df)

(3)方法二:通过传入字典的方式,来创建Dataframe对象,其中字典的键就是Dataframe对象的列索引,值就是Dataframe对象这列的数据;但是通过传入字典的方式,创建的Dataframe其行索引被默认为数值,可以利用Set_index()函数来是指其中某列为行索引

import pandas as pd
dict = {'date':['2019-11-19', '2019-11-20', '2019-11-21', '2019-11-22'],
        'open':[16.45, 16.30, 15.75, 15.89],
        'high':[16.48, 16.30, 15.87, 15.92],
        'low':[16.31, 15.70, 15.63, 15.55],
        'close':[16.41, 15.85, 15.86, 15.86]}
df = pd.Dataframe(data=dict)
df = df.set_index('date')
print(df)

(4)方法三:通过传入列表的方式,来创建Dataframe对象具体代码见“可视化操作”;

3.利用values属性访问Dateframe对象的属性:访问列索引的值,访问行索引的值,访问数据的值

print(df.values)
print(df.index.values)
print(df.columns.values)

4.Dataframe对象的索引与切片

(1)方法一:通过方括号“[  ]"的方式来索引某行或某列,注意该种方法若直接使用时,只能实现对列的索引,若要实现对行的索引必须采取赋值的形式

(2)方法二:在指定了Dataframe的行和列的索引标签时,可使用loc方法进行索引或切片;

         具体操作:在loc后面加上一个方括号“[  ]”,括号内第一个参数表示行的索引,通过它可以指定某行或多行;第二个参数表示列的索引,通过它可以指定某列或多列;通过指定索引标签的形式进行切片时,不用满足差一行为

import pandas as pd
ohlc_data = [[16.45, 16.48, 16.31, 16.41], [16.30, 16.30, 15.70, 15.85],
             [15.75, 15.87, 15.63, 15.86], [15.89, 15.92, 15.55, 15.59]]
date_index = ['2019-11-19', '2019-11-20', '2019-11-21', '2019-11-22']
ohlc_columns = ['Open', 'High', 'Low', 'Close']
df = pd.Dataframe(data=ohlc_data, index=date_index, columns=ohlc_columns)
# 索引某列
print(df['Open']
# 索引某行
print(df[df.index=='2019-11-19'])
# 通过loc的方法进行索引
print(df.loc['2019-11-19'])
print(df.loc['2019-11-19', 'Close'])
print(df.loc['2019-11-19':'2019-11-21']
print(df.loc['2019-11-19':'2019-11-21', ['High', 'Low']])
print(df..loc[:,'Close'])

(3)方法三:在未指定Dataframe对象中的行和列标签时,也就是默认的数值索引时,通过iloc的方法进行索引或者切片操作;通过指定数值标签的形式进行切片时,需要满足差一行为

import pandas as pd
ohlc_data = [[16.45, 16.48, 16.31, 16.41], [16.30, 16.30, 15.70, 15.85],
             [15.75, 15.87, 15.63, 15.86], [15.89, 15.92, 15.55, 15.59]]
df = pd.Dataframe(data=ohlc_data)
print(df.iloc[0])
print(df.iloc[0,3])
print(df.iloc[0:3])
print(df.iloc[0:3,[1,2]])
print(df.iloc[:,3])

三、Dataframe对象的常用操作

1.利用groupby()函数进行分组操作:

(1) 通过Dataframe对象的groupby()方法进行分组操作之后,结果是一个DataframeGroupBy对象,因为结果并不是一个Dataframe或者一个Series对象,这便意味着之前Dataframe或者Series对象中的一系列方法和函数无法使用了,但是DataframeGroupBy对象中也同样有很多函数和方法可以用于对每组数据的分析,这也是Dataframe对象和Series对象无法实现的

(2) 通过get_group()的方法可以中DataframeGroupBy对象中取出每组数据,且返回的对象是Dataframe的数据类型

import pandas as pd
dict = {'date':['2019-10-10', '2019-10-11', '2019-10-14', '2019-10-10', '2019-10-11', '2019-10-14'],
        'id': ['rb1910', 'rb1910', 'rb1910', 'rb1911', 'rb1911', 'rb1911'],
        'close':[3585, 3603, 3645, 3534, 3503, 3500],
        'vol': [32640, 8040, 10320, 164, 10, 314],}
df = pd.Dataframe(data=dict)
grouped_df = df.groupby('id')
print(grouped_df.size())
print(grouped_df.mean())
print(grouped_df.count())
print(grouped_df.max())
print(grouped_df.min())
df_1 = grouped_df.get_group('r1910')

2.通过函数to_csv()将Dataframe对象导出成为CSV格式;

(1)利用函数to_csv()时,需要向其传入一个文件名,它会默认在代码文件所在目录下创建该文件;

(2)通过函数to_csv()进行文件导出时,将会默认导出了Dataframe的行索引,若不希望导出行索引,则可在to_csv()函数中指定相关参数

import pandas as pd
dict = {'date':['2019-10-10', '2019-10-11', '2019-10-14', '2019-10-10', '2019-10-11', '2019-10-14'],
        'id': ['rb1910', 'rb1910', 'rb1910', 'rb1911', 'rb1911', 'rb1911'],
        'close':[3585, 3603, 3645, 3534, 3503, 3500],
        'vol': [32640, 8040, 10320, 164, 10, 314],}
df = pd.Dataframe(data=dict)
df.to_csv('data.csv', index=None)

3. 利用plot()和show()方法对Dataframe对象进行可视化操作;plot()函数有很多参数可以用于设置图像的样式

参数说明
kind绘制图像的样式,有line(折线)、bar(柱状)、hist(直方)、box(箱线)、pie(饼图)等
figsize图像的大小,传入一个元祖(宽度、高度)
use_index是否使用索引作为刻度的标签,默认是True
title图像的标题
legend是否显示图例,默认是True
fontsize字体的大小,int类型
xticksx轴刻度标签
yticksy轴刻度标签
grid图像背景是否加网格,默认是False
import pandas as pd
import matplotlib.pyplot as plt
data = [{'date': '11-22', 'close': 3655.0, 'vol': 3398450},
        {'date': '11-25', 'close': 3697.0, 'vol': 4167718},
        {'date': '11-26', 'close': 3611.0, 'vol': 3850800},
        {'date': '11-27', 'close': 3596.0, 'vol': 3012176},
        {'date': '11-28', 'close': 3618.0, 'vol': 3804958},]
df = pd.Dataframe(data=data)
# 调用plot()方法
df['close'].plot()
df['vol'].plot(kind='bar')
# 显示图像
plt.show()

4.统计运算操作

Dataframe对象中还有很多用于统计运算操作的方法,通过它们可以很方便地对数据进行统计分析

方法名称说明
describe汇总统计
min,max求最小值和最大值
median求中位数
var求方差
std求标准差
argmin,argmax求最小值和最大值的索引位置
count求样本数量
cumsum求累积和
cummin,cummax求累积和的最小值和最大值
skew求偏度值
kurt求峰度值
import pandas as pd
data = [{'date': '11-22', 'close': 3655.0, 'vol': 3398450},
        {'date': '11-25', 'close': 3697.0, 'vol': 4167718},
        {'date': '11-26', 'close': 3611.0, 'vol': 3850800},
        {'date': '11-27', 'close': 3596.0, 'vol': 3012176},
        {'date': '11-28', 'close': 3618.0, 'vol': 3804958},]
df = pd.Dataframe(data=data)
print(df.describe())
print(df.mean())

四、Pandas中常用函数的使用

1.利用read_csv()函数进行文件读取的操作

(1)传入一个文件路径参数,默认是以当前代码所在目录作为根目录

(2)通过参数usecols可以指定读取哪几列的数据

(3)通过参数header可以指定数据中的某一行开始作为列名;(可以具体看书121页,可以对该属性的运用有更为深刻的认识)

         这里再对header属性的内容进行一些补充:header属性用于指定列名所在的行数,在本来就具有列名的数据中,header默认是None;而如果没有列名,header就是0,也就是默认文件第一行作为列名

(4)通过参数name可以对列名进行设置

(5)通过调用方法head()可以指定输出前几列

#利用header属性和name属性对有列名的数据重新设置列名
df = pd.read_csv('000001_Daily_2006_2018.csv', usecols=[0, 1, 2, 3, 4], header=0, 
        names=['Date', 'Open_price', 'High_price', 'Low_price', 'Close_price])
print(df.head(5))

2.缺失数据的处理

(1)利用isnull(  )的方法或者notnull(  )的方法对缺失值进行判断:有两种表达形式

import pandas as pd
import numpy as np
dict = {'date': ['2019-11-19', '2019-11-20', '2019-11-21', '2019-11-22'],
        'open': [16.45, 16.30, np.nan, 15.89],
        'High': [16.48, 16.30, 15.87, 15.92],
        'Low': [16.31, np.nan, 15.63, 15.55],
        'Close': [16.41, 15.85, 15.86, 15.59]}
df = pd.Dataframe(data=dict)
# isnull()表达形式一
print(pd.isnull(df))
# isnull()表达形式二
print(df.isnull())

# notnull()表达形式一
print(pd.notnull(df))
# notnull()表达形式二
print(df.notnull())

(2)利用方法dropna()删除缺失数据所在行或者列:

【1】axis参数用于指定删除缺失数据所在行或者列,默认axis=0,表示删除所在行数据,若想删除所在列数据,向axis=1即可

【2】how参数可以实现根据数据的缺失程度进行删除,默认how=’any‘,意味着某行或者某列中只要存在缺失数据就在该行或者该列删除;也可将how=’all‘,意味着在某行或者某列中全部都为缺失值的情况下才将该列或者该行删除

import pandas as pd
import numpy as np
dict = {'date': ['2019-11-19', '2019-11-20', '2019-11-21', '2019-11-22'],
        'open': [16.45, 16.30, np.nan, 15.89],
        'High': [16.48, 16.30, 15.87, 15.92],
        'Low': [16.31, np.nan, 15.63, 15.55],
        'Close': [16.41, 15.85, 15.86, 15.59]}
df = pd.Dataframe(data=dict)
# 缺失数据所在列,只有全是缺失数据时才将该列删除
print(df.dropna(how='all', axis=1)

(3)利用方法fillna()对缺失数据进行填充

【1】默认参数value,将缺失数据填充为指定的值

【2】参数method,有两个取值一个是ffill,一个是bfill,分别表示以缺失值前面和后面的值进行填充;同时搭配参数axis,可以指定是以纵向的数据(axis=0)还是以横向的数据(axis=1)进行填充(注意参数value和参数method不能同时存在)

【3】通过索引的方式,可以对Dataframe的某列进行填充

import pandas as pd
import numpy as np
dict = {'date': ['2019-11-19', '2019-11-20', '2019-11-21', '2019-11-22'],
        'open': [16.45, 16.30, np.nan, 15.89],
        'High': [16.48, 16.30, 15.87, 15.92],
        'Low': [16.31, np.nan, 15.63, 15.55],
        'Close': [16.41, 15.85, 15.86, 15.59]}
df = pd.Dataframe(data=dict)
# 将缺失值填充为15.00
df = df.fillna(15.00)
# 以纵向上面的值来填充缺失值
df = df.fillna(method='ffill', axis=0)
# 以横向后面的值来填充缺失值
df = df.fillna(method='bfill', axis=1)
# 以Open列的均值来填充open列的缺失值
df['Open'] = df['Open'].fillna(df['Open'].mean())

3.数据的拼接操作

(1)利用方法concat()实现对Dataframe对象的行或者列拼接,行拼接默认参数axis=0,列拼接设定参数axis=1;除此之外,还需要向concat()传递一个序列,这个序列中的每个元素代表着要被拼接的对象

import pandas as pd

df_1 = pd.read_csv('rb_data1_csv')
df_2 = pd.read_csv('rb_data2_csv')
# 实现列拼接
result = pd.concat([df_1, df_2], axis=1)

(2) 利用方法append()实现行拼接,该种拼接方法需要设定一个参数ignore_index=True

import pandas as pd

df_1 = pd.read_csv('rb_data1_csv')
df_2 = pd.read_csv('rb_data2_csv')
# 实现行拼接
result = df_1.append(df_2, ignore_index=True)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/323916.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号