Python金融数据分析与挖掘实战3-5数据框、序列定义及数据处理应用在线实验闯关

本文详细介绍了使用PythonPandas库进行数据处理的多个关键步骤,包括构造数据框、从外部文件读取数据、逻辑索引与切片、groupby分组计算、数据框关联与合并,以及序列操作和数据切片。
摘要由CSDN通过智能技术生成

第1关序列和数据框

代码+解释

#********** Begin **********#

#完成以下任务

#1.导入pandas包

#2.定义列表L1、L2,元组T1、T2

#L1=[1,-2,2.3,'hq']

#L2=['kl','ht','as','km']

#T1=(1,8,8,9)

#T2=(2,4,7,'hp')

#3.构造数据框,默认索引,列名依次为a,b,c,d,返回计算结果A

#4.构造数据框,索引为a,b,c,d,列名为L1,L2,T1,T2,返回计算结果B

def return_values():  

    # 导入pandas库并为其设置别名pd  

import pandas as pd

    # 定义两个列表L1和L2  

    L1 = [1, -2, 2.3, 'hq']  # 列表L1包含不同类型的元素:整数、负整数、浮点数和字符串  

    L2 = ['kl', 'ht', 'as', 'km']  # 列表L2包含四个字符串元素  

    # 定义两个元组T1和T2  

    T1 = (1, 8, 8, 9)  # 元组T1包含四个整数元素  

    T2 = (2, 4, 7, 'hp')  # 元组T2包含三个整数和一个字符串元素  

    # 使用字典data来构造数据框A,其中字典的键作为列名,对应的列表/元组作为列的值  

data = {'a': L1, 'b': L2, 'c': T1, 'd': T2}      

# 使用pandas的DataFrame类来创建数据框A,这里使用默认索引  

    A = pd.DataFrame(data)  

    # 构造数据框B,它使用自定义的索引('a', 'b', 'c', 'd')  

    # 创建四个pandas Series对象,分别对应L1、L2、T1、T2,并使用自定义的索引  

    t1 = pd.Series(L1, index=['a', 'b', 'c', 'd'])  # 创建Series t1,索引为'a'到'd',值为L1中的元素  

    t2 = pd.Series(L2, index=['a', 'b', 'c', 'd'])  # 创建Series t2,索引为'a'到'd',值为L2中的元素  

    t3 = pd.Series(T1, index=['a', 'b', 'c', 'd'])  # 创建Series t3,索引为'a'到'd',值为T1中的元素  

    t4 = pd.Series(T2, index=['a', 'b', 'c', 'd'])  # 创建Series t4,索引为'a'到'd',值为T2中的元素  

    # 使用字典t来组合这四个Series对象,创建数据框B  

    t = {'L1': t1, 'L2': t2, 'T1': t3, 'T2': t4}  # 字典t的键作为列名,Series对象作为列的值  

    # 使用pandas的DataFrame类来创建数据框B,这里使用自定义索引  

    B = pd.DataFrame(t)  

# 返回构造好的数据框A和B     

return(A,B)  

#********** End **********#

第2关外部数据文件读取

代码+解释

#********** Begin **********#

#1.导入pandas包

#2.read_excel()函数读取“一、车次上车人数统计表.xlsx”中的数据,用一个数据框df1来存储,并输出第0行

#3.通过read_table()函数可以读取"txt1.txt"文件中的数据(不带表头),用一个数据框df2来表示,并输出第0行

#4.通过read_csv()函数读取用分块读取的方式读取“data.csv”文件,每次读取20000行,并输出每次读取的数据集行数

#5.输出格式为“第n次读取数据规模为:20000 /n (20000, 行数)”

#在函数中编写程序

def return_values():

    # 导入pandas库并为其设置别名pd  

import pandas as pd

# 使用pandas的read_excel函数读取Excel文件

df1 = pd.read_excel('一、车次上车人数统计表.xlsx')  

#使用pandas的read_table函数读取txt文件

df2 = pd.read_table('txt1.txt',header=None)  

