0915 学习目标:
上午
- 了解jupyter编辑器使用基本方法~
- 尝试读入读出数据
- 数据类型
- 数据结构
下午
- 数据结构
- 循环控制
- 函数与模块基本概念
————————————————————————————————————————
jupyter notebook编辑器
- 非常类似Rmarkdown!方便初学记笔记
- markdown语法
- 公式用latex:
试用
# 代码块1
my_str = '试用jupyter'
my_list = [9,15,'试用jupyter']
print(my_str)
print(my_list)
试用jupyter
[9, 15, '试用jupyter']
编辑技巧
1.点击esc进入命令模式,可以用快捷键运行代码:和r一样control+return。还可以快速调整代码块的顺序,快速插入新的——b,强制停止——正方形,等等
2.输出结果太多时候,可以点输出左侧的区域——折叠
!pwd # jupyter专属的,获取当前目录的方式
## 将代码块运行结果全部输出,而不是只输出最后的,适用于全文
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
/Users/mac/Desktop/快乐研一/python/py0915
输出报告
1.file-download可以制作PDF/HTML/...
2.view-cell toolbar-slideshow可以制作PPT
————————————————————————————————————————
读入数据
学习步骤:
- step1.设置路径
- step2.导入pandas
- step3.读入excel或csv
- step4.read或者head看看数据内容
- step5.读取某列某行
- step6.创建一个新txt
设置路径和读入
############################
# 查看路径
import os ## 加载标准库(暂时不理解)
os.getcwd() ## 查看当前工作目录
'/Users/mac/Desktop/快乐研一/python/py0915'
############################
# 读入数据excel或者csv——pandas
import pandas as pd #导入Pandas模块
# 设置路径
os.chdir('/Users/mac/Desktop/快乐研一/python/py0915') # 相当于setwd()
os.getcwd() # 确认位置
# 读入excel
duoyuan = pd.read_excel("肺活量与其他指标的数据.xlsx") # 读入当前目录下的某个excel
duoyuan.head() # 查看前五行
# 读入csv
duoyuan_csv = pd.read_csv("肺活量与其他指标的数据.csv")
# 从网上下载数据读取(函数不变)
coupon = pd.read_excel("https://github.com/xiangyuchang/xiangyuchang.github.io/blob/master/BearData/coupon_nm.xlsx?raw=true")
coupon.head() #狗熊会火锅数据
'/Users/mac/Desktop/快乐研一/python/py0915'
序号 | age | weight | time | spulse | rpulse | mpulse | OXY | |
---|---|---|---|---|---|---|---|---|
0 | 1 | 57 | 73.37 | 12.63 | 58 | 174 | 176 | 39.407 |
1 | 2 | 54 | 79.38 | 11.17 | 62 | 156 | 165 | 46.080 |
2 | 3 | 52 | 76.32 | 9.63 | 48 | 164 | 166 | 45.441 |
3 | 4 | 50 | 70.87 | 8.92 | 48 | 146 | 155 | 54.625 |
4 | 5 | 51 | 67.25 | 11.08 | 48 | 172 | 182 | 45.118 |
团购名 | 店名 | 团购活动ID | 团购介绍 | 购买人数 | 团购评价 | 评价人数 | 到期时间 | 团购价 | 市场价 | 地址 | 团购内容 | 备注 | 购买须知 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 壹分之贰豪华生日派对套餐 | 壹分之贰聚会吧桌游轰趴馆(旗舰店) | 38744470 | 仅售880元,价值7342元豪华生日派对聚会桌游轰趴夜场10小时(通宵包场)!免费WiFi,... | 0 | 暂无评价 | 暂无评价 | 2018-08-10 | NaN | NaN | 【西安市雁塔区小寨东路11号壹又贰分之壹B楼1003】 | 【内容: 豪华主题场地, 规格: 10小时, 价格: 600元】【内容: 轰趴场地布置, 规... | 随便退 | 【有效期2017年06月07日至2018年08月10日】\n【可用时间周末法定节假日通用08... |
1 | 壹分之贰豪华棋牌包间 | 壹分之贰聚会吧桌游轰趴馆(旗舰店) | 38632123 | 仅售98元,价值240元豪华棋牌包间4小时套餐(4人)1份!免费WiFi! | 0 | 暂无评价 | 暂无评价 | 2018-08-10 | NaN | NaN | 【西安市雁塔区小寨东路11号壹又贰分之壹B楼1003】 | 【内容: 豪华棋牌包间4小时套餐(4人), 规格: 1份, 价格: 240元】 | 随便退 | 【有效期2017年05月26日至2018年08月10日】\n【可用时间周末法定节假日通用08... |
2 | 壹分之贰豪华生日派对套餐 | 壹分之贰聚会吧桌游轰趴馆(旗舰店) | 38744514 | 仅售480元,价值3685元豪华生日派对聚会桌游轰趴5小时(包场)!免费WiFi,需预约! | 0 | 暂无评价 | 暂无评价 | 2018-08-10 | NaN | NaN | 【西安市雁塔区小寨东路11号壹又贰分之壹B楼1003】 | 【内容: 豪华主题场地, 规格: 5小时, 价格: 300元】【内容: 轰趴场地布置, 规格... | 随便退 | 【有效期2017年06月07日至2018年08月10日】\n【可用时间周末法定节假日通用08... |
3 | 396元1-15人服务 | 壹分之贰聚会吧桌游轰趴馆(旗舰店) | 13377118 | 仅售396元,价值2575元台球优享套餐!免费WiFi,需预约! | 8 | 5 | 3 | 2018-09-04 | 396.0 | 2575.0 | 【西安市雁塔区小寨东路11号壹又贰分之壹B楼1003】 | 【内容: 复式结构场地, 规格: 1次, 价格: 200元】【内容: 场地布置, 规格: 1... | 随便退 | 【有效期2016年05月06日至2018年09月04日】\n【可用时间周末法定节假日通用24... |
4 | 六婆串串香火锅100代金券 | 六婆串串香火锅 | 38767590 | 仅售85元,价值100元代金券!免费停车,免费WiFi! | 6 | 暂无评价 | 暂无评价 | 2018-08-30 | 85.0 | 100.0 | 【西安市雁塔区长丰园小区12号楼7号商铺】【西安市周至县中心街隆发云塔广场C016号】 | 【内容: 代金券, 规格: 1张, 价格: 100元】 | 随便退 | 【有效期2017年06月09日至2018年08月30日】\n【可用时间周末法定节假日通用09... |
查看读入数据某行某列
Pandas模块导入的数据都以数据框(Data Frame)的方式存储。如何读取某列某行:在数据集后加.iloc,并用方括号 [ ,] 表示行列的位置,要注意Python中从零开始计数,所以[1,1]表示第2行第2列!
等数据结构部分再细学
coupon.iloc[0, 1] # 查看火锅数据第1行第2列
coupon.loc[100, '地址'] # 查看第100行店铺地址
coupon.loc[1000,] # 查看第1000条数据全部信息
# coupon['团购名'] # 查看某列
# 似乎有很多方法,这部分后面细学
'壹分之贰聚会吧桌游轰趴馆(旗舰店)'
'【西安市碑林区东大街452号西北金行4楼】'
团购名 王婆大虾2-3人餐
店名 王婆大虾(万科城店)
团购活动ID 38243352
团购介绍 仅售98元,价值122元3人餐!可使用包间,免费WiFi!
购买人数 34
团购评价 4
评价人数 3
到期时间 2018-09-04
团购价 98
市场价 122
地址 【郑州市管城区中州大道与航海东路交叉口富田太阳城东方美食街向北150米路西(启元国际小学对面...
团购内容 【内容: 王婆大虾, 规格: 1份, 价格: 78元】【内容: 金针菇, 规格: 1份, 价...
备注 随便退
购买须知 【有效期2017年04月17日至2018年09月04日】\n【可用时间周末法定节假日通用11...
Name: 1000, dtype: object
写数据
读写数据用内置函数open,读写txt文件
f = open(<文件名>, <打开模式>)
############################
# 读写数据txt——open
new_txt = open("创建新文件练习.txt","w") #w代表写一个新文件
new_txt.write("这是杨舒仪的一个新txt文件!\n建立在当前工作目录下\n9月15日~")
new_txt.close() #一定记得关闭文件,否则会占用系统资源
# 建立成功~~
# 接着再次读取这个数据
data = open("创建新文件练习.txt","r")
data.read() # 查看内容
data.close() #关闭文件
33
'这是杨舒仪的一个新txt文件!\n建立在当前工作目录下\n9月15日~'
————————————————————————————————————————
数据类型
首先简单了解下:
- 整数 int,可以直接计算
- 布尔/BOOL True和False
- 浮点,
- 复数
- 字符串
- 时间数据
查看数据类型
# 查看数据类型
type(915)
type("915")
type(9.15)
type(True)
# 查看某个数据集所有变量的type
coupon.dtypes
int
str
float
bool
团购名 object
店名 object
团购活动ID int64
团购介绍 object
购买人数 int64
团购评价 object
评价人数 object
到期时间 object
团购价 float64
市场价 float64
地址 object
团购内容 object
备注 object
购买须知 object
dtype: object
简单逻辑运算
- and 和 or 连接
- 使用:利用布尔值寻找需要的特点数据
# 简单逻辑运算
(1!= 2) and (1==1)
((3+2)>5) or (1>(3/2))
# 找到火锅店名为六婆串串香火锅的数据
coupon[coupon['店名']=='六婆串串香火锅']
# 还没学数据结构,暂时靠猜测上面的代码含义,仿写出下面的:
# 找到团购价高于2000的火锅数据
coupon[coupon['团购价']>2000]
True
False
团购名 | 店名 | 团购活动ID | 团购介绍 | 购买人数 | 团购评价 | 评价人数 | 到期时间 | 团购价 | 市场价 | 地址 | 团购内容 | 备注 | 购买须知 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
4 | 六婆串串香火锅100代金券 | 六婆串串香火锅 | 38767590 | 仅售85元,价值100元代金券!免费停车,免费WiFi! | 6 | 暂无评价 | 暂无评价 | 2018-08-30 | 85.0 | 100.0 | 【西安市雁塔区长丰园小区12号楼7号商铺】【西安市周至县中心街隆发云塔广场C016号】 | 【内容: 代金券, 规格: 1张, 价格: 100元】 | 随便退 | 【有效期2017年06月09日至2018年08月30日】\n【可用时间周末法定节假日通用09... |
团购名 | 店名 | 团购活动ID | 团购介绍 | 购买人数 | 团购评价 | 评价人数 | 到期时间 | 团购价 | 市场价 | 地址 | 团购内容 | 备注 | 购买须知 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
469 | 天骊君廷大酒店美食套餐 | 天骊君廷大酒店 | 8412752 | 仅售3999元,价值5368元美食套餐!请至少提前1天预约,提供免费WiFi、停车位,可使用... | 195 | 暂无评价 | 暂无评价 | 2018-09-05 | 3999.0 | 5368.0 | 【西安市高新区太白南路198号】 | 【内容: 一帆风顺(蓝莓山药、酱汁萝卜、虾皮海藻、广式椒圈、黄瓜蜇头、茶香酱鸭、酱牛肉、君廷... | 随便退 | 【有效期2016年02月08日至2018年09月05日】\n【可用时间法定节假日当天不可使用... |
字符串处理
- 字符串拼接 + (R中的paste?)
- 复制 * (R中的rep?)
- 是否在字符串中 in (R中的grep?)
- 长度 len
- 单个索引和切片索引?
字符串通过一种特殊的数据结构列表(list)存储。在下面学数据结构里理解。
storename = 'python学习笔记'
storename*3 # 复制
'杨舒仪的' + storename + '-day1' # 拼接
'python' in storename # 查找
storename[0:6] # 前6个字,问题为什么0:6是前6个字?
len(storename) # 字符长度
'python学习笔记python学习笔记python学习笔记'
'杨舒仪的python学习笔记-day1'
True
'python'
10
数据类型转化
- float(): 转化为浮点数,类似as.numeric
- str: 转化为字符串,类似as.character
- int:转化为整数
coupon数据中id被处理成了int,事实上应该是字符串,因此需要str()转化。但是出现一个错误'str' object is not callable,str转化对象只能是单个id。
一次转化多个id怎么写呢,写个循环吗?
写个循环似乎是可行的,“使用列表推导式把列表中的单个元素全部转化为str”
ID = coupon.loc[0,'团购活动ID'] # 第一家店铺id
type(ID)
type(str(ID)) # int转化为str
numpy.int64
str
————————————————————————————————————————
数据结构
首先简单了解下:
-
列表:有序的,[ 'abcd', 786 , 2.23, 'runoob', 70.2 ]
-
字典:无序的,键(key) : 值(value) 的集合 ,如{'name': 'yy','date':9.15, 'topic': 'python'}
-
集合: { } 或者 set() 函数创建集合,{'r', 'b', 'd'}
-
元祖:与列表类似,但元素不能修改,(123, 'yyy')
-
dataframe数据框(pandas里面的数据结构)
列表
需要了解:
- 列表生成,嵌套,删除
- 基本操作:查看数据类型,合并列表,列表长度,查找/是否存在某个元素,切片,删除
- 常用函数:append 插入
列表生成、嵌套、删除
### 列表生成
list0 = [] #空列表
list1 = ['yyy','0915','上午']
# 列表嵌套
list2 = [list1,'study','python'] # 把另一个列表当做一个元素
list2
# 列表删除
del list1[1] # 删除某个元素
del list2[0] # 注意!!!嵌套的结果在del时整体被删除!!!
del list2 # 删除一个列表
#list2 # 报错说明成功删除
[['yyy', '0915', '上午'], 'study', 'python']
['study', 'python']
列表基本操作
- 查看数据类型:type()
- 连接:直接用+
- 查找:in & not in ,返回布尔值
- 切片:list[a:b] 第一个索引的元素包含在切片中,第二个不包含在切片内(可以理解为区间中的左闭右开)
# 连接数组
list3 = list1 + ['study','python'] + [123,0.456]
list3
# 数组 type len 查找结果
[type(list3), 'python'in list3, 123 in list3, 1234 in list3]
# 索引切片
list3[0]
list3[2:4] # 第3和4个
list3[:4] # 第1-4个
['yyy', '上午', 'study', 'python', 123, 0.456]
[list, True, True, False]
'yyy'
['study', 'python']
['yyy', '上午', 'study', 'python']
列表函数
-
末尾添加新元素: list.append()
-
删除:del list[n]
-
移除:list.pop(index = n)
-
插入:list.insert(插入位置,新元素)
-
翻转:list.reverse()
-
排序:list.sort()
-
统计某个元素出现次数 list.count()
-
找到匹配的第一项的位置(因为list里面元素可重复):list.index()
-
迭代
-
长度:len()
-
最值:max() min()
# append() 添加元素
list3.append('yyy')
# extend 增加多个元素,相当于+
list3.extend([123, 'python','yyy','最后的元素','最后的元素'])
# del 删除最后一个元素
del list3[len(list3)-1]
# list.pop 删除最后一个元素
list3.pop(-1)
# insert 插入一个元素
list3.insert(2,'yyy')
# 翻转
list3.reverse()
# 统计yyy出现次数
print('yyy出现' + str(list3.count('yyy')) + '次')
# 循环
for x in list3[0:3]: print(x)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-15-cb2007bec1fb> in <module>()
1 # append() 添加元素
----> 2 list3.append('yyy')
3
4 # extend 增加多个元素,相当于+
5 list3.extend([123, 'python','yyy','最后的元素','最后的元素'])
NameError: name 'list3' is not defined
# 数值型list
list4 = [11,2,44,23,34,6,34,37,33,8]
# 找出最大值的位置
print('list4的最大值为' + str(max(list4)) + ',对应index是'+str(list4.index(max(list4))))
# 大小排序
list4.sort()
list4
list4的最大值为44,对应index是2
[2, 6, 8, 11, 23, 33, 34, 34, 37, 44]
元祖
需要了解:
- 创建 ()
- 截取、访问
- 修改:**不可以修改!**但是可以截取([]) 和拼贴(+)从而实现修改
tuple0 = () # 空元祖
tuple1 = tuple0 +(1, 2,3,4)
('a','b') + tuple1[0:3] # 截取和拼贴
('a', 'b', 1, 2, 3)
字典
需要了解:
- 创建:使用键-值(key-value)存储,其中key与value用冒号对应
- 访问:dict[键]
- 增加、修改
# 创建一个字典
dict0 = {'六婆串串香火锅':66, '嗲串串':14}
# 访问
dict0['六婆串串香火锅']
# 增加
dict0['古城串串'] = 30
dict0
# 删除
del dict0['嗲串串']
dict0
# 返回
dict0.keys() # 返回键
dict0.values() # 返回值
dict0.items() # 返回键+值
dict0.get('古城串串') # 如何键值存在,则返回对应值
dict0.get('嗲串串') # 如果键值不存在,不返回
66
{'六婆串串香火锅': 66, '嗲串串': 14, '古城串串': 30}
{'六婆串串香火锅': 66, '古城串串': 30}
dict_keys(['六婆串串香火锅', '古城串串'])
dict_values([66, 30])
dict_items([('六婆串串香火锅', 66), ('古城串串', 30)])
30
集合
- 创建集合,
- 重复的不输出
- set(),把list和tuple变成集合,但是顺序不再保持了
- set(字符串),每个字母变成单个元素
- 进行集合操作
- 集合运算 & |
- 添加删除
# 创建集合
set1 = {'古城串串','嗲串串','六婆串串香火锅'}
set([1,2,1,'ss',3])
# 有点像把list转化为set
# 重复的元素没有输出!!!
# 顺序也自动调整了!!
# 集合运算
set('python')-set('rstudio') # 差集
set('python') | set('rstudio') # 并集
set('python') & set('rstudio') # 交集
# 集合元素增加删除
set1.remove('嗲串串')
set1.add('嗲串串串串')
set1
set1.clear() # 直接清空
{1, 2, 3, 'ss'}
{'h', 'n', 'p', 'y'}
{'d', 'h', 'i', 'n', 'o', 'p', 'r', 's', 't', 'u', 'y'}
{'o', 't'}
{'六婆串串香火锅', '古城串串', '嗲串串串串'}
时间序列数据
- 原本字符串 -> 标准时间——Pandas模块里的to_datetime函数
- 输出形式%Y年%m月%d日——time模块里的time.strftime按照给定形式输出
使用火锅数据做例子:
# 转换前是object?? 暂时不懂
#coupon['到期时间'].dtypes
# to_datatime是用来转换为时间类型数据的函数
coupon['到期时间'] = pd.to_datetime(coupon['到期时间'])
# 转换后
coupon['到期时间'].dtypes # 转换后的数据类型
coupon['到期时间'][{0,100,1000}] # 转换后数据样子
[coupon['到期时间'][0].year, coupon['到期时间'][0].month, coupon['到期时间'][0].day] # 可以按照年月日分割提取
# 当前时间
import time # 加载time模块!!
time.localtime() # time模块的localtime提取当前时间
# 时间序列数据的输出形式
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())) # time.strftime按照给定形式输出
print(time.strftime('%Y年%m月%d日',time.localtime())) # time.strftime按照给定形式输出
dtype('<M8[ns]')
0 2018-08-10
1000 2018-09-04
100 2018-08-05
Name: 到期时间, dtype: datetime64[ns]
[2018, 8, 10]
time.struct_time(tm_year=2020, tm_mon=9, tm_mday=15, tm_hour=15, tm_min=2, tm_sec=38, tm_wday=1, tm_yday=259, tm_isdst=0)
2020-09-15 15:02:38
2020年09月15日
结构
- 顺序结构
- 分支结构 if else
- 循环结构 for while
分支结构 if-else
num = int(input('本次火锅团购购买人数多了吗?:(如果有请填写个数)'))
if num >150:
print("效果好棒!")
elif 50<= num< 150:
print("活动内容微调")
else:
print('内容整改,再接再厉!')
本次火锅团购购买人数多了吗?:(如果有请填写个数)22
内容整改,再接再厉!
遍历 for
for <循环变量> in range(初始值,终止值,步长):
<语句块>
# list 遍历
for i in coupon['团购活动ID'][0:3]: print("团购ID:"+ str(i))
# range 遍历
for i in range(0, 100, 25): print(i)
团购ID:38744470
团购ID:38632123
团购ID:38744514
0
25
50
75
遍历 列表生成式
[表达式 for i in 序列]
比如提取时间中的年份、月份、day:
- 对于序列中某个元素的提取:coupon['到期时间'][i].year
- 表达式:i.year
- 序列:coupon['到期时间']
#把每个团购的到期时间转换成时间格式
coupon['到期时间'] = pd.to_datetime(coupon['到期时间'])
# 序列某个元素提取年份
coupon['到期时间'][10].year
# 遍历序列提取年份
year = [i.year for i in coupon['到期时间']]
2018
循环 while
while 条件或表达式:
语句...
else:
语句...
# 从1 加到10:
i = 1 ; x = 0 # 设定初始值
while i <= 10: # 截止到10
x += i # 累加 x = x+i 的简化写法
i += 1 # 累加 i = i+1 的简化写法
print(x)
55
函数与模块
函数
-
复杂定义函数之后再学
-
基本定义函数的规则:
def 函数名(<参数列表>):
函数体
return <返回值列表 >
模块
- 加载模块
- import 模块名
- import 模块名 as 新名字
- from 模块名 import 函数名
- 模块中函数的使用:模块名.函数名
# 求根号2的大小:从math模块中引入sqrt函数
import math
from math import sqrt
math.sqrt(2)
1.4142135623730951