我的数据挖掘之旅-Python数据分析基础

论坛 期权论坛 期权     
小禅秀   2019-7-28 23:29   2467   0

Python下载:免费开源您现在看到的这篇文章主要是关于Python的基础知识。这是开始加入数据挖掘学习小组后的第二周学习分享,热心的群主是一位来自鹅厂的技术大佬,搜索(公众号:木东居士),由于柳柳比较懒,本文资料多来源于群友,若有侵权,敬请告知。
好了,话不多说,开始我们今天的内容,首先安装我们的Python环境。
官网地址:https://www.python.org/downloads/
下载对应版本Python:python-3.6.1-amd64.exe(我的电脑是window 7-64位),这个版本比较成熟,所以选择







Python安装



(1)直接点击 python-3.6.1-amd64.exe


选择【Customize installation】,可以自定义安装目录;
选择【Add Python 3.6 to PATH】,将Python添加到path环境变量中,免于手动添加,比较方便,添加以后可以直接从cmd命令行运行Python。





(2)直接【Next】





(3)可以自定义安装地址:然后【Install】





(4)提示安装成功



Python测试

(1)快捷键【Windows+R】运行cmd
(2)输入:Python  然后 回车       输入:print ('Hello World!')


完工,python环境已经成功安装。
现在需要安装一个Python工具,一般会用Pycharm,这里我用的是Vs code。
安装Vs code
Vs Code安装














