已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精选资料引言 几年后发生了。在使用SAS工作超过5年后,我决定走出自己的舒适区。作为一个数据科学家,我寻找其他有用的工具的旅程开始了!幸运的是,没过多久我就决定,Python作为我的开胃菜。 我总是有一个编写代码的倾向。这次我做的是我真正喜欢的。代码。原来,写代码是如此容易! 我一周内学会了Python基础。并且,从那时起,我不仅深度探索了这门语言,而且也帮助了许多人学习这门语言。Python是一种通用语言。但是,多年来,具有强大的社区支持,这一语言已经有了专门的数据分析和预测模型库。 由于Python缺乏数据科学的资源,我决定写这篇教程来帮助别人更快地学习Python。在本教程中,我们将讲授一点关于如何使用Python进行数据分析的信息,咀嚼它,直到我们觉得舒适并可以自己去实践。目录1. 数据分析的Python基础o 为什么学Python用来数据分析o Python 2.7 v/s 3.4o 怎样安装Pythono 在Python上运行一些简单程序2. Python的库和数据结构o Python的数据结构o Python的迭代和条件结构o Python库3. 在Python中使用Pandas进行探索性分析o 序列和数据框的简介o 分析Vidhya数据集贷款的预测问题4. 在Python中使用Pandas进行数据再加工5. 使用Python中建立预测模型o 逻辑回归o 决策树o 随机森林让我们开始吧1.数据分析的Python基础为什么学Python用来数据分析 很多人都有兴趣选择Python作为数据分析语言。这一段时间以来,我有比较过SAS和R。这里有一些原因来支持学习Python: 开源免费安装 极好的在线社区 很容易学习 可以成为一种通用的语言,用于基于Web的分析产品数据科学和生产中。 不用说,它仍然有几个缺点: 它是一种解释性的语言,而不是编译的语言,因此可能占用更多的CPU时间。然而,由于它节省了程序员的时间(由于学习的方便),它可能仍然是一个很好的选择。Python 2.7 v/s 3.4 这是关于Python的一个最具争议的话题。你可能总是不能避免遇到,尤其是如果你是一个初学者。这里没有正确/错误的选择。它完全取决于具体情况和你的需要。我会尝试给你一些建议,以帮助你做出明智的选择。为什么选择Python 2.71. 极好的社区支持!这是你在初期需要的东西。Python 2发行于2000年末,已经被使用超过15年。2. 很多第三方库!虽然许多库已经提供了3.X的支持,但仍然有大量的模块只工作在2.X。如果你计划将Python用于具体的应 用,如Web开发这种高度依赖外部模块的,你选择2.7可能会更好。3. 3.X版本的一些特性有向后兼容性,可以使用2.7版本。为什么选择Python 3.41. 更整齐和更快!Python开发者修正了一些固有的问题和小缺点,以此为未来建立一个强大的基础。这些可能不是很相关,但最终会很重要。2. 这是未来!2.7是2 .X族发布的最后一个版本,并且最终每个人都要转移到3.X版本。Python 3在过去5年已经发布的稳定版本,并将继续。 没有明确的赢家,但我想,底线是,你应该专注于学习Python语言。版本之间的转换应该只是一个时间问题。敬请期待,不久的将来一个专门对比Python 2.X和3 X的文章!怎样安装Python有两种方法安装Python 你可以直接从项目网站下载Python,然后单独安装你想要的组件和库 或者,你可以下载并安装一个包,它附带了预装的库。我建议您下载Anaconda。另一种选择是 Enthought Canopy Express。第二种方法提供了一个避免麻烦的安装,因此我会推荐给初学者。这种方法是你必须等待整个包进行升级, 即使你只是对一个单一的库的最新版本感兴趣。它应该不重要,直到和除非,直到和除非,你正在做的尖端统计研究。选择开发环境 一旦你已经安装了Python,选择环境可以有很多种选择。这里是3个最常见的选择: 终端/基于Shell IDLE(默认环境) iPython notebook 类似于R的markdown 而环境权取决于你的需要,我个人更喜欢iPython notebook一点 。它提供了许多良好的功能,编写代码的同时还可以用于记录,你可以选择在上面运行代码块(而不是一行一行的执行)。我们在整个教程中将使用Ipython 环境热身:跑第一个Python程序 你可以使用Python作为一个简单的计算器来开始:有一些事情需要注意: 你可以在你的终端/ CMD键入“IPython notebook”来启动IPython notebook,这取决于你的工作在操作系统 你可以通过简单地点击上面截图中的名字来对IPython notebook命名 界面显示In*代表输入和Out*代表输出。 你可以通过按“Shift + Enter”或“ALT + Enter”来执行代码,如果你后面还想插入一行。 在我们深入挖掘如何解决问题之前,让我们退后一步,了解Python的基本知识。当我们知道数据结构和迭代和条件结构是形成任何语言的关键。在Python中,这些包括列表、字符串、元组、字典、for循环,while循环,if-else等等,让我们来看看下面的因素。2 .在Python上运行一些简单程序Python的数据结构 以下是Python中使用的一些数据结构。你应该熟悉他们,以便恰当的使用它们。 列表列表是在Python中最通用的数据结构。列表可以这样简单的定义:就是在方括号中一系列用逗号来分隔的值。列表可能包含不同类型的项,但它们通常都有相同类型的。Python列表是可变的,列表中的单个元素是可以改变的。 这里是一个快速的例子,定义了一个列表,然后访问它: 字符串字符串可以简单的使用单引号()、双引号(”)或三引号()来定义。字符串封闭三引号()中可以跨越多行的代码,在文档字符串中是很常用的(记录功能的Python方式)。作为一个转义字符。请注意,Python中的字符串是不可变的,所以你不能改变字符串的部分。 元组元组由一系列由逗号分隔的值表示。元组是不可变的,输出的用括号包围,目的是嵌套结构可以被正确处理。此外,尽管元组是不可变的,但它们可以在必要是含有可变数据。 因为元组是不可变的,不可改变的,他们相对列表来说可以处理的更快。因此,如果你的清单是不可能改变的,你应该使用元组,而不是列表。 字典字典是键:值对一个无序集合,要求键是唯一的(在一个字典里)。一对大括号创建一个空的字典: 。Python的迭代和条件结构 和大多数语言一样,Python也有一个FOR循环,这是最广泛使用的迭代方法。它有一个简单的语法: 这里的“Python的迭代可以是列表、元组或其他先进的数据结构,我们将在后面的章节中探讨。让我们来看看一个简单的例子,确定一个数字的因子。 来看看条件语句,它们是用来基于条件执行代码片段。最常用的结构是if-else,有以下语法: 例如,如果我们想打印出某个数字n是偶数还是奇数: 既然你熟悉了Python的基础,我们来更近一步。如果你像完成以下任务:1. 乘2矩阵2. 求二次方程的根3. 绘制条形图和直方图4. 建立统计模型5. 访问网页 如果你想从零开始写代码,它将是一场噩梦,你使用Python不会超过2天!但不要担心这些。值得庆幸的是,有许多预定义的库,我们可以直接导入到我们的代码,使我们的生活很容易。例如,考虑我们刚才看到的因子的例子。我们可以一步就完成: 当然,为了这样我们需要导入的math库。让我们探索下一个不同的库。Python库 在开始我们的学习Python之旅之前,让我们先一步,了解一些有用的python库。第一步显然是要学会将它们导入到我们的环境中。在Python中有以下几种方法: 在第一种方式中,我们已经为math库定义了一个别名m。现在我们可以使用数学库的各种功能(例如阶乘, 通过引用别名m.factorial() 。 第二方式,你需要导入math的整个命名空间,你可以直接使用factorial(),而不用提到math。提示:谷歌推荐您使用第一种方式导入库,因为您将知道函数来自何处。 下面是一个库列表,你将在任何科学计算和数据分析中用到: NumPy代表数值Python。NumPy最强大的功能是n维数组。该库还包含基本的线性代数函数,傅里叶变换,高级的随机数功能,以及集成其他低级语言如Fortran,C和C+的工具。 SciPy代表科学的Python。SciPy是基于NumPy的。它是最有用的库之一,具有各种高层次的科学和工程模块,如离散傅立叶变换,线性代数,优化和稀疏矩阵。 Matplotlib用于绘制各种各样的图表,从直方图到线图,再到热图。你可以在IPython notebook中使用PyLab(IPython notebookPyLab = inline)以此使用这些绘图功能的inline。如果你忽略inline选项, PyLab 会将IPython notebook环境转换成类似于Matlab的环境。你也可以使用 Latex命令将math库添加到您的绘图中。 Pandas对于结构化数据操作和控制。它广泛用于数据再加工和数据准备。Pandas说最近一直在推动对Python Python的使用数据科学家共同体的工具。 Scikit Learn机器学习库。建立在NumPy、SciPy和matplotlib的基础上,这个库包含了机器学习和统计模型包括分类、回归、聚类和降维等很多有效的工具。 Statsmodels用于统计建模。statsmodels是一个Python模块,允许用户探索数据,估计统计模型,并进行统计检验。一个广泛的描述性统计,统计检验的列表。绘图功能,和结果统计可用于不同类型的数据和每个估计。 Seaborn用于统计数据的可视化。Seaborn是Python中用来绘制让人喜欢的并能提供大量信息的统计图形库。它是基于matplotlib。Seaborn旨在使可视化成为探索和理解数据的核心部分。 Bokeh创建交互式图、仪表盘和现代Web浏览器上的数据应用。它允许用户生成的优雅和简洁的d3.js风格的图形。此外,在非常大的或流媒体数据集上,它具有高性能的交互性的能力。 Blaze扩展NumPy和Pandas的分布式和流媒体数据集。它可以用来访问来自多种来源的数据,包括bcolz,MongoDB,SQLAlchemy,Apache Spark, PyTables等等,结合Bokeh,Blaze可以作为一个非常强大的工具,用于对大规模数据创建高效的的可视化和仪表板。 Scrapy用于网络爬虫。它是用于获取特定数据模式的一个非常有用的框架,。它可以通过开始的一个网站主页的网址,然后通过挖掘网页内的网站收集信息。 SymPy用于符号计算。它具有广泛的功能,从基本的符号运算到微积分,代数,离散数学和量子物理学。另一个有用的功能是将计算的结果格式化为LaTeX码的能力。 Requests用于访问网络。它的工作原理类似于Python标准库urllib2,但是更容易编码。但对于初学者,你会发现和urllib2细微的差别,Requests可能更方便。 其它的库,你可能需要: os 用于操作系统和文件操作 networkx和 igraph基于数据操作绘制图形 regular expressions 用于在文本数据中查找模式 BeautifulSoup将探索Web。它不如Scrapy,它一次运行将从一个单一的网页中提取信息。 现在我们已经熟悉Python的基础和更多的库,让我们深入到通过Python解决问题。是的,我的意思是做一个预测模型!在这个过程中,我们使用了一些强大的库,也遇到了下一级的数据结构。我们将带你通过这3个关键阶段:1. 数据探索从我们所拥有的数据中发现更多2. 数据修改清理数据和并修改它使它更适合用来统计建模3. 预测建模运行的实际算法,自得其乐3.在Python中使用Pandas进行探索性分析 为了进一步探索我们的数据,让我把你介绍给另一种动物(好像Python是不够的!) Pandas Pandas是Python最有用的一种数据分析库的我知道这些名字听起来很奇怪,但坚持下去!)它们对于增加一直在增加Python在数据科学界的使用量起了很大的作用。我们现在将使用Pandas从Analytics Vidhya的竞赛中读数据集,进行探索性分析,建立我们的第一个基本分类算法来解决这一问题。 在加载数据之前,让我们了解Pandas 中的2个关键的数据结构序列和数据框序列和数据框的简介 序列可以被理解为一个1维标记/索引数组。你可以通过这些标签访问这个序列的各个元素。 一个数据框类似于Excel工作簿你可以使用列名来引用列,可以通过行号来访问行数据,本质的区别是,在数据帧中,列名和行号是列和行的索引。 More: 10 Minutes to Pandas实践数据集贷款预测问题 您可以从这里下载数据集。这里是变量的描述:让我们从数据探索开始 开始,通过在你的你的终端/ Windows命令提示符键入下面的代码,来以Inline Pylab模式启动IPython界面: 这在PyLab环境下打开IPython notebook,其中有几个有用的库已经导入。此外,你将能够绘制您的数据内联,这对于互动的数据分析是一个非常好的环境。你可以通过键入以下命令,检查环境是否正确的加载了(并获得如下图所示的输出):plot(arange(5)我目前在Linux上工作,并已将数据集存储在以下位置:/home/kunal/Downloads/Loan_Prediction/train.csv导入库和数据集:下面是我们将在本教程中使用的库: numpy matplotlib pandas 请注意,你不需要导入matplotlib和NumPy,因为是在PyLab环境下。但我仍然在代码中保留了它们,以防你在不同的环境中使用代码。 导入库以后,你可以使用read_csv()函数读数据集。这是直到这个阶段的代码:快速数据探索 一旦你读取了数据,可以通过使用head()函数查看一下前几行的数据: 这应该打印10行。或者,您也可以通过打印数据集来查看更多的行。 接下来,你可以使用describe()函数来查看数值字段的概要: describe()功能将提供计数、平均、标准差(STD),最小值,分位数值和最大值(读这篇文章来更新基本统计数据了解人口分布) 这里有几个结论,你可以通过查看describe()函数的输出得出:1. LoanAmount有 (614 592)22个缺失值2. Loan_Amount_Term 有(614 600) 14个缺失值3. Credit_History有 (614 564)50个缺失值4. 我们还可以看到84%的申请者有credit_history,怎么样, credit_history的均值为0.84(记住,credit_history将那些有信用历史的值设置为1,没有的设置为0)5. ApplicantIncome 的分布似乎和expectation呈线性关系,CoapplicantIncome也是。 请注意,我们通过比较的平均值和中位数,即50%位数,来得到偏差的概念。 对于非数值(例如property_area,credit_history等),我们可以看看频率分布,了解他们是否有意义。频率表可以通过以下命令打印: 同样地,我们可以看看信用卡历史的唯一值。注意,dfname column_name 是一个基本的索引技术,来访问一个数据框的特定的列。它也可以是列的列表。想要了解更多信息,参考上面的“Pandas 10分钟教程”的资源共享。分布分析 现在我们熟悉了基本的数据特征,让我们研究不同变量的分布情况。让我们从数字变量开始即applicantincome和LoanAmount 我们通过绘制applicantincome的直方图开始,使用下面的命令: 在这里,我们观察到,有几个极端值。这也是分箱值为50的原因,就是为了清楚地描述它的分布。 下一步,我们看箱线图,了解分布。fare 的箱图可以使用下面代码绘制: 这证实了大量的离群值/极值的存在。这可以归因于社会上的收入差距。部分原因源于这样一个事实:我们正在查看不同的教育水平的人。让我们根据他们所受的教育进行分组: 我们可以看到,研究生和非毕业生的平均收入之间没有实质性的区别。但是毕业生中高收入的人群更多,它们出现在异常值的点中。 现在,让我们使用下面的命令看看LoanAmount的直方图和箱线图: 再次,有一些异常的值。显然,applicantincome和LoanAmount都需要进行一定的数据处理。 LoanAmount有一些缺失值以及一些异常的值,而applicantincome有一些异常值,需要更深入的了解。我们将在即将到来的部分完成这些。分类变量的分析 现在我们了解了applicantincome和loanincome的分布,让我们了解更多关于分类变量的细节。我们将使用Excel数据透视表和交叉制表的风格。例如,让我们看看基于信用记录,可以获得贷款的可能性。这可以在微软的Excel上使用一个透视表实现: 注:这里的贷款状况已被编码,使用1代表yes,而0代表no,因此,所以均值代表了获得贷款的概率。 现在我们将看看使用Python产生类似的效果所需要的步骤。请参考这篇文章,以使用Pandas获得不同的数据操纵技术。 现在我们可以观察到,我们得到一个像微软的 Excel的pivot_table。这可以使用matplotlib库绘制成条形图,使用下面的代码: 这表明,如果申请人有一个有效的信用记录,获得贷款的机会是没有信用记录的人的八倍。你可以根据Married, Self-Employed, Property_Area等绘制类似的图。 或着,这两个图可以进行组合以后的可视化,使用堆叠图表示: 你还可以再上图中加入性别变量(类似于Excel中的数据透视表) 如果你还没有意识到,我们刚刚在这里创建了两个基本的分类算法,一个基于信用历史,而另一个基于2个分类变量(包括性别)。你可以在AV Datahacks上很快的编写代码来创建首次提交。 我们只看到我们如何使用Python中的Pandas做探索性分析。我希望你对大熊猫(动物)的爱现在增加了给予一些帮助,这个库可以为你提供分析数据集。 接下来让我们进一步探讨applicantincome和loanstatus变量,进行数据修改和创建一个数据集并应用各种建模技术。我强烈要求你采用另一个数据集和习题,并在进一步阅读之前完成一个独立的例子。在Python中使用Pandas进行数据再加工4.数据修改翻新的需要对于那些一直跟下来的人来说,这时你必须穿上鞋才能开始跑。 在我们的探索数据期间,我们发现了数据集的一些问题,在数据准备好建立一个好的模型之前需要解决。这个练习通常被称为“数据修改”。这里是问题,我们已经意识到的:1. 在一些变量中有缺失值。我们应该基于丢失的值的数量明智地估计这些值并评估该变量的重要性。2. 当我们查看数据的分布时,我们看到,applicantincome和LoanAmount似乎在两端都含有极端值。虽然他们可能有直观的感觉,但应适当处理。 除了数值领域的这些问题,我们也应该看看非数值领域Gender, Property_Area, Married,Education 和 Dependents这些变量,看看它们是否包含任何有用的信息。 如果你是Pandas的新手,我建议在继续前进之前阅读这篇文章。它详细介绍了一些有用的数据处理技术。检查数据集中的缺失值 让我们看看所有的变量中的缺失值,因为大多数模型不能处理有缺失值的数据,即使他们可以,输入它们往往不能帮助更多。所以,让我们看看数据集中空值/NAN值的数量: 这个命令告诉我们每一列中缺失值的数量,因为如果值为缺失值isnull()返回1。 虽然缺失值数量不是很多,但许多变量都有缺失值,它们中的每一个都应该被估计和补充。通过这篇文章对不同的插值技术进行详细了解。 注:记住,缺失值可能并不总是NaN。例如,如果loan_amount_term是0,它是有意义的或者你认为是缺失的?我想你的答案是缺失的,你是对的。所以我们应该检查那些不切实际的值。如何填补LoanAmount的缺失值? 有许多方法来填补价值贷款金额的缺失值,最简单的就是使用均值来替换,可以通过以下代码实现:另一个极端是可以建立一个监督学习模型来基于其他变量预测贷款金额,然后使用年龄以及其他变量来预测。 既然,现在的目标是讲述数据修改的步骤,我宁愿采取一种方法,它介于这2个极端方法之间。一个关键的假设是,一个人是否受教育的或是否自雇人士可以结合起来,提供一个很好的贷款金额的估计。 首先,让我们看看箱线图看是否有某种趋势存在: 因此我们看到在每一组中贷款金额的中位数的一些变化而这可以用来估计值。但首先,我们必须确保每个self_employed和Education变量 不应该有缺失值。 如我们先前所说,self_employed有缺失值。让我们看看频率表: 因为 86%的值是“No”,将缺失值估计为“No”是比较可靠的,有很高的成功概率。这可以用下面的代码来完成: 现在,我们将创建一个数据透视表,它提供了我们所有Education和self_employed变量的唯一值分组的中位数。接下来,我们定义了一个函数,它返回这些单元格的值,并应用它来填充丢失的贷款金额的值: 这应该给你提供了一个估计贷款金额的缺失值好方法。如何处理在LoanAmount和applicantincome分布中的极值? 让我们先分析LoanAmount。由于极端值可能是现实的的,即一些人可能会由于特定的需求,申请高额的贷款,。所以,不把它们当做离群点对待,让我们尝试对数据转换从而发挥它们的作用: 再看直方图: 现在的分布看起来更接近标准的,极端值的影响已经显着消退。 来看看applicantincome。一种直觉可以是一些申请人有较低的收入,但有一个有力的支持,共同申请者。所以将两者的收入结合起来作为总收入可能是一个好主意,并采取相同的对数变换。 现在我们看到,分布比以前好多了。我会把Gender, Married, Dependents, Loan_Amount_Term, Credit_History等缺失值的估计留给你。此外,我鼓励你考虑可能的额外的信息,可以来自数据。例如,创建一个LoanAmount/TotalIncome列可能会有意义,因为它能给你一个关于申请人如何偿还他的贷款的好想法。 下一步,我们将研究预测模型。5. 使用Python中建立预测模型 之后,我们已经使数据可以用于建模,现在让我们来看看Python代码,来在我们的数据集上创建一个预测模型。Skicit-kearn(sklearn)是Python中最常用于此目的的库,我们将跟随这条小径。我建议你通过这篇文章来复习进修sklearn。 因为,sklearn要求所有输入都是数字,我们应该通过编码类别将我们所有的分类变量转换为数值型。这可以用下面的代码来完成: 下一步,我们将导入所需的模块。然后,我们将定义一个通用的分类函数,它需要一个模型作为输入,并确定准确性度和交叉验证分数。由于这是一篇介绍性文章,我将不会进入编码的细节。请参考这篇文章得到详细的算法以及R和Python的代码。此外,通过本文复习一下交叉验证会更好,因为它是一个非常重要的性能测量方法。逻辑回归 让我们做我们的第一个逻辑回归模型。一个方法就是把所有的变量都加入模型,这可能会导致过度拟合(如果你还不知道这个术语,不要担心)。简单的说,考虑所有的变量可能会导致模型的理解出比较复杂的关系,对于具体的数据,不能很好的概括。阅读更多关于逻辑回归。 我们可以很容易地作出一些直观的假设来设定启动资金。获得贷款的机会将更高:1. 有信用记录的申请人(记得我们在探索时观察到的?)2. 申请人或着共同申请人具有较高收入的申请3. 申请人具有较高的教育水平属性4. 在具有高增长前景的城市地区 让我们使用credit_history建立我们的第一个模型。 准确度:80.946% 交叉验证得分:80.945% 准确度:80.946% 交叉验证得分:80.945% 一般来说,我们期望通过增加变量来提高准确度。但这是一个更具挑战性的案例。准确度和交叉验证得分不受那些影响较小变量的影响。credit_history主导模式。我们现在有两个选择:1. 工程特征:导出新信息并试图预测。我将把这留给你的创造力。2. 更好的建模技术。让我们探索这个下一个。决策树 决策树是建立预测模型的另一种方法。它能比逻辑回归模型提供更高的准确度。 准确度:76.656% 交叉验证得分:81.930% 在这里,基于分类变量
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024家具销售合同样本
- 景观工程合同的履行期限
- 工程总价固定合同格式
- 2024年购销合同大米
- 房地产分销代理合同
- 2024个人与公司合作协议书
- 工程维护居间合同格式
- 2024年婚前财产协议书示例
- 城市房屋拆迁流程指南
- 合作经营协议书范本经典案例
- 人教版三年级数学下册数学广角搭配二教案
- TMF自智网络白皮书4.0
- 电视剧《国家孩子》观影分享会PPT三千孤儿入内蒙一段流淌着民族大爱的共和国往事PPT课件(带内容)
- 所水力除焦设备介绍
- 改革开放英语介绍-课件
- pet考试历届真题和答案
- 《企业员工薪酬激励问题研究10000字(论文)》
- 大学英语三级B真题2023年06月
- GB/T 7909-2017造纸木片
- GB/T 25217.6-2019冲击地压测定、监测与防治方法第6部分:钻屑监测方法
- 中医学课件 治则与治法
评论
0/150
提交评论