# 使用pandas的read_csv函数,并通过chunksize参数设置分块大小

    reader = pd.read_csv('data.csv',chunksize=20000)  

    k=0;  

    names = locals()#设置全局变量  

    for i in reader:  

        k=k+1  

        names['A%s'%k]=pd.DataFrame(i)#创建A1~Ak个变量,分别保存各分块  

        print('第'+str(k)+'次读取数据规模为: ',len(i))  

        print(i.shape)

#********** End **********#

第3关逻辑索引、切片方法,groupby 分组计算函数应用

代码+解释

#********** Begin **********#

#本关任务:

#请读取地铁站点进出站客流数据表(Data.xlsx),表结构字段如下:

# 站点编号、日期、时刻、进站人数、出站人数

#完成以下任务:

#1)取出第0列,通过去重的方式获得地铁站点编号列表,记为code

#2)采用数据框中的groupby分组计算函数,统计出每个地铁站点每天的进站人数和出站人数,

#   计算结果采用一个数据框sat_num来表示,其中列标签依次为:站点编号、日期、进站人数和出站人数;

#3)计算出每个站点国庆节期间(10.1~10.7)的进站人数和出站人数,

#   计算结果用一个数据框sat_num2来表示,其中列标签依次为:A1_站点编号、A2_进站人数、A3_出站人数。

def return_values():

# 导入pandas包

import pandas as pd

# 读取Excel文件中的数据,并赋值给DataFrame A

A = pd.read_excel('Data.xlsx')

 # 获取'站点编号'列中唯一的站点编号列表,并赋值给code

code = list(A['站点编号'].unique())

# 使用groupby按'站点编号'和'日期'对数据进行分组,并计算每个组的'进站人数'和'出站人数'的总和

B = A.groupby(['站点编号','日期']).sum()

# 获取分组后的索引列表(包含站点编号和日期的元组),并赋值给c

 c = list(B.index)

# 初始化两个空列表A1和A2,用于存储站点编号和日期

A1 = []

A2 = []

# 遍历索引列表c,将站点编号和日期分别添加到A1和A2中

for i in range(len(c)):

r = c[i]

A1.append(r[0])

 A2.append(r[1])

 # 创建一个新的DataFrame sat_num,包含'A1_站点编号'、'A2_日期'、'A3_进站人数'和'A4_出站人数'列

sat_num = pd.DataFrame({'A1_站点编号': A1, 'A2_日期': A2, 'A3_进站人数': B['进站人数'].values, 'A4_出站人数': B['出站人数'].values})

# 使用iloc筛选sat_num中日期小于等于'2015-10-07'的行

D = sat_num.iloc[sat_num['A2_日期'].values <= '2015-10-07', :]

# 对筛选后的DataFrame D按'A1_站点编号'进行分组,并计算每个组的'A3_进站人数'和'A4_出站人数'的总和

D1 = D.groupby(['A1_站点编号']).sum()

# 创建一个新的DataFrame sat_num2,包含'A1_站点编号'、'A2_进站人数'和'A3_出站人数'列

sat_num2 = pd.DataFrame({'A1_站点编号': list(D1.index), 'A2_进站人数': D1['A3_进站人数'].values, 'A3_出站人数': D1['A4_出站人数'].values})

# 返回站点编号列表code、完整的DataFrame sat_num和国庆节期间的进出站人数统计DataFrame sat_num2

return (code, sat_num, sat_num2)

#********** End **********#

第4关:数据框关联操作

代码+解释

#********** Begin **********#

def  return_values():

# 导入pandas包

import pandas as pd

    # 定义两个字典 dict1 和 dict2

    dict1={'code':['A01','A01','A01','A02','A02','A02','A03','A03'],

           'month':['01','02','03','01','02','03','01','02'],

           'price':[10,12,13,15,17,20,10,9]}

    dict2={'code':['A01','A01','A01','A02','A02','A02'],

           'month':['01','02','03','01','02','03'],

           'vol':[10000,10110,20000,10002,12000,21000]}

    # 将两个字典转化为数据框;

    dict1 = pd.DataFrame(dict1)  

    dict2 = pd.DataFrame(dict2)        

# 对两个数据框完成内连接、左连接、右连接;

# 内连接:只返回两个DataFrame中都有的行

df_inner=pd.merge(dict1,dict2,how='inner',on=['code','month'])

# 左连接:返回左DataFrame(df1)的所有行,以及右DataFrame(df2)中匹配的行

df_left=pd.merge(dict1,dict2,how='left',on=['code','month'])  

# 右连接:返回右DataFrame(df2)的所有行,以及左DataFrame(df1)中匹配的行

df_right=pd.merge(dict1,dict2,how='right',on=['code','month'])

# 返回三个连接后的DataFrame

    return(df_inner,df_left,df_right)

#********** End **********#

第5关数据框合并操作

代码+解释

#********** Begin **********#

def  return_values():  

# 导入pandas包

import pandas as pd

    import numpy as np  

    # 定义三个字典dict1、dict2和dict3  

    dict1={'a':[2,2,'kt',6],'b':[4,6,7,8],'c':[6,5,np.nan,6]}  

    dict2={'d':[8,9,10,11],'e':['p',16,10,8]}  

    dict3={'a':[1,2],'b':[2,3],'c':[3,4],'d':[4,5],'e':[5,6]}  

    # 将三个字典转化为数据框df1、df2、df3;  

    df1 = pd.DataFrame(dict1)  

    df2 = pd.DataFrame(dict2)  

    df3 = pd.DataFrame(dict3)

    # df1和df2进行水平合并,合并后的数据框记为df4;  

    df4 = pd.concat([df1,df2],axis=1)

    # df3和df4垂直合并,并修改合并后的index为按默认顺序排列,修改合并后的数据框记为df5  

    df5 = pd.concat([df3,df4],axis=0)

    return(df4,df5)  

#********** End **********#

第6关序列

代码+解释

#********** Begin **********#

def return_values():  

    # 导入pandas包  

    import pandas as pd  

    # 定义列表L  

    L=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

    # 把列表L转化为序列S  

    S = pd.Series(L)

    # 针对S实现周期为10的移动求和、求平均值、求最大值、求最小值的计算  

    Sum  =  S.rolling(10).sum()  

    mean = S.rolling(10).mean()  

    max1 = S.rolling(10).max()  

    min1 = S.rolling(10).min()

    return(L,S,Sum)  

#********** End **********#

第7关数据框切片(iloc、loc)方法移动计算方法应用

代码+解释

#********** Begin **********#

#1、导入pdndas包

#2、读取地铁站点进出站客流数据表(Data.xlsx),字段依次为:

#   站点编号、日期、时刻、进站人数、出站人数

#3、采用索引(iloc)实现的方式,获取135站点

#   10月1日-10月2日早上9-11点3个时刻的进站客流量数据(取所有字段),记为A

#4、采用列标签(loc)实现方式,获取135站点

#   10月1日-10月2日早上9-11点3个时刻的进站客流量数据(取所有字段),记为B。

def return_values():  

    # 导入pandas包

    import pandas as pd  

    # 读取名为'Data.xlsx'的Excel文件到DataFrame read中   

    read = pd.read_excel('Data.xlsx')  

# 使用.loc方法根据'站点编号'列的值等于135来筛选DataFrame,得到zhandian     

zhandian = read.iloc[read['站点编号'].values==135,:]  

# 在zhandian DataFrame中,根据'日期'列的值小于'2015-10-03'来进一步筛选,得到riqi

riqi = zhandian.iloc[zhandian['日期'].values<'2015-10-03',:]  

# 在riqi DataFrame中,根据'时刻'列的值大于等于9来筛选,得到shike

shike = riqi.iloc[riqi['时刻'].values>=9,:]

# 在shike DataFrame中,根据'时刻'列的值小于等于11来筛选,得到shike1  

    shike1 = shike.iloc[shike['时刻'].values<=11,:]

    A1 = read['站点编号'].values==135  

    A2 = read['日期'].values<'2015-10-03'  

    A3 = read['时刻'].values>=9  

A4 = read['时刻'].values<=11

# 使用链式条件筛选,直接得到满足所有条件的DataFrame A  

    A = read.iloc[A1&A2&A3&A4,[0,1,2,3]]

    # 使用与A相同的条件,但这次使用.loc方法分步筛选,得到B

B = read.loc[A1&A2&A3&A4,:]

# 返回A和B两个DataFrame

    return(A,B)  

#********** End **********#

  • 19
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值