ok,环境工具都准备好了,我们开始这周的任务吧。
Python基本语法[h2]一:基本数据类型[/h2]Python3 中有常见的六种数据类型:
  • Number(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Set(集合)
  • Dictionary(字典)
这六种数据类型可以分成以下两类:
  • 不可变数据:Number、String、Tuple
  • 可变数据:List、Dictionary、Set

[h2]1、Number[/h2]Python3 中支持 int、float、bool、complex。
  1. >>> a, b, c, d = 2, 2.5, True, 2+2j>>> print(type(a), type(b), type(c), type(d))   
复制代码
此外还可以用 isinstance 来判断数字类型。
  1. >>>a = 10>>> isinstance(a, int)True
复制代码
isinstance 和 type 的区别在于:
  • type() 不会认为子类是一种父类类型。
  • isinstance() 会认为子类是一种父类类型。
具体对比如下:
  1. >>> class Father:...     pass...>>> class Son(Father):...     pass...>>> isinstance(Father(), Father)True>>> type(Father()) == FatherTrue>>> isinstance(Son(), Father)True>>> type(Son()) == FatherFalse
复制代码
[h2]2、String[/h2]Python中的字符串用单引号 ' 或双引号 " 括起来,同时包含使用反斜杠 \ 转义特殊字符。设字符串长度为 n,索引值以 0 为开始值,一直到 以 n-1 为结束的索引值,反过来,以 -1 为从末尾的开始位置,一直到以 -(n-1) 为结束的索引值。字符串的截取的语法格式如下,不包括尾索引。
  1. 变量[头索引:尾索引]
复制代码
  1. [/code]字符串可以用 * 或者 + 进行操作,* 表示复制当前字符串,+ 表示和其他的字符串进行相连。
  2. [code]>>> s = 'xyz'>>> print (s)         # 输出字符串xyz>>> print (s[0:2])      # 输出第一个和第二个字符xy>>> print (s[1])        # 输出第二个字符y>>> print(s[-1])   # 输出倒数第一个字符z>>> print (s * 2)       # 输出字符串两次xyzxyz>>> print (s + "你好") # 连接字符串xyz 你好
复制代码
  1. [/code]Python 使用反斜杠( \ )转义特殊字符,如果你不想让反斜杠发生转义,可以在字符串前面添加一个 r,表示原始字符串。
  2. [code]>>> print('w\nys')wys>>> print(r'w\nys')w\nys
复制代码
再次要强调的是字符串是不可变的数据类型,不要试图去修改,否则会报错。
  1. >>> s = 'wyz'>>> s[0] = 'x'TypeError                                 Traceback (most recent call last) in ()     1 s = 'wys'----> 2 s[0] = 'z'TypeError: 'str' object does not support item assignment
复制代码
[h2]3、List[/h2]列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。
列表是写在方括号 [] 之间、用逗号分隔开的元素列表。列表的索引和截取方式和 String 相同,这里不再赘述。
列表也可以通过 + 和 * 记性操作,原理和 String 类似,+ 表示连接其他的列表, * 表示重复列表内容,具体举例:
  1. >>> l = [ 'a', 7, 2.2, [2]]>>> l[0:2]['a', 7]>>> l + ['b']['a', 7, 2.2, [2], 'b']>>> l * 2['a', 7, 2.2, [2], 'a', 7, 2.2, [2]]
复制代码
与字符串不同的是,列表是可以改变元素的。
  1. >>> l[0] = 'b'>>> l['b', 7, 2.2, [2]]
复制代码
列表和字符串截取可以接收第三个参数,参数作用是截取的步长,如下举例:
  1. >>> l[::2]['a', 2.2]>>> print(s[::2])ws>>> print(s[::-1])   # 使用此截取方式 [::-1] 相当于倒序输出结果syw>>> l[::-1][[2], 2.2, 7, 'a']
复制代码
[h2]4、Tuple[/h2]元组( Tuple )与列表类似,不同之处在于元组的元素不能修改,否则会报错,元组写在小括号 () 里,元素之间用逗号隔开。元组中的元素类型也可以不相同。
Tuple 和 List 的操作基本相同。
  1. >>> t = ( 'a', 6 , 2.2)>>> print (t)('a', 6, 2.2)>>> t[1:](6, 2.2)>>> t * 2('a', 6, 2.2, 'a', 6, 2.2)
复制代码
  1. [/code][code]# 如果元组只有一个元素,需要加一个逗号,否则会被识别为字符串 'b',而不是 ('b')
复制代码
  1. [/code][code]>>> t + ('b',)('a', 6, 2.2, 'b')
复制代码
[h2]5、Set[/h2]集合(set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。基本功能是进行成员关系测试和删除重复元素。
可以使用大括号 { } 或者 set() 函数创建集合,创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
  1. >>> students = {'A', 'B', 'C'}>>> print(students){'C', 'A', 'B'}>>> students = {'A', 'B', 'C', 'A'}>>> print(students){'C', 'A', 'B'}>>> a = set('abab')>>> b = set('acac')>>> print(a)>>> print(b){'a', 'b'}{'a', 'c'}>>> print(a - b)     # a 和 b 的差集{'b'}>>> print(a | b)     # a 和 b 的并集{'a', 'b', 'c'}>>> print(a & b)     # a 和 b 的交集{'a'}>>> print(a ^ b)     # a 和 b 中不同时存在的元素{'b', 'c'}
复制代码
[h2]6、Dictionary[/h2]列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典是一种映射类型,字典用 { } 标识,它是一个无序的 键 (key) : 值 (value) 的集合。
键 (key) 必须使用不可变类型。并且键 (key) 必须是唯一的。值 (value) 可以相同
  1. >>> d = {}>>> d['a'] = "wys">>> d[0]     = "wys">>> print (d['a'])           # 输出键为 'one' 的值wys>>> print (d[0])             # 输出键为 2 的值wys>>> print (d)             # 输出完整的字典{'a': 'wys', 0: 'wys'}>>> print (keys())       # 输出所有键dict_keys(['a', 0])>>> print (d.values())    # 输出所有值dict_values(['wys', 'wys'])
复制代码
[h2]二、Python 数据类型转换常见函数[/h2]函数介绍int(x [,base])将x转换为一个整数float(x)将x转换到一个浮点数complex(real [,imag])创建一个复数str(x)将对象 x 转换为字符串repr(x)将对象 x 转换为表达式字符串eval(str)用来计算在字符串中的有效Python表达式,并返回一个对象tuple(s)将序列 s 转换为一个元组list(s)将序列 s 转换为一个列表set(s)转换为可变集合dict(d)创建一个字典。d 必须是一个 (key, value)元组序列。frozenset(s)转换为不可变集合chr(x)将一个整数转换为一个字符ord(x)将一个字符转换为它的整数值hex(x)将一个整数转换为一个十六进制字符串oct(x)将一个整数转换为一个八进制字符串[h2]三、Python控制语句[/h2]Python 的控制语句和大多数的编程语言类似,包括条件控制、循环控制等。
控制语句主要有条件语句与循环语句,条件语句大体有四种格式:
  • if 语句
  • if-else 语句
  • if-elif-else 语句
  • nested 语句
举例说明:
a=int(input("请输入你的成绩:"))
if a>90:
print("你的成绩等级为A")
elif a>80:
print("你的成绩等级为B")
elif a>70:
print("你的成绩等级为C")
else:
print("你的成绩等级为D")
print(a)


另外条件语句还可以嵌套。循环语句主要用到 for 和 while,两者区别为:while循环一般用在不知道迭代的次数而for循环是事先知道循环的次数。举例如下:
for x in range(100):
    if x%2==0:
        print(x,"偶数")
    else:
        print(x,"奇数")


break 可以跳出循环体,如果从 for 或者 while 循环体中 break,任何对应的循环 else 块将不执行。
continue 语句被用来跳过当前循环块中的剩余语句,然后继续进行下一轮循环。
循环语句可以有 else 子句,它在穷尽列表(以for循环)或条件变为 false (以while循环)导致循环终止时被执行,但循环被break终止时不执行。
#输出所有100以内质数
for x in range(2,100):
    for y in range(2,x):
        if x%y==0:
            break
    else:
        print(x,"是质数")



[h2]四、函数[/h2]函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。除了使用许多内建函数,也可以自己创建函数,这被叫做用户自定义函数。
函数的规则一般如下:
  1. * 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。* 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。* 函数内容以冒号起始,并且缩进。* return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return
复制代码
  1. *相当于返回 None。
复制代码
  1. [/code]定义一个函数就是给出函数一个名称,指定了函数里包含的参数,和代码块结构。一般的格式如下:
  2. [code]def 函数名(参数列表):    函数体
复制代码
  1.     # 计算圆的面积的函数,参数为半径
复制代码
#计算画圆的面积
def round(r):
    return 3.14*r*r
  1. [/code]#定义了函数之后,可以通过另一个函数调用执行,也可以直接执行。print("圆的面积为",round(6))
  2. !!!pass 语句是空语句,是为了保持程序结构的完整性。pass 不做任何事情,一般用做占位语句。
  3. def func():
  4.     pass
  5. python 函数的参数传递:
  6. 不可变类型:如整数、字符串、元组。如 fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
  7. def Change(a):
  8.     a+=1
  9.     return a
  10. b=9
  11. Change(b)
  12. print(b)
  13. [img]https://201907.oss-cn-shanghai.aliyuncs.com/wc/1811847-3b1a36dc09eab3be5bd1d6b983fbb4c9[/img]
  14. 可变类型:如列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响,换句话说可变对象在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。
  15. def Change(a):
  16.     a.append([11,22,33,44])
  17.         print("函数内取值:",a)
  18.         return
  19. b=[1,2,3,4]
  20. Change(b)
  21. print("函数内取值:",b)
  22. [img]https://201907.oss-cn-shanghai.aliyuncs.com/wc/1811847-555f1145d7a27d659ade7861db8c1e9e[/img]
  23. 注意!python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
  24. 以下是调用函数时可使用的正式参数类型:
  25. [list][*]必需参数:必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
  26. [*]关键字参数:关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
  27. [*]默认参数:调用函数时,如果没有传递参数,则会使用函数定义时的默认参数。
  28. [*]不定长参数:可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。加了两个星号 ** 的参数会以字典的形式导入。
  29. [/list]
  30. def Change(a,*b):
  31.     print(a)
  32.     print(b)
  33. Change(1,2,3,4)
  34. [img]https://201907.oss-cn-shanghai.aliyuncs.com/wc/1811847-2f9a843316c1cb9b684ea32bd9952833[/img]
  35. def Change(a,**b):
  36.     print(a)
  37.     print(b)
  38. Change(1,x=2,y=3)
  39. [img]https://201907.oss-cn-shanghai.aliyuncs.com/wc/1811847-04a4eab00821cda3b5b984f1a299d957[/img]
  40. 如果单独出现星号 * 后的参数必须用关键字传入。
  41. def Change(a,*,b):
  42.     print(a)
  43.     print(b)
  44. Change(1,2,3)
  45. [img]https://201907.oss-cn-shanghai.aliyuncs.com/wc/1811847-4a3275403646110121d423c161e45f78[/img]
  46. def Change(a,*,b):
  47.     print(a)
  48.     print(b)
  49. Change(1,b=2)
  50. [img]https://201907.oss-cn-shanghai.aliyuncs.com/wc/1811847-607b30adb7f21445a5eeb5fd7f48e26d[/img]
  51. python 使用 lambda 来创建匿名函数。所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
  52. [list][*]lambda 只是一个表达式,函数体比 def 简单很多。
  53. [*]lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
  54. [*]lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
  55. [*]虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++ 的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
  56. [/list]
  57. a=lambda x,y : x*y
  58.     print(a(9,9))
  59. [img]https://201907.oss-cn-shanghai.aliyuncs.com/wc/1811847-498e2009e7faf2dc6fa87cef7f9e1044[/img]
  60. [h2][b]五、文件读写[/b][/h2]在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
  61. 使用如下方法可以读文件的模式打开一个文件对象,如果文件不存在会报错,此种情况需要使用 try... finally 来解决。如果打开成功,可以用相关的方法进行读取内容到内存。
  62. a=open('F:\\aaa.txt')
  63. for x in a:
  64.     print(x)
  65. 最后一步是调用 close() 方法关闭文件。
  66. a=open('F:\\aaa.txt')
  67. for x in a:
  68.     print(x)
  69.     a.close()
  70. 使用以下方式进行写文件,和读文件类似,但是参数要变成 'w' 或者 'wb' 表示写文本文件或者写二进制文件。
  71. a=open('F:\\aaa.txt','w')
  72. a.write('i miss you')
  73. a.close()
  74. 可以反复调用 write() 来写入文件,但是务必要调用 f.close() 来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用 close() 方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用 close() 的后果是数据可能只写了一部分到磁盘,剩下的丢失了。用with语句来得保险,因为 Python 引入了 with 语句来自动帮我们调用 close() 方法。
  75. with open('F:\\aaa.txt','w') as a:
  76.     a.write('i miss you')
  77. 要写入特定编码的文本文件,要给 open() 函数传入 encoding 参数,将字符串自动转换成指定编码。
  78. Pandas、Numpy安装与使用numpy主要用于常规的数据运算,比如矩阵运算。
  79. pandas则主要用于数据分析,包括数据的引入,特征的提取以及数据的清洗转移等等,Pandas是python的一个数据分析包,最初由AQR CapitalManagement于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。
  80. [list][*]开发pandas时提出的需求。
  81. [*]具备按轴自动或显式数据对齐功能的数据结构。
  82. [*]集成时间序列功能。
  83. [*]既能处理时间序列数据也能处理非时间序列数据的数据结构。
  84. [*]数学运算和约简(比如对某个轴求和)可以根据不同的元数据(轴编号)执行。
  85. [*]灵活处理缺失数据。
  86. [*]合并及其他出现在常见数据库(例如基于SQL的)中的关系型运算。
  87. [/list][h2]在Vs Code安装Python库[/h2][h3]pip[/h3]如果使用pip,可以按照如下方式进行安装:
  88. [code]pip install pandas
复制代码
但这个在Windows环境下不一定好使,因为库可能需要编译。这个时候,就需要到我刚才说的那个网站下载别人编译好的库。
[h3]conda[/h3]使用conda的话,如果网速允许,一切都会很顺畅。
  1. conda install pandas
复制代码
不论是conda还是pip,都会自动解决包依赖,像yum/apt-get一样省心。比如pandas依赖numpy,你只需要在命令行中输入上面的命令。
import numpy as np
import pandas as pd
from scipy import stats

#创建随机Series
s = pd.Series(np.random.randint(10,20,100))

#求众数
print('众数:',s.mode()[0])

#求中位数
print('中位数:',s.median())

#分位数,以四分位为例
print(f'四分位:\n第一分位:{s.quantile(0.25)}\n第二分位:{s.quantile(0.5)}\n第三分位:{s.quantile(0.75)}')

#算术平均
print('算术平均:',s.mean())

#加权平均
#创建一个随机权重数组
test = pd.DataFrame({'data':np.random.rand(10),'weights':np.random.rand(10)})
wm=np.average(test['data'],weights=test['weights'])
print('加权平均数:',wm)

#几何平均
print('几何平均数:',stats.gmean(s))

#方差
print('方差:',s.var())

#标准差
print('标准差:',s.std())

#极差
print('极差:',s.max()-s.min())

#平均差
print('平均差:',np.abs(s-s.mean()).mean())

#四分位极差
print('四分位极差:',s.quantile(0.75)-s.quantile(0.25))

#异众比率
print('异众比率:',1-s.value_counts()[s.mode()].sum()/s.count())

#离散系数
print('离散系数:',s.std()/s.mean())

#偏态系数
print('偏态系数:',stats.skew(s))

#峰态系数
print('峰态系数:',stats.kurtosis(s))

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP