Python大数据财务分析 课件 2. 财务数据分析利器-Pandas库_第1页
Python大数据财务分析 课件 2. 财务数据分析利器-Pandas库_第2页
Python大数据财务分析 课件 2. 财务数据分析利器-Pandas库_第3页
Python大数据财务分析 课件 2. 财务数据分析利器-Pandas库_第4页
Python大数据财务分析 课件 2. 财务数据分析利器-Pandas库_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

财务数据分析利器--Pandas库第二章2024/9/12《Python大数据财务分析》配套课件目录022.1DataFrame的创建03042.2文件的读取和写入2.3数据读取与筛选01052.5财务数据处理–杜邦分析案例实战2.4数据表拼接目录022.1.1通过列表创建DataFrame032.1

DataFrame的创建2.1.2通过字典创建DataFrame01补充知识点:修改索引名称本章将简单介绍Python数据分析的一大利器,也是一个基础模块——pandas库的使用。pandas库是基于NumPy的一个开源Python库,被广泛用于快速分析数据,以及数据清洗和准备等工作。某种程度上可以把Pandas看作是Python版的Excel。如果是利用Anaconda安装的Python,那么Anaconda自带pandas库,无须单独安装。Numpy是另一个重要的库,是NumericalPython的简称(Numpy库的相关知识点可以参考本书源代码文件夹中的“补充知识点:Numpy库基础.pdf”)。相较于Numpy来说,Pandas更擅长处理二维数据。Pandas主要有两种数据结构:Series和DataFrame。Series类似于通过Numpy产生的一维数组,不同的是Series对象不仅包含数值,还包含一组索引,其创建方式如下:2024/9/12《Python大数据财务分析》配套课件4引言生成结果如下所示,它也是一个一维数据结构,并且对于每个元素都有一个行索引可以用来定位,比如可以通过s1[1]来定位到第二个元素“王二”。Series单独使用相对较少,pandas主要采用DataFrame数据结构。DataFrame是一种二维表格数据结构,直观一点的话可以将其看作一个Excel表格。2024/9/12《Python大数据财务分析》配套课件5引言2.1DataFrame的创建有两种DataFrame常见的创建方法:通过列表创建、通过字典创建。2.1.1通过列表创建DataFrame首先是通过列表创建,这个和通过Numpy创建二维数组比较类似。引入pandas库方式通常为importpandasaspd,然后调用DataFrame功能创建二维数组。将a打印输出,运行结果如下:2024/9/12《Python大数据财务分析》配套课件6和之前通过Numpy生成的二维数组进行比较:可以看到通过pandas的DataFrame功能生成的二维数组更像我们在Excel中看到二维表格数据,它也有行索引和列索引,其中这里的索引序号都是从0开始的。2.1.1通过列表创建DataFrame2024/9/12《Python大数据财务分析》配套课件7我们还可以自定义其列索引和行索引名称,代码如下:其中columns表示的就是列索引名称,index表示的就是行索引名称,输出结果如下:2024/9/12《Python大数据财务分析》配套课件82.1.1通过列表创建DataFrame通过列表生成DataFrame还可以采用如下的方式,演示代码如下:其效果如下:a=pd.DataFrame()#创建一个空DataFramedate=[1,3,5]score=[2,4,6]a['date']=datea['score']=scoredatescore012134256注意要保证date列表和score列表的长度一致,否则会报错2024/9/12《Python大数据财务分析》配套课件92.1.1通过列表创建DataFrame除了通过列表创建DataFrame,还可以通过字典来创建DataFrame并可以自定义列索引,这里默认字典键为列索引,代码如下:输出结果如下,可以看到列索引已经变成了这里字典里的键名了。2024/9/12《Python大数据财务分析》配套课件102.1.1通过列表创建DataFrame如果想让字典键变成行索引,可以通过from_dict的方式来将字典转换成DataFrame,并同时设置orient参数为index,代码如下:其中orient参数指定字典键对应的方向,默认值为columns,如果不设置成index的话,则还是默认字典键为列索引,输出结果如下,此时的字典键已经是行索引了。2024/9/12《Python大数据财务分析》配套课件112.1.2通过字典创建DataFrame除了通过from_dict()函数设置orient参数外,我们还可以通过DataFrame的.T属性来对列表进行转置,演示代码如下:结果如下:此外注意,如果想改变原来的表格结构,需要进行重新赋值,写成b=b.T,这样就会改变原来b的表格结构了。通过.T同样可以对表格进行转置。2024/9/12《Python大数据财务分析》配套课件122.1.2通过字典创建DataFrame有时要对行索引、列索引进行修改,虽然用的相对较少,这里还是简单讲下。如果想设定行索引那一列的名称,可以通过的方式来设置,代码如下:此时表格a如下所示:a=pd.DataFrame([[1,2],[3,4],[5,6]],columns=['date','score'],index=['A','B','C'])='公司'datescore公司

A12B34C562024/9/12《Python大数据财务分析》配套课件13补充知识点:修改行索引或列索引名称如果想对索引进行重命名的话,可以通过rename()函数,代码如下:a=a.rename(index={'A':'万科','B':'阿里','C':'百度'},columns={'date':'日期','score':'分数'})a.rename(index={'A':'万科','B':'阿里','C':'百度'},columns={'date':'日期','score':'分数'},inplace=True)这里通过rename之后并没有改变原表格结构,需要重新赋值给a才能改变原表格,或者在rename()中设置inplace参数为True,也能实现真正替换,代码如下:此时表格a:

日期

分数公司

万科

12阿里

34百度

562024/9/12《Python大数据财务分析》配套课件14补充知识点:修改行索引或列索引名称如果想让行索引变成常规列,可以重置索引,代码如下,同样需要将其重新赋值给a变量,或者在reset_index()的括号里设置inplace参数为True。a=a.reset_index()公司

日期

分数0万科121阿里342百度56此时索引将被重置为数字序号,原索引变成新的一列,表格a如下所示:2024/9/12《Python大数据财务分析》配套课件15补充知识点:修改行索引或列索引名称如果想把常规列设置为行索引,可以通过如下代码设置:a=a.set_index('日期')#或者直接写a.set_index('日期',inplace=True)

公司

分数日期

1万科23阿里45百度6此时的表格a如下所示:2024/9/12《Python大数据财务分析》配套课件16补充知识点:修改行索引或列索引名称如果想修改列索引,也可以通过a.columns=['xxx','xxx']来快速进行设置,演示代码如下:a=pd.DataFrame([[1,2],[3,4],[5,6]],columns=['date','score'],index=['A','B','C'])a.columns=['日期','分数']2024/9/12《Python大数据财务分析》配套课件17补充知识点:修改行索引或列索引名称目录022.2.1文件读取032.2

文件的读取和写入2.2.2文件写入补充知识点:文件相对路径与绝对路径012.2.1文件读取以下代码用于读取Excel数据:这里的Excel工作簿文件后缀名为xlsx,如果是2003版或更早版本的Excel工作簿,其后缀则为xls。这里使用的文件路径是相对路径,即代码所在的文件路径,也可以设置成绝对路径(相对路径和绝对路径的相关知识点参考3.2.2节补充知识点)。通过打印data我们便可以查看此时的表格,或者我们可以打印data.head()查看表格的前五行内容(如果写成head(10)则可以查看前10行数据),代码如下:2024/9/12《Python大数据财务分析》配套课件19打印结果如下:

datescoreprice02018-09-037023.5512018-09-047524.4322018-09-056523.4132018-09-066022.8142018-09-077023.21第2行代码中的read_excel还可以设定参数,使用方式如下:2024/9/12《Python大数据财务分析》配套课件202.2.1文件读取常见的参数:sheet_name用于指定工作表,可以设置工作表名称,其取值也可以为数字(默认为0,即第1个工作表);index_col用于设置某一列设置为行索引。以下代码用于读取CSV文件:read_csv()函数也可以指定参数,使用方式如下:delimiter参数用于指定CSV文件中的分隔符号,默认为逗号;encoding参数用于指定编码方式,一般设置为utf-8或gbk,以避免中文乱码。2024/9/12《Python大数据财务分析》配套课件212.2.1文件读取以下代码可以将数据写入Excel工作簿。这里的文件存储路径使用的是相对路径,也可以根据需要写成绝对路径。运行之后将在代码所在文件夹生成一个名为“演示.xlsx”的文件,文件内容如下图3-1所示。2024/9/12《Python大数据财务分析》配套课件222.2.2文件写入想在写入数据时不保留行索引信息,可以设置to_excel的参数。to_excel的常见参数有:sheet_name用于指定工作表名称;index指定是否写入行索引信息,默认为True,即保存行索引信息至输出文件的第1列,若设置为False,则忽略行索引信息;columns用于指定要写入的的列;encoding用于指定编码方式。例如,要将data中的第1列数据导入Excel工作簿并忽略索引信息,则代码如下:通过类似的方式,可以将data中的数据写入到CSV文件当中,代码如下:和to_excel类似,to_csv也可以设置index、columns、encoding等参数。注意,如果在导出CSV文件事出现了中文乱码现象,且encoding参数设置成“utf-8”失效,则需要将encoding参数设置成“utf_8_sig”,代码如下:2024/9/12《Python大数据财务分析》配套课件232.2.2文件写入相对路径文件相对路径,即代码所在的文件夹,例如data.to_excel('data.xlsx')就是在代码所在的文件夹生成Excel文件。此外,如果写成data.to_excel('XX文件夹/data.xlsx')则是表示在代码所在文件夹下的“XX文件夹”中生成Excel文件。绝对路径文件绝对路径,就是文件完整的路径名称,例如'E:\大数据分析\data.xlsx'就是绝对路径,不过因为在Python中反斜杠“\”经常有特殊含义,比如“\n”表示换行,所以通常建议写绝对路径的时候写两个反斜杠取消可能存在的单个反斜杠的特殊含义,写成'E:\\大数据分析\\data.xlsx’。在文件路径的字符串前面加一个r也可以取消单个反斜杠的特殊含义,代码如下:补充知识点:文件相对路径与绝对路径data.to_excel('E:\\大数据分析\\data.xlsx')#绝对路径推荐写法1data.to_excel(r'E:\大数据分析\data.xlsx')#绝对路径推荐写法2data.to_excel('E:/大数据分析/data.xlsx')#绝对路径推荐写法32024/9/12《Python大数据财务分析》配套课件24目录022.3.1按照行列进行数据筛选03042.3

数据读取与筛选2.3.2按照特定条件筛选2.3.3数据整体情况查看012.3.4数据运算、排序与删除2.3数据读取与筛选创建了DataFrame之后,就可以对其中的数据进行读取与编辑操作.首先创建一个3行3列的DataFrame用于演示,行索引设定为r1、r2、r3,列索引设定为c1、c2、c3.代码如下:打印输出结果如下:2024/9/12《Python大数据财务分析》配套课件262.3.1按照行列进行数据筛选(1)按照列来选取数据先从简单的读取单列数据入手,代码如下:a的打印输出结果如下:读取的数据不包含列索引信息,返回一维结构序列。2024/9/12《Python大数据财务分析》配套课件272.3.1按照行列进行数据筛选(1)按照列来选取数据通过如下代码可以返回一个二维的表格数据(序列和表格是不同的数据结构)b的打印输出结果如下:2024/9/12《Python大数据财务分析》配套课件282.3.1按照行列进行数据筛选(1)按照列来选取数据若要选取多列,则需要在中括号[]中指定列表。a的打印输出结果如下:要读取c1和c3列,可以写为data[['c1','c3']]。需要特别注意的是,必须是一个列表,而不能是data['c1','c3']2024/9/12《Python大数据财务分析》配套课件29(2)按照行来选取数据可以根据行的序号来读取数据,代码如下:打印输出结果如下:2.3.1按照行列进行数据筛选2024/9/12《Python大数据财务分析》配套课件30(2)按照行来选取数据而pandas推荐使用iloc方法来根据行序号读取数据,这样更直观,而且不会像data[1:3]可能会引起混淆。代码如下:而且如果要读取单行,就必须用iloc方法,例如,选择倒数第一行,代码如下:2.3.1按照行列进行数据筛选此时如果使用data[-1]则会报错,因为程序可能会认为-1是列名,导致混淆报错。2024/9/12《Python大数据财务分析》配套课件31(2)按照行来选取数据除了通过行序号读取数据外,还可以通过loc方法根据行的名称来读取数据,代码如下:如果行数很多,可以通过head()函数来读取前5行数据,代码如下:2.3.1按照行列进行数据筛选这里因为只data中只有3行数据,所以通过data.head()会读取全部数据,如果只想取前2行的数据,可以写成data.head(2)。2024/9/12《Python大数据财务分析》配套课件32(3)按照区块来选取如果想选取某几行的某几列数据,例如,获得c1和c3列的前2行数据,代码如下:其实就是把前面通过行和列读取数据的方法进行了整合,打印输出结果如下:在实战中,通常采用iloc和列读取混合的方式来读取特定的区块数据,代码如下:2.3.1按照行列进行数据筛选2024/9/12《Python大数据财务分析》配套课件33(3)按照区块来选取如果要读取单个值,那么该方法就更有优势,例如,读取c3列第1行的数据,就不能写成data['c3'][0]或data[0]['c3']了,而要采用下面的写法,先用iloc[0]读取第1行,再读取c3列。2.3.1按照行列进行数据筛选也可以使用iloc和loc方法同时读取行和列,代码如下:2024/9/12《Python大数据财务分析》配套课件34(3)按照区块来选取loc方法使用字符串作为索引读取数据,iloc方法使用数字作为索引读取数据,d和e的打印输出结果如下:2.3.1按照行列进行数据筛选记忆小技巧loc是location(定位、位置)的缩写,所以通过字符索引来定位,而iloc中多了一个字母i,而i又经常代表数字,所以是用数字作为索引iloc[0,1]表示第1行,第2列单元格。2024/9/12《Python大数据财务分析》配套课件352.3.2按照特定条件筛选通过在中括号里设定筛选条件可以过滤行。例如,读取c1列中数字大于1的行,代码如下:a的打印输出结果如下:2024/9/12《Python大数据财务分析》配套课件36如果有多个筛选条件,可以通过“&”符号(表示“且”)或“|”(表示“或”)连接。例如,筛选c1列数字大于1且c2列中数字小于8的行,代码如下,注意在筛选条件两侧要加上小括号。打印输出结果如下:2.3.2按照特定条件筛选2024/9/12《Python大数据财务分析》配套课件372.3.3数据整体情况查看通过表格的shape属性,可以查看表格整体的行数和列数,在表格数据量较大的时候能快速了解表格的行数和列数运行结果如下,其中第一个数字为表格行数,第二个数字为表格列数。通过表格的describe()函数可以快速的查看表格每一列的数量、平均值、标准差、最小值、25分位数、50分位数、75分位数、最大值等信息,代码如下:2024/9/12《Python大数据财务分析》配套课件382.3.3数据整体情况查看通过表格的describe()函数可以快速的查看表格每一列的数量、平均值、标准差、最小值、25分位数、50分位数、75分位数、最大值等信息,代码如下:

c1c2c3count3.03.03.0mean4.05.06.0std3.03.03.0min1.02.03.025%2.53.54.550%4.05.06.075%5.56.57.5max7.08.09.0运行效果如下:2024/9/12《Python大数据财务分析》配套课件39通过value_counts()函数则可以快速的查看某一列都有什么数据,以及该数据出现的频次,代码如下:运行效果如下,可以看到c1列共有3种不同的数据,且每个出现的频次为1次。2.3.3数据整体情况查看2024/9/12《Python大数据财务分析》配套课件402.3.4数据运算、排序与删除(1)数据运算从已有的列中,通过数据运算创造新的一列,代码如下:输出结果如下:2024/9/12《Python大数据财务分析》配套课件41(2)数据排序使用sort_values()函数可以根据列对数据进行排序。例如,要对c2列进行降序排序,代码如下:其中,参数by用于指定哪一列来排序;参数ascending为上升的意思,默认值为True,设置为False则表示降序排序。a的打印输出结果如下:2.3.4数据运算、排序与删除2024/9/12《Python大数据财务分析》配套课件42(2)数据排序使用sort_index()函数则可以根据行索引进行排序。按行索引进行升序排列的代码如下:运行上述代码后,则前面按c2列降序排序后生成的a表格的行索引又变成r1、r2、r3的升序排列了。同样也可以设置ascending参数为False来进行降序排序。2.3.4数据运算、排序与删除2024/9/12《Python大数据财务分析》配套课件43(3)数据删除

如果要删除数据表中的指定数据,就需要用到drop()函数。具体用法如下:drop()函数常用的几个参数解释如下:index用于指定要删除的行;columns用于指定要删除的列;inplace的默认值为False,表示该删除操作不改变原表格,而是返回一个执行删除操作后的新DataFrame,如果设置为True,则会直接在原表格中进行删除操作。例如,删除c1列的数据,代码如下:2.3.4数据运算、排序与删除2024/9/12《Python大数据财务分析》配套课件44(3)数据删除删除多列的数据,例如,c1和c3列,可以通过列表的方式声明,代码如下:删除行数据,例如,删去第1行和第3行的数据,代码如下2.3.4数据运算、排序与删除上述代码中删除数据后又赋值给新的变量,不会改变原表格data的结构,如果想改变原表格data的结构,可以设置inplace参数为True,代码如下:输入行索引的名称而不是数字序号2024/9/12《Python大数据财务分析》配套课件45目录022.4.1merge()函数032.4

数据表拼接2.4.2concat()函数2.4.3append()函数012.4数据表拼接Pandas库提供的数据合并与重塑为两个数据表的拼接提供了极大的便利。主要包括merge()函数、concat()函数、append()函数,其中merge和append笔者个人用得较多。假设创建了如下两个DataFrame数据表,需要将它们合并:上述代码得到的df1和df2的内容如下表所示df1df2

公司分数

公司股价0万科900万科201阿里951阿里1802百度852京东302024/9/12《Python大数据财务分析》配套课件472.4.1.merge()函数merge()函数可以根据一个或多个列将不同数据表格中的行连接起来,代码如下:df3的内容如下表所示:

公司分数股价0万科90201阿里95180可以看到,merge()函数直接根据相同的列名(“公司”列)对数据表格进行了进行合并,而且默认选取的是两个表共有的列内容(万科、阿里)。如果相同的列名不止一个,可以通过on参数指定按照哪一列进行合并,代码如下:2024/9/12《Python大数据财务分析》配套课件48默认的合并其实是取交集(inner连接),即选取两表共有的内容,如果想取并集(outer连接),即选取两表所有的内容,可以设置how参数,代码如下:运行代码后,df3的内容如下表所示,可以看到所有数据都在,原来没有的内容则赋值为空值NaN。

公司分数股价0万科90.020.01阿里95.0180.02百度85.0NaN3京东NaN30.02.4.1.merge()函数2024/9/12《Python大数据财务分析》配套课件49如果想保留左表(df1)全部内容,而不太在意右表(df2),可以将how参数设置为left,代码如下:此时df3的内容如下表所示,完整保留了df1的内容(万科、阿里、百度)。

公司分数股价0万科90.020.01阿里95.0180.02百度85.0NaN2.4.1.merge()函数2024/9/12《Python大数据财务分析》配套课件50如果想保留右表(df2)的全部内容,而不太在意左表(df1),可以将how参数设置为right。如果想根据行索引进行合并,可以设置left_index和right_index参数,代码如下:此时df3如下表所示,两张表按照它们的行索引进行了合并。

公司_x分数公司_y股价0万科90万科201阿里95阿里1802百度85京东302.4.1.merge()函数2024/9/12《Python大数据财务分析》配套课件512.4.2.concat()函数concat()函数是一种全连接(UNIONALL)方式,它不需要对齐,而是直接进行合并,即不需要两表的某些列或者索引相同,只是把数据整合到一起。所以concat()函数没有how和on参数,而是通过axis参数指定连接的轴向。该参数默认为0,按行方向连接,即纵向拼接,代码如下:此时df3的内容如下表所示。

公司分数股价0万科90.0NaN1阿里95.0NaN2百度85.0NaN0万科NaN20.01阿里NaN180.02京东NaN30.02024/9/12《Python大数据财务分析》配套课件52此时行索引为原来两个表各自的索引,如果想重置索引,可以使用reset_index()函数将索引重置,或者在concat()函数中设置ignore_index=True,忽略原有索引,生成新的数字序列作为索引进行排序,代码如下:如果想按列方向连接,即横向拼接,可以设置axis参数为1,代码如下:此时df3的内容如下表所示。

公司分数公司股价0万科90万科201阿里95阿里1802百度85京东302.4.2.concat()函数2024/9/12《Python大数据财务分析》配套课件532.4.3append()函数append()函数可以被认为是concat()函数的简化版,效果和pd.concat([df1,df2])类似,实现的也是纵向拼接,代码如下:append()函数还有个常用的功能,和列表.append()一样,可用于新增元素,代码如下:这里一定要设置ignore_index=True,用来忽略原索引,否则会报错(如果拼接的是DataFrame,不加这个也没事,只是行数字索引会使用各个拼接表的原数字索引),此时df3的内容如下表所示。

公司分数0万科901阿里952百度853腾讯902024/9/12《Python大数据财务分析》配套课件54目录022.5.1读取年度数据032.5

财务数据处理–杜邦分析案例实战2.5.2

数据清洗2.5.3比率计算及筛选012.5财务数据处理–杜邦分析案例实战在本章前几小节我们已经介绍了如何进行pandas基础操作,这里我们结合刚刚讲到的有关DataFrame的知识点介绍一下如何使用python进行杜邦比率分析。什么是杜邦分析?杜邦分析最初由美国杜邦公司成功应用而得名,是利用各财务比率之间的内在联系,对公司财务状况和经营成果进行综合系统评价的系统方法。通过该分析体系,一下子把本书第七章、第八章、第九章介绍的各个财务比率有机地结合了起来,打通了比率之间的联系。2024/9/12《Python大数据财务分析》配套课件562.5财务数据处理–杜邦分析案例实战什么是ROE?净资产收益率(ROE)根据计算公式可以分解为以下三个指标:净资产收益率

=净利润/营业收入×营业收入/总资产×总资产/股东权益=营业净利率×总资产周转次数×权益乘数以下这个英文的公式可能更便于记忆:ROE=NI/S×S/A×A/E2024/9/12《Python大数据财务分析》配套课件572.5财务数据处理–杜邦分析案例实战净资产收益率

=净利润/营业收入×营业收入/总资产×总资产/股东权益=营业净利率×总资产周转次数×权益乘数上述分解可以表示为下图:2024/9/12《Python大数据财务分析》配套课件582.5财务数据处理–杜邦分析案例实战净资产收益率

=净利润/营业收入×营业收入/总资产×总资产/股东权益=营业净利率×总资产周转次数×权益乘数还有一句简便的‘暗号’帮助记忆:”从银行取钱到超市买白酒“这句暗号里涉及三个行业,银行代表着很高的权益乘数,超市代表着很高的总资产周转次数,白酒代表着很高的营业净利率。这样一来就将三个不易记忆的比率毫无违和地串联在了一句话里。2024/9/12《Python大数据财务分析》配套课件592.5财务数据处理–杜邦分析案例实战净资产收益率

=净利润/营业收入×营业收入/总资产×总资产/股东权益=营业净利率×总资产周转次数×权益乘数要想提高净资产收益率,就可以努力提高上述任意一个比率。“营业净利率”体现了企业的盈利能力;“总资产周转次数”体现了企业的运营能力;“权益乘数”则体现了企业的偿债能力。更深入地说,“营业净利率”对企业利润表进行了概括反映、“权益乘数”对企业资产负债表进行了概括反映,而“总资产周转次数”则把利润表和资产负债表联系起来,使ROE指标可以综合分析评价企业整体经营成果和财务状况。2024/9/12《Pyt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论