├── README.md ├── pandas_demo ├── data │ ├── movies │ │ ├── users.xlsx │ │ └── u.user │ ├── student │ │ ├── student.xlsx │ │ └── student_clean.xlsx │ ├── weather │ │ ├── weather.xlsx │ │ └── weater_beijing.xlsx │ ├── splitTask │ │ ├── merge_task.xlsx │ │ └── splits │ │ │ ├── tasks_0_wxm.xlsx │ │ │ ├── tasks_1_jdq.xlsx │ │ │ ├── tasks_2_wyn.xlsx │ │ │ ├── tasks_3_yc.xlsx │ │ │ └── tasks_4_xr.xlsx │ └── stock │ │ └── stock.csv ├── concat合并.ipynb ├── axis参数理解.ipynb ├── 字符串处理.ipynb ├── 批量拆分与合并excel文件.ipynb ├── 数据排序.ipynb ├── 新增数据列.ipynb └── 索引index的用途.ipynb ├── linux学习.md ├── python学习.md ├── 编程软件配置文档.md ├── git使用.md ├── 服务器部署.md ├── C++学习.md ├── vue3快速上手.md └── docker.md /README.md: -------------------------------------------------------------------------------- 1 | # learning-notes 2 | 分享本人在学习编程开发过程中的笔记 3 | -------------------------------------------------------------------------------- /pandas_demo/data/movies/users.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxmseu/learning-notes/HEAD/pandas_demo/data/movies/users.xlsx -------------------------------------------------------------------------------- /pandas_demo/data/student/student.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxmseu/learning-notes/HEAD/pandas_demo/data/student/student.xlsx -------------------------------------------------------------------------------- /pandas_demo/data/weather/weather.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxmseu/learning-notes/HEAD/pandas_demo/data/weather/weather.xlsx -------------------------------------------------------------------------------- /pandas_demo/data/splitTask/merge_task.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxmseu/learning-notes/HEAD/pandas_demo/data/splitTask/merge_task.xlsx -------------------------------------------------------------------------------- /pandas_demo/data/student/student_clean.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxmseu/learning-notes/HEAD/pandas_demo/data/student/student_clean.xlsx -------------------------------------------------------------------------------- /pandas_demo/data/weather/weater_beijing.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxmseu/learning-notes/HEAD/pandas_demo/data/weather/weater_beijing.xlsx -------------------------------------------------------------------------------- /pandas_demo/data/splitTask/splits/tasks_0_wxm.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxmseu/learning-notes/HEAD/pandas_demo/data/splitTask/splits/tasks_0_wxm.xlsx -------------------------------------------------------------------------------- /pandas_demo/data/splitTask/splits/tasks_1_jdq.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxmseu/learning-notes/HEAD/pandas_demo/data/splitTask/splits/tasks_1_jdq.xlsx -------------------------------------------------------------------------------- /pandas_demo/data/splitTask/splits/tasks_2_wyn.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxmseu/learning-notes/HEAD/pandas_demo/data/splitTask/splits/tasks_2_wyn.xlsx -------------------------------------------------------------------------------- /pandas_demo/data/splitTask/splits/tasks_3_yc.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxmseu/learning-notes/HEAD/pandas_demo/data/splitTask/splits/tasks_3_yc.xlsx -------------------------------------------------------------------------------- /pandas_demo/data/splitTask/splits/tasks_4_xr.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wxmseu/learning-notes/HEAD/pandas_demo/data/splitTask/splits/tasks_4_xr.xlsx -------------------------------------------------------------------------------- /pandas_demo/concat合并.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "attachments": {}, 5 | "cell_type": "markdown", 6 | "metadata": {}, 7 | "source": [ 8 | "pandas实现数据的合并:concat\n", 9 | "**使用场景:**\n", 10 | "批量合并相同格式的excel、给df添加行、给df添加列\n", 11 | "\n", 12 | "说明concat语法:\n", 13 | "- 使用某种合并方式(inner/outer)\n", 14 | "- 沿着某个轴向(axis=0/1)\n", 15 | "- 把多个pandas对象(df/series)合并成一个\n", 16 | "\n", 17 | "concat语法:pandas.concat(objs,axis=0,join='inner',ignore_index=False)\n", 18 | "- objs:一个列表,内容可以是df或者series,可以混合使用\n", 19 | "- axis:默认是0代表按照行合并,为1是列合并\n", 20 | "- join:合并的时候索引的对齐方式,默认是outer join ,也可以是inner join(只合并重复的列)\n", 21 | "- ignore_index:是否忽略原来的索引\n", 22 | "\n", 23 | "append语法:df.append(other,ignore_False)\n", 24 | "append只有按行合并,没有按列合并,相当于concat 的按行简写\n", 25 | "- other:单个df列,series、dict、列表\n", 26 | "- ignore_index:是否忽略原来的索引\n", 27 | "\n", 28 | "\n" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": null, 34 | "metadata": {}, 35 | "outputs": [], 36 | "source": [] 37 | } 38 | ], 39 | "metadata": { 40 | "language_info": { 41 | "name": "python" 42 | }, 43 | "orig_nbformat": 4 44 | }, 45 | "nbformat": 4, 46 | "nbformat_minor": 2 47 | } 48 | -------------------------------------------------------------------------------- /linux学习.md: -------------------------------------------------------------------------------- 1 | ### linux下各文件不同颜色 2 | 3 | | 白色 | 表示普通文件 | 4 | | :------: | :------------------: | 5 | | 蓝色 | 表示目录 | 6 | | 绿色 | 表示可执行文件 | 7 | | 红色 | 表示压缩文件 | 8 | | 浅蓝色 | 链接文件 | 9 | | 红色闪烁 | 表示链接的文件有问题 | 10 | | 黄色 | 表示设备文件 | 11 | | 灰色 | 表示其它文件 | 12 | 13 | ### service 服务管理 14 | 15 | `service 服务名 start|stop|restart|status` 16 | 17 | ### 文档命令 18 | 19 | ``` 20 | man 命令 查看手册 21 | help 命令 只能查看shell内嵌命令 22 | 命令 –help 可以查看外部命令 23 | type 命令 24 | ``` 25 | 26 | 27 | 28 | ### 文件命令 29 | 30 | ``` 31 | pwd :print working directory 32 | ls : list 33 | ls -a (all) 34 | ls -l ll 35 | cd : change directory 36 | cd – 返回上次的文件目录 37 | mkdir 创建文件夹 38 | mkdir -p(parent ,父类) d/g/d 39 | rmdir 删除文件夹 40 | ``` 41 | 42 | ### 文件操作 43 | 44 | ``` 45 | touch 文件名称 创建空文件 46 | vim 文件名 47 | cp [选项] source dest 复制source到dest 48 | \ cp [选项] source dest \ 表示原生命令 49 | source 源文件 dest目标文件 50 | [-r] 复制整个文件夹 51 | rm -rf 文件 删除文件 -r:整个目录 -f:强制执行不提示 52 | mv 源文件 目标文件 移动文件夹 53 | 54 | ``` 55 | 56 | ### 查看文件 57 | 58 | ``` 59 | cat [选项] 要查看的文件 catch 60 | -n:显示所有行的行号,包含空行 61 | more 要查看的文件 可以查看较多内容的文件 62 | q:推出 空格:翻页 63 | less 要查看的文件 64 | echo [选项] 输出内容到控制台 65 | -e:支持反斜杠控制的字符转换 66 | \\ :输出本身 67 | \n:换行符 68 | \t:制表符 69 | head [-n] 文件:显示文件开头部分,默认前10行 -n:可选 70 | tail 文件:默认文件后10行 71 | tail -n 5 文件:文件后5行 72 | tail -f 文件:实时追踪文档的所有更新(follow) 73 | ctrl+s:暂停 ctrl+q:继续 74 | 75 | ``` 76 | 77 | ### 输出重定向和>>追加 78 | 79 | ``` 80 | ls -l > 文件 列表的内容写入文件中(覆盖) 81 | ls -al >>文件 列表的内容追加到文件末尾(追加) 82 | cat 文件1 > 文件2 文件1的内容覆盖文件2 83 | echo ‘内容’ >>文件 84 | 85 | ``` 86 | 87 | ### 软链接 88 | 89 | ``` 90 | ln -s [原文件或目录] [软链接名] ---给原文件创建一个软链接 91 | rm -rf 软连接名 删除软链接 ---而不是 rm -rf 软连接名/ 92 | 如果使用rm -rf 软连接名/ 会将软链接对应的真实目录下的内容也删除 93 | 查询: 通过ll就可以产看,列表属性第一位是l,尾部会有位置指向 94 | pwd -P ---查看实际目录 95 | 96 | ``` 97 | 98 | ### 历史命令 99 | 100 | ``` 101 | history: 查看历史命令 102 | history -c :清除历史命令 103 | 104 | ``` 105 | 106 | -------------------------------------------------------------------------------- /pandas_demo/data/stock/stock.csv: -------------------------------------------------------------------------------- 1 | 日期,公司,收盘,开盘,高,低,交易量,涨跌幅 2 | 2023/3/27,BABA,86.12,87.13,88.22,85.5,18.18M,-0.90% 3 | 2023/3/24,BABA,86.9,85.87,88.11,85.63,20.35M,0.44% 4 | 2023/3/23,BABA,86.52,87.68,88.38,85.26,26.79M,3.43% 5 | 2023/3/22,BABA,83.65,84.84,85.39,83.51,21.08M,-0.06% 6 | 2023/3/21,BABA,83.7,82.46,84.09,82,16.44M,3.33% 7 | 2023/3/20,BABA,81,80.15,81.9,79.48,18.95M,-0.82% 8 | 2023/3/17,BABA,81.67,84,84.16,80.62,23.71M,-0.67% 9 | 2023/3/16,BABA,82.22,81.46,82.48,80.66,22.41M,0.87% 10 | 2023/3/15,BABA,81.51,81.55,82.54,80.15,20.86M,-2.79% 11 | 2023/3/14,BABA,83.85,82.86,83.91,82.16,19.05M,1.15% 12 | 2023/3/13,BABA,82.9,83.01,83.75,81.97,17.62M,-0.07% 13 | 2023/3/10,BABA,82.96,82.64,84.52,82.33,18.12M,-0.49% 14 | 2023/3/9,BABA,83.37,85.12,85.69,82.88,24.12M,-4.12% 15 | 2023/3/8,BABA,86.95,87.39,87.77,86.45,14.72M,-2.01% 16 | 2023/3/7,BABA,88.73,89.52,90.05,88.2,14.51M,-0.99% 17 | 2023/3/6,BABA,89.62,89.58,91.3,88.03,16.98M,-0.09% 18 | 2023/3/3,BABA,89.7,90.09,90.39,88.43,25.83M,-0.06% 19 | 2023/3/2,BABA,89.75,88.96,90.92,87.97,24.02M,-0.22% 20 | 2023/3/1,BABA,89.95,92.92,92.92,89.73,32.05M,2.46% 21 | 2023/2/28,BABA,87.79,88.46,89.34,87.27,24.60M,-1.64% 22 | 2023/3/27,JD,39.78,39.34,39.96,39.15,7.31M,-1.27% 23 | 2023/3/24,JD,40.29,39.92,40.84,39.85,7.35M,0.55% 24 | 2023/3/23,JD,40.07,40.3,40.89,39.63,11.04M,4.08% 25 | 2023/3/22,JD,38.5,39.5,39.87,38.5,8.27M,-2.63% 26 | 2023/3/21,JD,39.54,38.62,39.59,38.43,9.71M,2.28% 27 | 2023/3/20,JD,38.66,38,39.3,37.7,11.16M,-0.44% 28 | 2023/3/17,JD,38.83,39.48,39.67,38.57,11.48M,-2.41% 29 | 2023/3/16,JD,39.79,39.07,40.09,38.91,9.83M,1.14% 30 | 2023/3/15,JD,39.34,39.38,39.88,38.81,10.40M,-2.72% 31 | 2023/3/14,JD,40.44,39.98,40.81,39.46,10.78M,0.82% 32 | 2023/3/13,JD,40.11,39.68,40.84,39.04,13.14M,-0.89% 33 | 2023/3/10,JD,40.47,40.88,41.38,40.07,15.48M,-2.90% 34 | 2023/3/9,JD,41.68,44.51,44.79,41.31,37.10M,-11.28% 35 | 2023/3/8,JD,46.98,45.51,47.41,45.47,8.51M,0.88% 36 | 2023/3/7,JD,46.57,47.36,47.36,46.34,6.51M,-2.82% 37 | 2023/3/6,JD,47.92,47.67,48.72,47.23,7.17M,0.97% 38 | 2023/3/3,JD,47.46,47.36,48.22,47.32,7.87M,0.83% 39 | 2023/3/2,JD,47.07,45.62,47.15,45.4,7.90M,2.93% 40 | 2023/3/1,JD,45.73,46.54,46.77,45.3,9.24M,2.90% 41 | 2023/2/28,JD,44.44,44.28,45.11,43.97,6.44M,-0.67% 42 | 2023/3/27,BAIDU,149.5,156.9,157,147.4,15.52M,-3.17% 43 | 2023/3/24,BAIDU,154.4,148.5,159,148,25.84M,2.32% 44 | 2023/3/23,BAIDU,150.9,145.5,151.1,144.5,12.34M,2.79% 45 | 2023/3/22,BAIDU,146.8,147.9,149.8,145.8,8.86M,-0.88% 46 | 2023/3/21,BAIDU,148.1,146.2,149.3,143.5,13.13M,3.21% 47 | 2023/3/20,BAIDU,143.5,146.5,148,141.7,16.03M,0.91% 48 | 2023/3/17,BAIDU,142.2,135,146,134,32.59M,13.67% 49 | 2023/3/16,BAIDU,125.1,131.3,134.4,120.1,24.31M,-6.36% 50 | 2023/3/15,BAIDU,133.6,134.5,138.3,133,14.63M,3.57% 51 | 2023/3/14,BAIDU,129,132.3,134,128.5,8.23M,-3.73% 52 | 2023/3/13,BAIDU,134,131.5,136.7,129,11.66M,3.47% 53 | 2023/3/10,BAIDU,129.5,128.2,131.1,128,20.86M,-5.89% 54 | 2023/3/9,BAIDU,137.6,140,141,137.4,6.51M,-1.36% 55 | 2023/3/8,BAIDU,139.5,141.1,141.5,137.6,7.68M,-3.26% 56 | 2023/3/7,BAIDU,144.2,147.5,149.3,142.3,9.00M,-2.24% 57 | 2023/3/6,BAIDU,147.5,149.4,150,145.7,9.97M,-1.27% 58 | 2023/3/3,BAIDU,149.4,148.3,150.8,146.6,13.38M,5.29% 59 | 2023/3/2,BAIDU,141.9,141,142.6,139.4,16.49M,-2.14% 60 | 2023/3/1,BAIDU,145,135,146.9,135,17.88M,7.57% 61 | 2023/2/28,BAIDU,134.8,137,138.5,134,12.43M,0.60% 62 | 63 | -------------------------------------------------------------------------------- /python学习.md: -------------------------------------------------------------------------------- 1 | 字符编码 2 | 3 | ```python 4 | chr(65) # 将数字转换成字符 5 | ord('A') # 将字符转换成ascii 6 | ``` 7 | 8 | ##### bisect模块 9 | 10 | bisect模块包含两个主要函数,bisect和insort,两个函数都利用二分查找算法来在有序序列中查找或插入元素。注意其操作的序列均为有序列。 11 | 12 | ###### bisect 13 | 14 | bisect函数两个可选参数lo和hi,来缩小搜寻的范围。lo的默认值是0,hi的默认值是序列的长度,即len()作用于该序列的返回值。 15 | 16 | 其次,bisect函数其实是bisect_right函数的别名,后者还有个姊妹函数叫bisect_left。它们的区别在于,bisect_left返回的插入位置是原序列中跟被插入元素相等的元素的位置,也就是新元素会被放置于它相等的元素的前面,而bisect_right返回的则是跟它相等的元素之后的位置。 17 | 18 | ```python 19 | import bisect 20 | a=[1,3,5,6,7,89,222] 21 | # 该函数传入一个有序序列和要插入的数字,返回要插入数字的位置 22 | lo=bisect.bisect(a,8) 23 | # lo= 24 | ``` 25 | 26 | ```python 27 | # 该代码展示了成绩的分档 28 | import bisect 29 | def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'): 30 | i=bisect.bisect(breakpoints,score) 31 | return grades[i] 32 | lst=[grade(score) if score<=100 else '成绩有误' for score in [33, 99, 77, 70, 89, 90, 100,104]] 33 | print(lst) 34 | ``` 35 | 36 | ###### insort 37 | 38 | insort(seq, item)把变量item插入到序列seq中,并能保持seq的升序顺序。 39 | 40 | ```python 41 | import bisect 42 | import random 43 | SIZE=7 44 | random.seed(1729) 45 | my_list = [] 46 | for i in range(SIZE): 47 | new_item = random.randrange(SIZE*2) 48 | bisect.insort(my_list, new_item) 49 | print('%2d->'%new_item, my_list) 50 | 输出结果如下: 51 | 10-> [10] 52 | 0-> [0, 10] 53 | 6-> [0, 6, 10] 54 | 8-> [0, 6, 8, 10] 55 | 7-> [0, 6, 7, 8, 10] 56 | 2-> [0, 2, 6, 7, 8, 10] 57 | 10-> [0, 2, 6, 7, 8, 10, 10] 58 | ``` 59 | 60 | ##### 数组 61 | 62 | ###### array 63 | 64 | ```python 65 | from array import array 66 | from random import random 67 | 68 | floats = array('d', (random() for _ in range(10 ** 7))) 69 | fp = open('floats.bin', 'wb') 70 | floats.tofile(fp) 71 | fp.close() 72 | floats2 = array('d') 73 | fp = open('floats.bin', 'rb') 74 | floats2.fromfile(fp, 10 ** 7) 75 | fp.close() 76 | ``` 77 | 78 | ###### 内存视图 79 | 80 | memoryview是一个内置类,它能让用户在不复制内容的情况下操作同一个数组的不同切片。内存视图其实是泛化和去数学化的NumPy数组。它让你在不需要复制内容的前提下,在数据结构之间共享内存。其中数据结构可以是任何形式,比如PIL图片、SQLite数据库和NumPy的数组,等等。这个功能在处理大型数据集合的时候非常重要。 81 | 82 | ``` 83 | # 通过改变数组中的一个字节来更新数组里某个元素的值 84 | >>> numbers = array.array('h', [-2,-1, 0, 1, 2]) 85 | >>> memv = memoryview(numbers) 86 | >>> len(memv) 87 | 5 88 | >>> memv[0] 89 | -2 90 | >>> memv_oct = memv.cast('B') 91 | >>> memv_oct.tolist( ) 92 | [254, 255, 255, 255, 0, 0, 1, 0, 2, 0] 93 | >>> memv_oct[5] = 4 94 | >>> numbers 95 | array('h', [-2,-1, 1024, 1, 2]) 96 | ``` 97 | 98 | ###### deque 99 | 100 | ``` 101 | >>> from collections import deque 102 | >>> dq = deque(range(10), maxlen=10) ➊ 103 | >>> dq 104 | deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10) 105 | >>> dq.rotate(3) ➋ 106 | >>> dq 107 | deque([7, 8, 9, 0, 1, 2, 3, 4, 5, 6], maxlen=10) 108 | >>> dq.rotate(-4) 109 | >>> dq 110 | deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], maxlen=10) 111 | >>> dq.appendleft(-1) ➌ 112 | >>> dq 113 | deque([-1, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10) 114 | >>> dq.extend([11, 22, 33]) ➍ 115 | >>> dq 116 | deque([3, 4, 5, 6, 7, 8, 9, 11, 22, 33], maxlen=10) 117 | >>> dq.extendleft([10, 20, 30, 40]) ➎ 118 | >>> dq 119 | deque([40, 30, 20, 10, 3, 4, 5, 6, 7, 8], maxlen=10) 120 | ``` 121 | 122 | ##### 映射类结构 123 | 124 | ###### 字典 125 | 126 | 缺点:内存占用大,因为要维护一个散列表。 127 | 128 | 在做集合的迭代和更新时,不要同时进行这两个操作。 129 | 130 | ###### 集合 131 | 132 | frozenset():返回一个冻结的集合,冻结后的集合不能再添加或者删除任何元素。 133 | 134 | 在集合的关系中,有集合中的元素是另一个集合,但是普通集合本身是可变的,它的实例不能放到另一个集合中(set中的元素必须是不可变的)。所以 frozenset提供了不可变集合。 135 | 136 | ##### 编码和解码 137 | 138 | 编码:把码位转换成字节序列的过程。 139 | 140 | 解码:把字节序列转换成码位的过程。 141 | -------------------------------------------------------------------------------- /编程软件配置文档.md: -------------------------------------------------------------------------------- 1 | ### mysql 2 | 3 | 安装mysql 4 | 5 | ``` 6 | sudo apt install mysql-server 7 | ``` 8 | 9 | 查看mysql版本 10 | 11 | ``` 12 | mysql --version 13 | ``` 14 | 15 | 查看服务状态 16 | 17 | ``` 18 | service mysql status 19 | ``` 20 | 21 | 此时,mysql客户端已经作为服务器的依赖安装到本地,故可以通过命令行登录服务器。mysql8.0,root 用户默认通过 auth_socket 插件授权,而 auth_socket 插件通过 Unix socket 文件来验证所有连接到 localhost 的用户。这意味着你不能以用户–密码的方式,登录root账户。通过指令以root身份登录: 22 | ``` 23 | sudo mysql 24 | ``` 25 | 26 | 修改mysql下的user表,配置密码方式以root身份登录: 27 | 28 | ``` 29 | use mysql; 30 | select user, host, plugin from user; 31 | 32 | #MySQL8.0必须先执行此步骤设置密码,MySQL5.7可以选择先安装下面的secure!!! 33 | alter user 'root'@'localhost' identified with mysql_native_password by '密码'; 34 | 35 | flush privileges; 36 | 37 | exit; 38 | ``` 39 | 40 | 以密码登录mysql 41 | 42 | ``` 43 | mysql -u root -p 44 | ``` 45 | 46 | **增强数据库服务安全性** 47 | 48 | ``` 49 | sudo mysql_secure_installation 50 | # 根据自身需要选择y or n 51 | ``` 52 | 53 | **远程连接** 54 | 55 | 修改配置文件 56 | 57 | ``` 58 | # MySQL8.0!!! 59 | sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 60 | # MySQL5.7!!! 61 | sudo vim /etc/my.cnf 62 | 63 | 64 | # 将其中的 bind-address = 127.0.0.1 注释掉 65 | ``` 66 | 67 | 重启mysql 68 | 69 | ``` 70 | sudo service mysql restart 71 | ``` 72 | 73 | 登录mysql后执行: 74 | 75 | ``` 76 | use mysql; 77 | update user set host='%' where user='root'; 78 | flush privileges; 79 | 80 | #MySQL8.0执行这行 81 | GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; 82 | #MySQL5.7执行这行 83 | GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION; 84 | 85 | flush privileges; 86 | ``` 87 | 88 | **mysql的卸载** 89 | 90 | ``` 91 | sudo apt purge mysql-* 92 | 93 | sudo rm -rf /etc/mysql/ /var/lib/mysql 94 | 95 | sudo apt autoremove 96 | 97 | sudo apt autoclean 98 | ``` 99 | 100 | **忘记密码** 101 | 102 | 修改配置文件,在[mysqld]后添加 skip-grant-tables (登录时跳过权限检查): 103 | 104 | ``` 105 | #MySQL8.0!!! 106 | sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 107 | #MySQL5.7!!! 108 | sudo vim /etc/my.cnf 109 | 110 | 111 | [mysqld] 112 | skip-grant-tables 113 | ``` 114 | 115 | 重启服务后可以无密码登录mysql: 116 | 117 | ``` 118 | sudo service mysql restart 119 | 120 | mysql 121 | ``` 122 | 123 | ``` 124 | use mysql; 125 | #必须先将authentication_string置为空! 126 | update user set authentication_string='' where user='root'; 127 | 128 | flush privileges; 129 | #设置新密码 130 | ALTER user 'root'@'%' IDENTIFIED BY '新密码'; 131 | ``` 132 | 133 | **最后记得删除配置文件中的 `skip-grant-tables` 并重启服务,否则会影响远程连接!** 134 | 135 | ### docker 136 | 137 | ubuntu下docker的安装配置 138 | 139 | 如果机器上有旧版本的docker,应先删除: 140 | 141 | ``` 142 | sudo apt-get remove docker docker-engine docker.io containerd runc 143 | ``` 144 | 145 | 在新机器上安装,需要安装docker仓库 146 | 147 | ``` 148 | sudo apt-get update 149 | 150 | sudo apt-get install ca-certificates curl gnupg lsb-release 151 | 152 | sudo mkdir -p /etc/apt/keyrings 153 | 154 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 155 | 156 | echo \ 157 | "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ 158 | $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 159 | ``` 160 | 161 | 安装docker 162 | 163 | ``` 164 | sudo apt-get update 165 | 166 | sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin 167 | 168 | sudo docker run hello-world 169 | ``` 170 | 171 | 安装docker compose 172 | 173 | ``` 174 | sudo apt-get update 175 | sudo apt-get install docker-compose-plugin 176 | # 查看是否安装 177 | docker compose version 178 | ``` 179 | 180 | ### redis 181 | 182 | 安装redis 183 | 184 | ``` 185 | sudo apt install redis-server 186 | ``` 187 | 188 | 查看redis版本 189 | 190 | ``` 191 | redis-cli --version 192 | ``` 193 | 194 | 查看状态 195 | 196 | ``` 197 | service redis status 198 | ``` 199 | 200 | 远程连接配置: 201 | 202 | ``` 203 | # 打开配置文件 204 | sudo vim /etc/redis/redis.conf 205 | 206 | # 注释掉绑定地址#bind 127.0.0.1,让Redis可远程访问 207 | # bind 127.0.0.1 ::1 208 | 209 | #取消注释requirepass 启动密码认证,并设置访问密码 210 | requirepass your-pass-word 211 | 212 | # 以守护进程运行Redis 213 | daemonize yes 214 | 215 | # 保存退出 216 | # 配置完成后重启redis 217 | sudo service redis restart 218 | ``` 219 | 220 | -------------------------------------------------------------------------------- /git使用.md: -------------------------------------------------------------------------------- 1 | ### 1. 安装git 2 | 3 | 安装后在git bash中输入以下命令来设置用户签名,此处名字和邮箱随便填,与github账号无关 4 | 5 | `$ git config --global user.name wxm` 6 | 7 | `$ git config --global user.email email@example.com` 8 | 9 | ### 2. 创建仓库文件夹 10 | 11 | ![image-20230324152421637](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324152421637.png) 12 | 13 | ### 3. 定位到仓库目录 14 | 15 | 目录名称尽量不要带空格,如果带空格,输入git dash中目录名字需用引号 16 | 17 | `cd d:/GitSpace/first-demo/` 18 | 19 | ### 4. 初始化本地库 20 | 21 | `git init` 22 | 23 | ### 5. 查看本地库状态 24 | 25 | `git status` 26 | 27 | 创建一个hello.txt文件 28 | 29 | `vim hello.txt` 30 | 31 | ![image-20230324152551782](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324152551782.png) 32 | 33 | ### 6. 添加暂存区 34 | 35 | `git add hello.txt` 36 | 37 | `git add -A 将所有文件添加到暂存区` 38 | 39 | ### 7. 提交 40 | 41 | 将暂存区的文件提交到本地库,'first commit'为版本号,自己命名, -m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录 42 | 43 | `$ git commit -m 'first commit' hello.txt ` 44 | 45 | 查看版本号: 46 | 47 | `git reflog` 48 | 49 | ![image-20230324152718264](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324152718264.png) 50 | 51 | `git log` 52 | 53 | ![image-20230324152732228](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324152732228.png) 54 | 55 | 56 | 57 | 修改文件后需要添加暂存区,添加到本地库 58 | 59 | ![image-20230324152748448](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324152748448.png) 60 | 61 | 再次查看版本号 62 | 63 | `git reflog` 64 | 65 | ![image-20230324152814451](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324152814451.png) 66 | 67 | ### 8. 版本穿梭。 68 | 69 | 例如想穿梭到第一个版本,版本号选择为d633b3a 70 | 71 | `git reset --hard d633b3a` 72 | 73 | ![image-20230324153014334](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324153014334.png) 74 | 75 | 查看内容发现hello.txt文件已修改为第一次的内容 76 | 77 | ![image-20230324153024014](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324153024014.png) 78 | 79 | ### 9. git分支 80 | 81 | 优点:可以同时推进多个功能开发,提高开发效率;各个分支在开发过程中,如果一个分支开发失败,不会对其他分支有任何影响。失败的分支删除后重新开始即可。 82 | 83 | 分支的操作: 84 | 85 | | git branch 分支名 | 创建分支 | 86 | | -------------------- | ------------------------------ | 87 | | git branch -v | 查看分支 | 88 | | git checkout 分支名 | 切换分支 | 89 | | git merge 分支名 | 把指定的分支合并到当前的分支上 | 90 | 91 | ![image-20230324153154159](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324153154159.png) 92 | 93 | #### (1) 创建分支 94 | 95 | `git branch hot-fix` 96 | 97 | #### (2) 切换分支 98 | 99 | `git checkout hot-fix` 100 | 101 | ![image-20230324153353652](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324153353652.png) 102 | 103 | #### (3) 正常合并分支: 104 | 105 | 1.切换到master分支,2.合并分支 106 | 107 | `git checkout master` 108 | 109 | `git merge hot-fix` 110 | 111 | ![image-20230324153422385](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324153422385.png) 112 | 113 | #### (4) 冲突合并 114 | 115 | 会发现合并失败,同时当前处于合并中。 116 | 117 | ![image-20230324153531798](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324153531798.png) 118 | 119 | 打开文件需要手动调整不同的地方。 120 | 121 | ![image-20230324153558805](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324153558805.png) 122 | 123 | 保存后提交暂存区,提交版本号,不要带文件名。合并成功。 124 | 125 | ![image-20230324153631670](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324153631670.png) 126 | 127 | ### 10. 创建远程库 128 | 129 | 在github中创建仓库时最好库名与本地库名相同,本例中为first-demo。 130 | 131 | 创建远程库别名 132 | 133 | `git remote -v 查看当前所有远程地址别名` 134 | 135 | `git remote add 别名 远程地址` 136 | 137 | ![image-20230324153743424](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324153743424.png) 138 | 139 | #### (1) 推送本地库到远程库 140 | 141 | `git push 别名 分支` 142 | 143 | ![image-20230324153808089](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324153808089.png) 144 | 145 | #### (2) 在github远程库中修改文件后,应当从远程库拉取到本地库 146 | 147 | `git pull 别名(地址) 分支` 148 | 149 | ![image-20230324153837132](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20230324153837132.png) 150 | 151 | #### (3) 克隆远程库 152 | 153 | `git clone 地址(https,ssh)克隆公共远程库不需要账号密码 ` 154 | 155 | ### 11.故障解决 156 | 157 | 解决git pull和push连接远程库失败 158 | 159 | `git config --global --unset http.proxy` 160 | 161 | `git config --global --unset https.proxy` 162 | 163 | -------------------------------------------------------------------------------- /服务器部署.md: -------------------------------------------------------------------------------- 1 | ### 服务器部署 2 | 3 | 部署环境为ubuntu22.04 域名:wxmseu.cn 4 | 5 | 1. 创建一个项目工程online 6 | 7 | ``` 8 | mkdir online 9 | ``` 10 | 11 | 2. 进入到online文件夹中并创建虚拟环境并激活 12 | 13 | ``` 14 | cd online 15 | # 创建虚拟环境env 16 | python -m venv env 17 | # 激活虚拟环境 18 | source env/bin/activate 19 | 20 | # 可以使用deactivate关闭虚拟环境 21 | ``` 22 | 23 | ​ 注意:有些linux环境需用使用python3,pip3命令 24 | 25 | 3. 使用git,从远程库克隆项目(网络问题克隆不下来,直接通过xftp7传输的) 26 | 27 | ``` 28 | git clone https://github.com/wxmseu/mysite.git 29 | ``` 30 | 31 | 4. 进入到项目目录mysite 32 | 33 | ``` 34 | cd mysite 35 | ``` 36 | 37 | 5. 安装依赖 38 | 39 | ``` 40 | pip install -r requirements.txt 41 | ``` 42 | 43 | 6. 使用pip安装uwsgi 44 | 45 | ``` 46 | pip install uwsgi 47 | ``` 48 | 49 | 7. 测试uwsgi连接情况 50 | 51 | ``` 52 | uwsgi --http :8000 --wsgi-file test.py 53 | ``` 54 | 55 | ```python 56 | # test.py 57 | def application(env,start_response): 58 | start_response('208 0k',[('Content-Type','text/html')]) 59 | return [b"Hello World"] # python3 60 | # return ["Hello World"] # python2 61 | ``` 62 | 63 | 为了启动工程,可以用django自带的启动服务 64 | 65 | ``` 66 | python manage.py runserver 0.0.0.0:8000 67 | ``` 68 | 69 | 也可以用uswgi启动 70 | 71 | ``` 72 | uwsgi --http :8000 --module mysite.wsgi 73 | #.wsgi表示工程中wsgi.py文件 74 | ``` 75 | 76 | 8. 以上的uwsgi是在前台启动,很不稳定,我们可以用一个配置文件来启动, 77 | 78 | 在mysite文件下创建文件: 79 | 80 | ``` 81 | sudo vim uwsgi_params 82 | ``` 83 | 84 | ``` 85 | uwsgi_param QUERY_STRING $query_string; 86 | uwsgi_param REQUEST_METHOD $request_method; 87 | uwsgi_param CONTENT_TYPE $content_type; 88 | uwsgi_param CONTENT_LENGTH $content_length; 89 | uwsgi_param REQUEST_URI $request_uri; 90 | uwsgi_param PATH_INFO $document_uri; 91 | uwsgi_param DOCUMENT_ROOT $document_root; 92 | uwsgi_param SERVER_PROTOCOL $server_protocol; 93 | uwsgi_param REQUEST_SCHEME $scheme; 94 | uwsgi_param HTTPS $https if_not_empty; 95 | uwsgi_param REMOTE_ADDR $remote_addr; 96 | uwsgi_param REMOTE_PORT $remote_port; 97 | uwsgi_param SERVER_PORT $server_port; 98 | uwsgi_param SERVER_NAME $server_name; 99 | ``` 100 | 101 | 在mysite文件下创建文件: 102 | 103 | ``` 104 | sudo vim mysite_uwsgi.ini 105 | ``` 106 | 107 | ``` 108 | [uwsgi] 109 | # full path to Django project's root directory 110 | chdir = /home/ubuntu/online/mysite/ 111 | # Django's wsgi file 112 | module = mysite.wsgi 113 | # full path to python virtual env 114 | home = /home/ubuntu/online/env/ 115 | # enable uwsgi master process 116 | master = true 117 | # maximum number of worker processes 118 | processes = 10 119 | # the socket (use the full path to be safe 120 | socket = /home/ubuntu/online/mysite/mysite.sock 121 | # socket permissions 122 | chmod-socket = 666 123 | # clear environment on exit 124 | vacuum = true 125 | # daemonize uwsgi and write messages into given log 126 | daemonize = /home/ubuntu/online/mysite/uwsgi-emperor.log 127 | ``` 128 | 129 | 可以使用命令启动uwsgi 130 | 131 | ``` 132 | uwsgi --ini mysite_uwsgi.ini 133 | ``` 134 | 135 | 9. 设置uwsgi自动启动 136 | 137 | 创建systemd service file: 138 | 139 | ``` 140 | sudo vim /etc/systemd/system/server_uwsgi.service 141 | ``` 142 | 143 | ``` 144 | [Unit] 145 | Description=uwsgi emperor for mysite website 146 | After=network.target 147 | [Service] 148 | User=ubuntu 149 | Restart=always 150 | ExecStart=/home/ubuntu/online/bin/uwsgi --ini /home/ubuntu/demo/mysite/mysite_uwsgi.ini 151 | [Install] 152 | WantedBy=multi-user.target 153 | 154 | ``` 155 | 156 | 使用以下命令开机自动启动server_uwsgi.service服务 157 | 158 | ``` 159 | systemctl enable /etc/systemd/system/server_uwsgi.service 160 | ``` 161 | 162 | 10. 配置settings.py中allow host加入自己的域名,配置数据库 163 | 164 | ### nginx配置 165 | 166 | 为了避免在ip中指定端口,我们需要使用一个web server 来监听请求以及端口转发。这个web server 我们使用nginx 167 | 168 | 安装nginx: 169 | 170 | ``` 171 | sudo apt install nginx 172 | ``` 173 | 174 | 启动服务 175 | 176 | ``` 177 | sudo service nginx start 178 | ``` 179 | 180 | 创建conf文件 181 | 182 | ``` 183 | sudo vim /etc/nginx/sites-available/mysite_nginx.conf 184 | ``` 185 | 186 | ```nginx 187 | # mysite_nginx.conf 188 | # the upstream component nginx needs to connect to 189 | upstream django { 190 | server unix:///home/ubuntu/online/mysite/mysite.sock; # for a file socket 191 | # server 127.0.0.1:80; # for a web port socket (we'll use this first) 192 | } 193 | # configuration of the server 194 | 195 | # 配置https请求 196 | server { 197 | #SSL 默认访问端口号为 443 198 | listen 443 ssl; 199 | #请填写绑定证书的域名 200 | server_name wxmseu.cn, www.wxmseu.cn; 201 | #请填写证书文件的相对路径或绝对路径 202 | ssl_certificate /home/ubuntu/wxmseu.cn_nginx/wxmseu.cn_bundle.crt; 203 | #请填写私钥文件的相对路径或绝对路径 204 | ssl_certificate_key /home/ubuntu/wxmseu.cn_nginx/wxmseu.cn.key; 205 | ssl_session_timeout 5m; 206 | #请按照以下协议配置 207 | ssl_protocols TLSv1.2 TLSv1.3; 208 | #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。 209 | ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 210 | ssl_prefer_server_ciphers on; 211 | charset utf-8; 212 | 213 | # max upload size 214 | client_max_body_size 75M; # adjust to taste 215 | 216 | # Django media 217 | location /media { 218 | alias /home/ubuntu/online/mysite/media; # your Django project's media files - amend as required 219 | } 220 | location /static { 221 | alias /home/ubuntu/online/mysite/static; # your Django project's static files - amend as required 222 | } 223 | 224 | # finally,send all non-media requests to the Django server 225 | location / { 226 | uwsgi_pass django; 227 | include /home/ubuntu/online/mysite/uwsgi_params; # the uwsgi_params file you installed 228 | } 229 | } 230 | 231 | # 自动转发http——>https请求 232 | server { 233 | listen 80; 234 | #请填写绑定证书的域名 235 | server_name wxmseu.cn, www.wxmseu.cn; 236 | #把http的域名请求转成https 237 | return 301 https://$host$request_uri; 238 | } 239 | 240 | 241 | ``` 242 | 243 | 注意: 244 | 245 | ``` 246 | # nginx的默认日志路径为 247 | /var/log/nginx/error.log 248 | 249 | # 如果在日志中发现permission deny无权限的问题,可尝试将/etc/nginx/nginx.conf中第一行的user改为自己的用户名 250 | ``` 251 | 252 | 配置软链接 253 | 254 | ``` 255 | sudo ln -s /etc/nginx/sites-available/mysite_nginx.conf /etc/nginx/sites-enabled/ 256 | ``` 257 | 258 | 产看软链接 259 | 260 | ``` 261 | ll /etc/nginx/sites-enabled/ 262 | ``` 263 | 264 | 查看nginx.conf文件配置是否正确 265 | 266 | ``` 267 | sudo nginx -t 268 | ``` 269 | 270 | 当修改了nginx.conf需要重新加载配置 271 | 272 | ``` 273 | sudo nginx -s reload 274 | ``` 275 | 276 | 打开setting.py文件,在最下面配置静态文件和媒体文件路径: 277 | 278 | ``` 279 | sudo vim mysite/settings.py 280 | ``` 281 | 282 | ``` 283 | STATIC_URL = '/static/' 284 | STATIC_ROOT = BASE_DIR/'static' 285 | 286 | MEDIA_URL = '/media/' 287 | MEDIA_ROOT = BASE_DIR/'media' 288 | 289 | ``` 290 | 291 | 使用collectstatic指令完成静态文件的复制和映射: 292 | 293 | ``` 294 | python manage.py collectstatic 295 | ``` 296 | 297 | 创建media文件夹和static文件夹: 298 | 299 | ``` 300 | mkdir medie 301 | mkdir static 302 | ``` 303 | 304 | ### 数据库配置 305 | 306 | 安装依赖 307 | 308 | ``` 309 | sudo apt install libmysqlclient-dev 310 | ``` 311 | 312 | 安装mysqlclient: 313 | 314 | ``` 315 | pip install mysqlclient -i https://pypi.doubanio.com/simple/ 316 | ``` 317 | 318 | -------------------------------------------------------------------------------- /C++学习.md: -------------------------------------------------------------------------------- 1 | ### 指针 2 | 3 | 指针实际上是指向内存地址的整数,在命名的时候需要指出指针的类型,告诉计算机如何分配内存大小。 4 | 5 | ```c++ 6 | #include 7 | #define Log(x) std::cout<< x < 30 | struct Entry{ 31 | static int x,y; 32 | static void Print(){ 33 | std::cout< 60 | class Entry{ 61 | public: 62 | float x,y; 63 | // 不带参数的构造 64 | Entry(){ 65 | x=0.0f; 66 | y=0.0f; 67 | } 68 | // 带参数的构造函数 69 | Entry(float a,float b){ 70 | x=a; 71 | y=b; 72 | } 73 | }; 74 | 75 | int main() 76 | { 77 | Entry e; 78 | Entry e1(3,5); 79 | std::cout< 94 | class Entry{ 95 | public: 96 | float x,y; 97 | Entry(){ 98 | x=0.0f; 99 | y=0.0f; 100 | std::cout<<"created Entry!"< 127 | class Entity{ 128 | public: 129 | float X,Y; 130 | void Move(float xa,float ya ){ 131 | X+=xa; 132 | Y+=ya; 133 | } 134 | 135 | }; 136 | // 继承的写法 137 | class Player:public Entity{ 138 | public: 139 | const char* Name; 140 | void PrintName(){ 141 | std::cout<<"my name is:"< 180 | class Entity{ 181 | public: 182 | // virtual 标记为虚函数 183 | virtual std::string Getname(){ 184 | return "Entity"; 185 | } 186 | 187 | }; 188 | class Player:public Entity{ 189 | private: 190 | std::string m_Name; 191 | public: 192 | Player(const std::string& name) { 193 | m_Name=name; 194 | } 195 | // c++11中添加的override关键字,标记覆写函数 196 | std::string Getname () override { 197 | return m_Name; 198 | } 199 | }; 200 | 201 | int main() 202 | { 203 | Entity* e=new Entity(); 204 | std::cout<Getname()<Getname()<Getname()< 225 | #include 226 | class Printable{ 227 | public: 228 | // 纯虚函数的写法,有纯虚函数就不可以构造此类对象 229 | virtual std::string GetClassName()=0; 230 | }; 231 | 232 | class Entity :public Printable{ 233 | public: 234 | virtual std::string Getname() 235 | { 236 | return "Entity"; 237 | } 238 | std::string GetClassName() override { 239 | return "entity"; 240 | } 241 | }; 242 | 243 | class Player:public Entity{ 244 | private: 245 | std::string m_Name; 246 | public: 247 | Player(const std::string name) { 248 | m_Name=name; 249 | } 250 | std::string Getname () override { 251 | return m_Name; 252 | } 253 | std::string GetClassName() override { 254 | return "player"; 255 | } 256 | }; 257 | 258 | 259 | void Print(Printable* obj){ 260 | std::cout<GetClassName()<Getname()<Getname()<Getname()< 295 | #include 296 | int main() 297 | { 298 | // 两种创建的数组的生存期不一样 299 | // 第一种是在栈上创建,当到达main()函数的花括号最后,将在内存中销毁 300 | int nums[5]; 301 | // 第二种是在堆上创建,直到我们程序把它销毁前,他都处于活动状态。如果有一个函数返回一个数组, 302 | // 这个数组应当用new来创建,或者你传入的是一个数组的地址 303 | int* nums2=new int[5]; 304 | for(int i=0;i<5;i++){ 305 | nums[i]=i*i+1; 306 | } 307 | int count=sizeof(nums)/sizeof(int); 308 | // 对于原始数组来说,用此种方式来计算数组的大小 309 | std::cout<<"nums的元素个数为:"< nums3; 321 | for(int i=0;i 343 | #include 344 | // 这里的参数如果写成void Print(string str) 表示将复制一份str到内存中,如果这是一个只读的str将会损耗内存 345 | void Print(const std::string& string){ 346 | std::string res="hi!"; 347 | res+=string; 348 | std::cout<\n", 50 | "\n", 63 | "\n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | "
ABCD
00123
14567
2891011
\n", 97 | "" 98 | ], 99 | "text/plain": [ 100 | " A B C D\n", 101 | "0 0 1 2 3\n", 102 | "1 4 5 6 7\n", 103 | "2 8 9 10 11" 104 | ] 105 | }, 106 | "execution_count": 3, 107 | "metadata": {}, 108 | "output_type": "execute_result" 109 | } 110 | ], 111 | "source": [ 112 | "df" 113 | ] 114 | }, 115 | { 116 | "attachments": {}, 117 | "cell_type": "markdown", 118 | "metadata": {}, 119 | "source": [ 120 | "1. 单列drop,就是删除某一列" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": 4, 126 | "metadata": {}, 127 | "outputs": [ 128 | { 129 | "data": { 130 | "text/html": [ 131 | "
\n", 132 | "\n", 145 | "\n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | "
BCD
0123
1567
291011
\n", 175 | "
" 176 | ], 177 | "text/plain": [ 178 | " B C D\n", 179 | "0 1 2 3\n", 180 | "1 5 6 7\n", 181 | "2 9 10 11" 182 | ] 183 | }, 184 | "execution_count": 4, 185 | "metadata": {}, 186 | "output_type": "execute_result" 187 | } 188 | ], 189 | "source": [ 190 | "# 代表的就是删除某列\n", 191 | "df.drop('A',axis=1)" 192 | ] 193 | }, 194 | { 195 | "attachments": {}, 196 | "cell_type": "markdown", 197 | "metadata": {}, 198 | "source": [ 199 | "2. 单行drop,就是删除某一行" 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": 6, 205 | "metadata": {}, 206 | "outputs": [ 207 | { 208 | "data": { 209 | "text/html": [ 210 | "
\n", 211 | "\n", 224 | "\n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | "
ABCD
00123
2891011
\n", 251 | "
" 252 | ], 253 | "text/plain": [ 254 | " A B C D\n", 255 | "0 0 1 2 3\n", 256 | "2 8 9 10 11" 257 | ] 258 | }, 259 | "execution_count": 6, 260 | "metadata": {}, 261 | "output_type": "execute_result" 262 | } 263 | ], 264 | "source": [ 265 | "# 代表的就是删除某行\n", 266 | "df.drop(1,axis=0)" 267 | ] 268 | }, 269 | { 270 | "attachments": {}, 271 | "cell_type": "markdown", 272 | "metadata": {}, 273 | "source": [ 274 | "3. 按axis=0/index执行mean聚合\n", 275 | "反直觉:输出的不是每行的结果" 276 | ] 277 | }, 278 | { 279 | "cell_type": "code", 280 | "execution_count": 7, 281 | "metadata": {}, 282 | "outputs": [ 283 | { 284 | "data": { 285 | "text/html": [ 286 | "
\n", 287 | "\n", 300 | "\n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | "
ABCD
00123
14567
2891011
\n", 334 | "
" 335 | ], 336 | "text/plain": [ 337 | " A B C D\n", 338 | "0 0 1 2 3\n", 339 | "1 4 5 6 7\n", 340 | "2 8 9 10 11" 341 | ] 342 | }, 343 | "execution_count": 7, 344 | "metadata": {}, 345 | "output_type": "execute_result" 346 | } 347 | ], 348 | "source": [ 349 | "df" 350 | ] 351 | }, 352 | { 353 | "cell_type": "code", 354 | "execution_count": 8, 355 | "metadata": {}, 356 | "outputs": [ 357 | { 358 | "data": { 359 | "text/plain": [ 360 | "A 4.0\n", 361 | "B 5.0\n", 362 | "C 6.0\n", 363 | "D 7.0\n", 364 | "dtype: float64" 365 | ] 366 | }, 367 | "execution_count": 8, 368 | "metadata": {}, 369 | "output_type": "execute_result" 370 | } 371 | ], 372 | "source": [ 373 | "# axis=0 or axis=index\n", 374 | "df.mean(axis=0)" 375 | ] 376 | }, 377 | { 378 | "attachments": {}, 379 | "cell_type": "markdown", 380 | "metadata": {}, 381 | "source": [ 382 | "4. 再次举例,加深理解" 383 | ] 384 | }, 385 | { 386 | "cell_type": "code", 387 | "execution_count": 10, 388 | "metadata": {}, 389 | "outputs": [ 390 | { 391 | "data": { 392 | "text/html": [ 393 | "
\n", 394 | "\n", 407 | "\n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | "
ABCD
00123
14567
2891011
\n", 441 | "
" 442 | ], 443 | "text/plain": [ 444 | " A B C D\n", 445 | "0 0 1 2 3\n", 446 | "1 4 5 6 7\n", 447 | "2 8 9 10 11" 448 | ] 449 | }, 450 | "execution_count": 10, 451 | "metadata": {}, 452 | "output_type": "execute_result" 453 | } 454 | ], 455 | "source": [ 456 | "df" 457 | ] 458 | }, 459 | { 460 | "cell_type": "code", 461 | "execution_count": 15, 462 | "metadata": {}, 463 | "outputs": [], 464 | "source": [ 465 | "def get_sum_value(x):\n", 466 | " return x['A']+x['B']+x['C']+x['D']\n", 467 | "\n", 468 | "df['sum']=df.apply(get_sum_value,axis=1)" 469 | ] 470 | }, 471 | { 472 | "cell_type": "code", 473 | "execution_count": 13, 474 | "metadata": {}, 475 | "outputs": [ 476 | { 477 | "data": { 478 | "text/html": [ 479 | "
\n", 480 | "\n", 493 | "\n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | "
ABCDsum
001236
1456722
289101138
\n", 531 | "
" 532 | ], 533 | "text/plain": [ 534 | " A B C D sum\n", 535 | "0 0 1 2 3 6\n", 536 | "1 4 5 6 7 22\n", 537 | "2 8 9 10 11 38" 538 | ] 539 | }, 540 | "execution_count": 13, 541 | "metadata": {}, 542 | "output_type": "execute_result" 543 | } 544 | ], 545 | "source": [ 546 | "df" 547 | ] 548 | } 549 | ], 550 | "metadata": { 551 | "kernelspec": { 552 | "display_name": "Python 3", 553 | "language": "python", 554 | "name": "python3" 555 | }, 556 | "language_info": { 557 | "codemirror_mode": { 558 | "name": "ipython", 559 | "version": 3 560 | }, 561 | "file_extension": ".py", 562 | "mimetype": "text/x-python", 563 | "name": "python", 564 | "nbconvert_exporter": "python", 565 | "pygments_lexer": "ipython3", 566 | "version": "3.10.8" 567 | }, 568 | "orig_nbformat": 4 569 | }, 570 | "nbformat": 4, 571 | "nbformat_minor": 2 572 | } 573 | -------------------------------------------------------------------------------- /pandas_demo/字符串处理.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "attachments": {}, 5 | "cell_type": "markdown", 6 | "metadata": {}, 7 | "source": [ 8 | "pandas字符串处理\n", 9 | "前面我们一ing使用了字符串的处理函数:\n", 10 | "df['最高温'].str.replace('°','').astype('int32')" 11 | ] 12 | }, 13 | { 14 | "attachments": {}, 15 | "cell_type": "markdown", 16 | "metadata": {}, 17 | "source": [ 18 | "pandas的字符串处理:\n", 19 | "1. 使用方法:先获取series的str属性,然后在属性上调用函数\n", 20 | "2. 只能在字符串列上使用,不能在数字列上使用\n", 21 | "3. df上没有str属性的处理方法\n", 22 | "4. series.str并不是python原生字符串,而是自己的一套方法,不过大部分和原生str相似" 23 | ] 24 | }, 25 | { 26 | "attachments": {}, 27 | "cell_type": "markdown", 28 | "metadata": {}, 29 | "source": [ 30 | "本节演示内容:\n", 31 | "1. 获取series的str属性,然后使用各种字符串处理函数\n", 32 | "2. 使用str的startswith、contains等bool类series可以做条件查询\n", 33 | "3. 需要多次str处理的链式操作\n", 34 | "4. 使用正则表达式的处理" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 1, 40 | "metadata": {}, 41 | "outputs": [], 42 | "source": [ 43 | "import pandas as pd\n", 44 | "df=pd.read_excel('./weater_beijing.xlsx')" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 2, 50 | "metadata": {}, 51 | "outputs": [ 52 | { 53 | "data": { 54 | "text/plain": [ 55 | "日期 object\n", 56 | "最高温 object\n", 57 | "最低温 object\n", 58 | "天气 object\n", 59 | "风力风向 object\n", 60 | "空气质量指数 object\n", 61 | "dtype: object" 62 | ] 63 | }, 64 | "execution_count": 2, 65 | "metadata": {}, 66 | "output_type": "execute_result" 67 | } 68 | ], 69 | "source": [ 70 | "df.dtypes" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 3, 76 | "metadata": {}, 77 | "outputs": [ 78 | { 79 | "data": { 80 | "text/html": [ 81 | "
\n", 82 | "\n", 95 | "\n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | "
日期最高温最低温天气风力风向空气质量指数
02011-01-01 周六-2°-7°多云~阴无持续风向微风NaN
12011-01-02 周日-2°-7°多云无持续风向微风NaN
22011-01-03 周一-2°-6°多云~阴西北风~北风3-4级~4-5级NaN
32011-01-04 周二-2°-9°北风5-6级NaN
42011-01-05 周三-2°-10°北风~无持续风向3-4级~微风NaN
\n", 155 | "
" 156 | ], 157 | "text/plain": [ 158 | " 日期 最高温 最低温 天气 风力风向 空气质量指数\n", 159 | "0 2011-01-01 周六 -2° -7° 多云~阴 无持续风向微风 NaN\n", 160 | "1 2011-01-02 周日 -2° -7° 多云 无持续风向微风 NaN\n", 161 | "2 2011-01-03 周一 -2° -6° 多云~阴 西北风~北风3-4级~4-5级 NaN\n", 162 | "3 2011-01-04 周二 -2° -9° 晴 北风5-6级 NaN\n", 163 | "4 2011-01-05 周三 -2° -10° 晴 北风~无持续风向3-4级~微风 NaN" 164 | ] 165 | }, 166 | "execution_count": 3, 167 | "metadata": {}, 168 | "output_type": "execute_result" 169 | } 170 | ], 171 | "source": [ 172 | "df.head()" 173 | ] 174 | }, 175 | { 176 | "attachments": {}, 177 | "cell_type": "markdown", 178 | "metadata": {}, 179 | "source": [ 180 | "1. 获取series的str属性,使用各种字符串处理函数" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": 4, 186 | "metadata": {}, 187 | "outputs": [ 188 | { 189 | "data": { 190 | "text/plain": [ 191 | "" 192 | ] 193 | }, 194 | "execution_count": 4, 195 | "metadata": {}, 196 | "output_type": "execute_result" 197 | } 198 | ], 199 | "source": [ 200 | "df['日期'].str" 201 | ] 202 | }, 203 | { 204 | "cell_type": "code", 205 | "execution_count": 6, 206 | "metadata": {}, 207 | "outputs": [ 208 | { 209 | "data": { 210 | "text/plain": [ 211 | "0 -7\n", 212 | "1 -7\n", 213 | "2 -6\n", 214 | "3 -9\n", 215 | "4 -10\n", 216 | " ... \n", 217 | "4001 -8\n", 218 | "4002 -5\n", 219 | "4003 -5\n", 220 | "4004 -7\n", 221 | "4005 -7\n", 222 | "Name: 最低温, Length: 4006, dtype: object" 223 | ] 224 | }, 225 | "execution_count": 6, 226 | "metadata": {}, 227 | "output_type": "execute_result" 228 | } 229 | ], 230 | "source": [ 231 | "# 字符串替代函数\n", 232 | "df['最低温'].str.replace('°','')" 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": 7, 238 | "metadata": {}, 239 | "outputs": [ 240 | { 241 | "data": { 242 | "text/plain": [ 243 | "0 False\n", 244 | "1 False\n", 245 | "2 False\n", 246 | "3 False\n", 247 | "4 False\n", 248 | " ... \n", 249 | "4001 False\n", 250 | "4002 False\n", 251 | "4003 False\n", 252 | "4004 False\n", 253 | "4005 False\n", 254 | "Name: 最高温, Length: 4006, dtype: bool" 255 | ] 256 | }, 257 | "execution_count": 7, 258 | "metadata": {}, 259 | "output_type": "execute_result" 260 | } 261 | ], 262 | "source": [ 263 | "# 判断是不是数字\n", 264 | "df['最高温'].str.isnumeric()" 265 | ] 266 | }, 267 | { 268 | "attachments": {}, 269 | "cell_type": "markdown", 270 | "metadata": {}, 271 | "source": [ 272 | "2. 使用str的startswith、contains等得到bool的series可以做条件查询" 273 | ] 274 | }, 275 | { 276 | "cell_type": "code", 277 | "execution_count": 8, 278 | "metadata": {}, 279 | "outputs": [], 280 | "source": [ 281 | "condition=df['日期'].str.startswith('2018-01')" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "execution_count": 9, 287 | "metadata": {}, 288 | "outputs": [ 289 | { 290 | "data": { 291 | "text/plain": [ 292 | "0 False\n", 293 | "1 False\n", 294 | "2 False\n", 295 | "3 False\n", 296 | "4 False\n", 297 | " ... \n", 298 | "4001 False\n", 299 | "4002 False\n", 300 | "4003 False\n", 301 | "4004 False\n", 302 | "4005 False\n", 303 | "Name: 日期, Length: 4006, dtype: bool" 304 | ] 305 | }, 306 | "execution_count": 9, 307 | "metadata": {}, 308 | "output_type": "execute_result" 309 | } 310 | ], 311 | "source": [ 312 | "condition" 313 | ] 314 | }, 315 | { 316 | "cell_type": "code", 317 | "execution_count": 10, 318 | "metadata": {}, 319 | "outputs": [ 320 | { 321 | "data": { 322 | "text/html": [ 323 | "
\n", 324 | "\n", 337 | "\n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | "
日期最高温最低温天气风力风向空气质量指数
25452018-01-01 周一-6°晴~多云东北风1-2级59 良
25462018-01-02 周二-5°阴~多云东北风1-2级49 优
25472018-01-03 周三-5°多云北风1-2级28 优
25482018-01-04 周四-8°东北风1-2级28 优
25492018-01-05 周五-6°多云~晴西北风1-2级50 优
\n", 397 | "
" 398 | ], 399 | "text/plain": [ 400 | " 日期 最高温 最低温 天气 风力风向 空气质量指数\n", 401 | "2545 2018-01-01 周一 3° -6° 晴~多云 东北风1-2级 59 良\n", 402 | "2546 2018-01-02 周二 2° -5° 阴~多云 东北风1-2级 49 优\n", 403 | "2547 2018-01-03 周三 2° -5° 多云 北风1-2级 28 优\n", 404 | "2548 2018-01-04 周四 0° -8° 阴 东北风1-2级 28 优\n", 405 | "2549 2018-01-05 周五 3° -6° 多云~晴 西北风1-2级 50 优" 406 | ] 407 | }, 408 | "execution_count": 10, 409 | "metadata": {}, 410 | "output_type": "execute_result" 411 | } 412 | ], 413 | "source": [ 414 | "df[condition].head()" 415 | ] 416 | }, 417 | { 418 | "attachments": {}, 419 | "cell_type": "markdown", 420 | "metadata": {}, 421 | "source": [ 422 | "3. 需要多次str处理的链式操作\n", 423 | "怎么提取201803这样的数字月份\n", 424 | " 1. 先将日期2018-03-31替换成20180331的形式\n", 425 | " 2. 提取月份字符串201803" 426 | ] 427 | }, 428 | { 429 | "cell_type": "code", 430 | "execution_count": 11, 431 | "metadata": {}, 432 | "outputs": [ 433 | { 434 | "data": { 435 | "text/plain": [ 436 | "0 201101\n", 437 | "1 201101\n", 438 | "2 201101\n", 439 | "3 201101\n", 440 | "4 201101\n", 441 | " ... \n", 442 | "4001 202112\n", 443 | "4002 202112\n", 444 | "4003 202112\n", 445 | "4004 202112\n", 446 | "4005 202112\n", 447 | "Name: 日期, Length: 4006, dtype: object" 448 | ] 449 | }, 450 | "execution_count": 11, 451 | "metadata": {}, 452 | "output_type": "execute_result" 453 | } 454 | ], 455 | "source": [ 456 | "df['日期'].str.replace('-','').str[:6]\n", 457 | "# df['日期'].str.replace('-','').str.slice(0,6) series.replace后得到的仍然是一个series,需要再调用str才能使用str方法" 458 | ] 459 | }, 460 | { 461 | "attachments": {}, 462 | "cell_type": "markdown", 463 | "metadata": {}, 464 | "source": [ 465 | "4. 使用正则表达式的处理" 466 | ] 467 | }, 468 | { 469 | "cell_type": "code", 470 | "execution_count": 13, 471 | "metadata": {}, 472 | "outputs": [], 473 | "source": [ 474 | "# 添加新列\n", 475 | "def get_nianyueri(x):\n", 476 | " date=x['日期'].split(' ')[0]\n", 477 | " year,month,day=date.split('-')\n", 478 | " return f'{year}年{month}月{day}日'\n", 479 | "\n", 480 | "df['中文日期']=df.apply(get_nianyueri,axis=1)" 481 | ] 482 | }, 483 | { 484 | "cell_type": "code", 485 | "execution_count": 14, 486 | "metadata": {}, 487 | "outputs": [ 488 | { 489 | "data": { 490 | "text/plain": [ 491 | "0 2011年01月01日\n", 492 | "1 2011年01月02日\n", 493 | "2 2011年01月03日\n", 494 | "3 2011年01月04日\n", 495 | "4 2011年01月05日\n", 496 | " ... \n", 497 | "4001 2021年12月27日\n", 498 | "4002 2021年12月28日\n", 499 | "4003 2021年12月29日\n", 500 | "4004 2021年12月30日\n", 501 | "4005 2021年12月31日\n", 502 | "Name: 中文日期, Length: 4006, dtype: object" 503 | ] 504 | }, 505 | "execution_count": 14, 506 | "metadata": {}, 507 | "output_type": "execute_result" 508 | } 509 | ], 510 | "source": [ 511 | "df['中文日期']" 512 | ] 513 | }, 514 | { 515 | "attachments": {}, 516 | "cell_type": "markdown", 517 | "metadata": {}, 518 | "source": [ 519 | "问题:怎么样将2018年12月31日中的 年月日三个中文字去掉" 520 | ] 521 | }, 522 | { 523 | "cell_type": "code", 524 | "execution_count": null, 525 | "metadata": {}, 526 | "outputs": [], 527 | "source": [ 528 | "# 方法1:链式replace\n", 529 | "df['中文日期'].str.replace(\"年\",'').str.replace('月','').str.replace('日','')" 530 | ] 531 | }, 532 | { 533 | "attachments": {}, 534 | "cell_type": "markdown", 535 | "metadata": {}, 536 | "source": [ 537 | "series.str默认开启了正则表达式模块" 538 | ] 539 | }, 540 | { 541 | "cell_type": "code", 542 | "execution_count": 15, 543 | "metadata": {}, 544 | "outputs": [ 545 | { 546 | "name": "stderr", 547 | "output_type": "stream", 548 | "text": [ 549 | "C:\\Users\\JDQ\\AppData\\Local\\Temp\\ipykernel_17508\\171965364.py:2: FutureWarning: The default value of regex will change from True to False in a future version.\n", 550 | " df['中文日期'].str.replace('[年月日]','')\n" 551 | ] 552 | }, 553 | { 554 | "data": { 555 | "text/plain": [ 556 | "0 20110101\n", 557 | "1 20110102\n", 558 | "2 20110103\n", 559 | "3 20110104\n", 560 | "4 20110105\n", 561 | " ... \n", 562 | "4001 20211227\n", 563 | "4002 20211228\n", 564 | "4003 20211229\n", 565 | "4004 20211230\n", 566 | "4005 20211231\n", 567 | "Name: 中文日期, Length: 4006, dtype: object" 568 | ] 569 | }, 570 | "execution_count": 15, 571 | "metadata": {}, 572 | "output_type": "execute_result" 573 | } 574 | ], 575 | "source": [ 576 | "# 方法2:正则表达式替换\n", 577 | "df['中文日期'].str.replace('[年月日]','')" 578 | ] 579 | } 580 | ], 581 | "metadata": { 582 | "kernelspec": { 583 | "display_name": "Python 3", 584 | "language": "python", 585 | "name": "python3" 586 | }, 587 | "language_info": { 588 | "codemirror_mode": { 589 | "name": "ipython", 590 | "version": 3 591 | }, 592 | "file_extension": ".py", 593 | "mimetype": "text/x-python", 594 | "name": "python", 595 | "nbconvert_exporter": "python", 596 | "pygments_lexer": "ipython3", 597 | "version": "3.10.8" 598 | }, 599 | "orig_nbformat": 4 600 | }, 601 | "nbformat": 4, 602 | "nbformat_minor": 2 603 | } 604 | -------------------------------------------------------------------------------- /vue3快速上手.md: -------------------------------------------------------------------------------- 1 | # Vue3快速上手 2 | 3 | 4 | 5 | 6 | 7 | ## 1.Vue3简介 8 | 9 | - 2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王) 10 | - 耗时2年多、[2600+次提交](https://github.com/vuejs/vue-next/graphs/commit-activity)、[30+个RFC](https://github.com/vuejs/rfcs/tree/master/active-rfcs)、[600+次PR](https://github.com/vuejs/vue-next/pulls?q=is%3Apr+is%3Amerged+-author%3Aapp%2Fdependabot-preview+)、[99位贡献者](https://github.com/vuejs/vue-next/graphs/contributors) 11 | - github上的tags地址:https://github.com/vuejs/vue-next/releases/tag/v3.0.0 12 | 13 | ## 2.Vue3带来了什么 14 | 15 | ### 1.性能的提升 16 | 17 | - 打包大小减少41% 18 | 19 | - 初次渲染快55%, 更新渲染快133% 20 | 21 | - 内存减少54% 22 | 23 | ...... 24 | 25 | ### 2.源码的升级 26 | 27 | - 使用Proxy代替defineProperty实现响应式 28 | 29 | - 重写虚拟DOM的实现和Tree-Shaking 30 | 31 | ...... 32 | 33 | ### 3.拥抱TypeScript 34 | 35 | - Vue3可以更好的支持TypeScript 36 | 37 | ### 4.新的特性 38 | 39 | 1. Composition API(组合API) 40 | 41 | - setup配置 42 | - ref与reactive 43 | - watch与watchEffect 44 | - provide与inject 45 | - ...... 46 | 2. 新的内置组件 47 | - Fragment 48 | - Teleport 49 | - Suspense 50 | 3. 其他改变 51 | 52 | - 新的生命周期钩子 53 | - data 选项应始终被声明为一个函数 54 | - 移除keyCode支持作为 v-on 的修饰符 55 | - ...... 56 | 57 | # 一、创建Vue3.0工程 58 | 59 | ## 1.使用 vue-cli 创建 60 | 61 | 官方文档:https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create 62 | 63 | ```bash 64 | ## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上 65 | vue --version 66 | ## 安装或者升级你的@vue/cli 67 | npm install -g @vue/cli 68 | ## 创建 69 | vue create vue_test 70 | ## 启动 71 | cd vue_test 72 | npm run serve 73 | ``` 74 | 75 | ## 2.使用 vite 创建 76 | 77 | 官方文档:https://v3.cn.vuejs.org/guide/installation.html#vite 78 | 79 | vite官网:https://vitejs.cn 80 | 81 | - 什么是vite?—— 新一代前端构建工具。 82 | - 优势如下: 83 | - 开发环境中,无需打包操作,可快速的冷启动。 84 | - 轻量快速的热重载(HMR)。 85 | - 真正的按需编译,不再等待整个应用编译完成。 86 | - 传统构建 与 vite构建对比图 87 | 88 | 89 | 90 | ```bash 91 | ## 创建工程 92 | npm init vite-app 93 | ## 进入工程目录 94 | cd 95 | ## 安装依赖 96 | npm install 97 | ## 运行 98 | npm run dev 99 | ``` 100 | 101 | # 二、常用 Composition API 102 | 103 | 官方文档: https://v3.cn.vuejs.org/guide/composition-api-introduction.html 104 | 105 | ## 1.拉开序幕的setup 106 | 107 | 1. 理解:Vue3.0中一个新的配置项,值为一个函数。 108 | 2. setup是所有Composition API(组合API)“ 表演的舞台 ”。 109 | 4. 组件中所用到的:数据、方法等等,均要配置在setup中。 110 | 5. setup函数的两种返回值: 111 | 1. 若返回一个对象,则对象中的属性、方法, 在模板中均可以直接使用。(重点关注!) 112 | 2. 若返回一个渲染函数:则可以自定义渲染内容。(了解) 113 | 6. 注意点: 114 | 1. 尽量不要与Vue2.x配置混用 115 | - Vue2.x配置(data、methos、computed...)中可以访问到setup中的属性、方法。 116 | - 但在setup中不能访问到Vue2.x配置(data、methos、computed...)。 117 | - 如果有重名, setup优先。 118 | 2. setup不能是一个async函数,因为返回值不再是return的对象, 而是promise, 模板看不到return对象中的属性。(后期也可以返回一个Promise实例,但需要Suspense和异步组件的配合) 119 | 120 | ## 2.ref函数 121 | 122 | - 作用: 定义一个响应式的数据 123 | - 语法: ```const xxx = ref(initValue)``` 124 | - 创建一个包含响应式数据的引用对象(reference对象,简称ref对象)。 125 | - JS中操作数据: ```xxx.value``` 126 | - 模板中读取数据: 不需要.value,直接:```
{{xxx}}
``` 127 | - 备注: 128 | - 接收的数据可以是:基本类型、也可以是对象类型。 129 | - 基本类型的数据:响应式依然是靠``Object.defineProperty()``的```get```与```set```完成的。 130 | - 对象类型的数据:内部 “ 求助 ” 了Vue3.0中的一个新函数—— ```reactive```函数。 131 | 132 | ## 3.reactive函数 133 | 134 | - 作用: 定义一个对象类型的响应式数据(基本类型不要用它,要用```ref```函数) 135 | - 语法:```const 代理对象= reactive(源对象)```接收一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称proxy对象) 136 | - reactive定义的响应式数据是“深层次的”。 137 | - 内部基于 ES6 的 Proxy 实现,通过代理对象操作源对象内部数据进行操作。 138 | 139 | ## 4.Vue3.0中的响应式原理 140 | 141 | ### vue2.x的响应式 142 | 143 | - 实现原理: 144 | - 对象类型:通过```Object.defineProperty()```对属性的读取、修改进行拦截(数据劫持)。 145 | 146 | - 数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。 147 | 148 | ```js 149 | Object.defineProperty(data, 'count', { 150 | get () {}, 151 | set () {} 152 | }) 153 | ``` 154 | 155 | - 存在问题: 156 | - 新增属性、删除属性, 界面不会更新。 157 | - 直接通过下标修改数组, 界面不会自动更新。 158 | 159 | ### Vue3.0的响应式 160 | 161 | - 实现原理: 162 | - 通过Proxy(代理): 拦截对象中任意属性的变化, 包括:属性值的读写、属性的添加、属性的删除等。 163 | - 通过Reflect(反射): 对源对象的属性进行操作。 164 | - MDN文档中描述的Proxy与Reflect: 165 | - Proxy:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy 166 | 167 | - Reflect:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect 168 | 169 | ```js 170 | new Proxy(data, { 171 | // 拦截读取属性值 172 | get (target, prop) { 173 | return Reflect.get(target, prop) 174 | }, 175 | // 拦截设置属性值或添加新属性 176 | set (target, prop, value) { 177 | return Reflect.set(target, prop, value) 178 | }, 179 | // 拦截删除属性 180 | deleteProperty (target, prop) { 181 | return Reflect.deleteProperty(target, prop) 182 | } 183 | }) 184 | 185 | proxy.name = 'tom' 186 | ``` 187 | 188 | ## 5.reactive对比ref 189 | 190 | - 从定义数据角度对比: 191 | - ref用来定义:基本类型数据。 192 | - reactive用来定义:对象(或数组)类型数据。 193 | - 备注:ref也可以用来定义对象(或数组)类型数据, 它内部会自动通过```reactive```转为代理对象。 194 | - 从原理角度对比: 195 | - ref通过``Object.defineProperty()``的```get```与```set```来实现响应式(数据劫持)。 196 | - reactive通过使用Proxy来实现响应式(数据劫持), 并通过Reflect操作源对象内部的数据。 197 | - 从使用角度对比: 198 | - ref定义的数据:操作数据需要```.value```,读取数据时模板中直接读取不需要```.value```。 199 | - reactive定义的数据:操作数据与读取数据:均不需要```.value```。 200 | 201 | ## 6.setup的两个注意点 202 | 203 | - setup执行的时机 204 | - 在beforeCreate之前执行一次,this是undefined。 205 | 206 | - setup的参数 207 | - props:值为对象,包含:组件外部传递过来,且组件内部声明接收了的属性。 208 | - context:上下文对象 209 | - attrs: 值为对象,包含:组件外部传递过来,但没有在props配置中声明的属性, 相当于 ```this.$attrs```。 210 | - slots: 收到的插槽内容, 相当于 ```this.$slots```。 211 | - emit: 分发自定义事件的函数, 相当于 ```this.$emit```。 212 | 213 | 214 | ## 7.计算属性与监视 215 | 216 | ### 1.computed函数 217 | 218 | - 与Vue2.x中computed配置功能一致 219 | 220 | - 写法 221 | 222 | ```js 223 | import {computed} from 'vue' 224 | 225 | setup(){ 226 | ... 227 | //计算属性——简写 228 | let fullName = computed(()=>{ 229 | return person.firstName + '-' + person.lastName 230 | }) 231 | //计算属性——完整 232 | let fullName = computed({ 233 | get(){ 234 | return person.firstName + '-' + person.lastName 235 | }, 236 | set(value){ 237 | const nameArr = value.split('-') 238 | person.firstName = nameArr[0] 239 | person.lastName = nameArr[1] 240 | } 241 | }) 242 | } 243 | ``` 244 | 245 | ### 2.watch函数 246 | 247 | - 与Vue2.x中watch配置功能一致 248 | 249 | - 两个小“坑”: 250 | 251 | - 监视reactive定义的响应式数据时:oldValue无法正确获取、强制开启了深度监视(deep配置失效)。 252 | - 监视reactive定义的响应式数据中某个属性时:deep配置有效。 253 | 254 | ```js 255 | //情况一:监视ref定义的响应式数据 256 | watch(sum,(newValue,oldValue)=>{ 257 | console.log('sum变化了',newValue,oldValue) 258 | },{immediate:true}) 259 | 260 | //情况二:监视多个ref定义的响应式数据 261 | watch([sum,msg],(newValue,oldValue)=>{ 262 | console.log('sum或msg变化了',newValue,oldValue) 263 | }) 264 | 265 | /* 情况三:监视reactive定义的响应式数据 266 | 若watch监视的是reactive定义的响应式数据,则无法正确获得oldValue!! 267 | 若watch监视的是reactive定义的响应式数据,则强制开启了深度监视 268 | */ 269 | watch(person,(newValue,oldValue)=>{ 270 | console.log('person变化了',newValue,oldValue) 271 | },{immediate:true,deep:false}) //此处的deep配置不再奏效 272 | 273 | //情况四:监视reactive定义的响应式数据中的某个属性 274 | watch(()=>person.job,(newValue,oldValue)=>{ 275 | console.log('person的job变化了',newValue,oldValue) 276 | },{immediate:true,deep:true}) 277 | 278 | //情况五:监视reactive定义的响应式数据中的某些属性 279 | watch([()=>person.job,()=>person.name],(newValue,oldValue)=>{ 280 | console.log('person的job变化了',newValue,oldValue) 281 | },{immediate:true,deep:true}) 282 | 283 | //特殊情况 284 | watch(()=>person.job,(newValue,oldValue)=>{ 285 | console.log('person的job变化了',newValue,oldValue) 286 | },{deep:true}) //此处由于监视的是reactive素定义的对象中的某个属性,所以deep配置有效 287 | ``` 288 | 289 | ### 3.watchEffect函数 290 | 291 | - watch的套路是:既要指明监视的属性,也要指明监视的回调。 292 | 293 | - watchEffect的套路是:不用指明监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性。 294 | 295 | - watchEffect有点像computed: 296 | 297 | - 但computed注重的计算出来的值(回调函数的返回值),所以必须要写返回值。 298 | - 而watchEffect更注重的是过程(回调函数的函数体),所以不用写返回值。 299 | 300 | ```js 301 | //watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调。 302 | watchEffect(()=>{ 303 | const x1 = sum.value 304 | const x2 = person.age 305 | console.log('watchEffect配置的回调执行了') 306 | }) 307 | ``` 308 | 309 | ## 8.生命周期 310 | 311 | 312 | 313 | - Vue3.0中可以继续使用Vue2.x中的生命周期钩子,但有有两个被更名: 314 | - ```beforeDestroy```改名为 ```beforeUnmount``` 315 | - ```destroyed```改名为 ```unmounted``` 316 | - Vue3.0也提供了 Composition API 形式的生命周期钩子,与Vue2.x中钩子对应关系如下: 317 | - `beforeCreate`===>`setup()` 318 | - `created`=======>`setup()` 319 | - `beforeMount` ===>`onBeforeMount` 320 | - `mounted`=======>`onMounted` 321 | - `beforeUpdate`===>`onBeforeUpdate` 322 | - `updated` =======>`onUpdated` 323 | - `beforeUnmount` ==>`onBeforeUnmount` 324 | - `unmounted` =====>`onUnmounted` 325 | 326 | ## 9.自定义hook函数 327 | 328 | - 什么是hook?—— 本质是一个函数,把setup函数中使用的Composition API进行了封装。 329 | 330 | - 类似于vue2.x中的mixin。 331 | 332 | - 自定义hook的优势: 复用代码, 让setup中的逻辑更清楚易懂。 333 | 334 | 335 | 336 | ## 10.toRef 337 | 338 | - 作用:创建一个 ref 对象,其value值指向另一个对象中的某个属性。 339 | - 语法:```const name = toRef(person,'name')``` 340 | - 应用: 要将响应式对象中的某个属性单独提供给外部使用时。 341 | 342 | 343 | - 扩展:```toRefs``` 与```toRef```功能一致,但可以批量创建多个 ref 对象,语法:```toRefs(person)``` 344 | 345 | 346 | # 三、其它 Composition API 347 | 348 | ## 1.shallowReactive 与 shallowRef 349 | 350 | - shallowReactive:只处理对象最外层属性的响应式(浅响应式)。 351 | - shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理。 352 | 353 | - 什么时候使用? 354 | - 如果有一个对象数据,结构比较深, 但变化时只是外层属性变化 ===> shallowReactive。 355 | - 如果有一个对象数据,后续功能不会修改该对象中的属性,而是生新的对象来替换 ===> shallowRef。 356 | 357 | ## 2.readonly 与 shallowReadonly 358 | 359 | - readonly: 让一个响应式数据变为只读的(深只读)。 360 | - shallowReadonly:让一个响应式数据变为只读的(浅只读)。 361 | - 应用场景: 不希望数据被修改时。 362 | 363 | ## 3.toRaw 与 markRaw 364 | 365 | - toRaw: 366 | - 作用:将一个由```reactive```生成的响应式对象转为普通对象。 367 | - 使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新。 368 | - markRaw: 369 | - 作用:标记一个对象,使其永远不会再成为响应式对象。 370 | - 应用场景: 371 | 1. 有些值不应被设置为响应式的,例如复杂的第三方类库等。 372 | 2. 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。 373 | 374 | ## 4.customRef 375 | 376 | - 作用:创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制。 377 | 378 | - 实现防抖效果: 379 | 380 | ```vue 381 | 385 | 386 | 419 | ``` 420 | 421 | 422 | 423 | ## 5.provide 与 inject 424 | 425 | 426 | 427 | - 作用:实现祖与后代组件间通信 428 | 429 | - 套路:父组件有一个 `provide` 选项来提供数据,后代组件有一个 `inject` 选项来开始使用这些数据 430 | 431 | - 具体写法: 432 | 433 | 1. 祖组件中: 434 | 435 | ```js 436 | setup(){ 437 | ...... 438 | let car = reactive({name:'奔驰',price:'40万'}) 439 | provide('car',car) 440 | ...... 441 | } 442 | ``` 443 | 444 | 2. 后代组件中: 445 | 446 | ```js 447 | setup(props,context){ 448 | ...... 449 | const car = inject('car') 450 | return {car} 451 | ...... 452 | } 453 | ``` 454 | 455 | ## 6.响应式数据的判断 456 | 457 | - isRef: 检查一个值是否为一个 ref 对象 458 | - isReactive: 检查一个对象是否是由 `reactive` 创建的响应式代理 459 | - isReadonly: 检查一个对象是否是由 `readonly` 创建的只读代理 460 | - isProxy: 检查一个对象是否是由 `reactive` 或者 `readonly` 方法创建的代理 461 | 462 | # 四、Composition API 的优势 463 | 464 | ## 1.Options API 存在的问题 465 | 466 | 使用传统OptionsAPI中,新增或者修改一个需求,就需要分别在data,methods,computed里修改 。 467 | 468 |
469 | 470 |
471 |
472 | 473 |
474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | ## 2.Composition API 的优势 490 | 491 | 我们可以更加优雅的组织我们的代码,函数。让相关功能的代码更加有序的组织在一起。 492 | 493 |
494 | 495 |
496 |
497 | 498 |
499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | # 五、新的组件 513 | 514 | ## 1.Fragment 515 | 516 | - 在Vue2中: 组件必须有一个根标签 517 | - 在Vue3中: 组件可以没有根标签, 内部会将多个标签包含在一个Fragment虚拟元素中 518 | - 好处: 减少标签层级, 减小内存占用 519 | 520 | ## 2.Teleport 521 | 522 | - 什么是Teleport?—— `Teleport` 是一种能够将我们的组件html结构移动到指定位置的技术。 523 | 524 | ```vue 525 | 526 |
527 |
528 |

我是一个弹窗

529 | 530 |
531 |
532 |
533 | ``` 534 | 535 | ## 3.Suspense 536 | 537 | - 等待异步组件时渲染一些额外内容,让应用有更好的用户体验 538 | 539 | - 使用步骤: 540 | 541 | - 异步引入组件 542 | 543 | ```js 544 | import {defineAsyncComponent} from 'vue' 545 | const Child = defineAsyncComponent(()=>import('./components/Child.vue')) 546 | ``` 547 | 548 | - 使用```Suspense```包裹组件,并配置好```default``` 与 ```fallback``` 549 | 550 | ```vue 551 | 564 | ``` 565 | 566 | # 六、其他 567 | 568 | ## 1.全局API的转移 569 | 570 | - Vue 2.x 有许多全局 API 和配置。 571 | - 例如:注册全局组件、注册全局指令等。 572 | 573 | ```js 574 | //注册全局组件 575 | Vue.component('MyButton', { 576 | data: () => ({ 577 | count: 0 578 | }), 579 | template: '' 580 | }) 581 | 582 | //注册全局指令 583 | Vue.directive('focus', { 584 | inserted: el => el.focus() 585 | } 586 | ``` 587 | 588 | - Vue3.0中对这些API做出了调整: 589 | 590 | - 将全局的API,即:```Vue.xxx```调整到应用实例(```app```)上 591 | 592 | | 2.x 全局 API(```Vue```) | 3.x 实例 API (`app`) | 593 | | ------------------------- | ------------------------------------------- | 594 | | Vue.config.xxxx | app.config.xxxx | 595 | | Vue.config.productionTip | 移除 | 596 | | Vue.component | app.component | 597 | | Vue.directive | app.directive | 598 | | Vue.mixin | app.mixin | 599 | | Vue.use | app.use | 600 | | Vue.prototype | app.config.globalProperties | 601 | 602 | 603 | ## 2.其他改变 604 | 605 | - data选项应始终被声明为一个函数。 606 | 607 | - 过度类名的更改: 608 | 609 | - Vue2.x写法 610 | 611 | ```css 612 | .v-enter, 613 | .v-leave-to { 614 | opacity: 0; 615 | } 616 | .v-leave, 617 | .v-enter-to { 618 | opacity: 1; 619 | } 620 | ``` 621 | 622 | - Vue3.x写法 623 | 624 | ```css 625 | .v-enter-from, 626 | .v-leave-to { 627 | opacity: 0; 628 | } 629 | 630 | .v-leave-from, 631 | .v-enter-to { 632 | opacity: 1; 633 | } 634 | ``` 635 | 636 | - 移除keyCode作为 v-on 的修饰符,同时也不再支持```config.keyCodes``` 637 | 638 | - 移除```v-on.native```修饰符 639 | 640 | - 父组件中绑定事件 641 | 642 | ```vue 643 | 647 | ``` 648 | 649 | - 子组件中声明自定义事件 650 | 651 | ```vue 652 | 657 | ``` 658 | 659 | - 移除过滤器(filter) 660 | 661 | > 过滤器虽然这看起来很方便,但它需要一个自定义语法,打破大括号内表达式是 “只是 JavaScript” 的假设,这不仅有学习成本,而且有实现成本!建议用方法调用或计算属性去替换过滤器。 662 | 663 | - ...... -------------------------------------------------------------------------------- /pandas_demo/批量拆分与合并excel文件.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "attachments": {}, 5 | "cell_type": "markdown", 6 | "metadata": {}, 7 | "source": [ 8 | "实例演示:\n", 9 | "1. 将一个大的excel等拆分成多个excel\n", 10 | "2. 将多个小的excel合并为一个大的excel" 11 | ] 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": 1, 16 | "metadata": {}, 17 | "outputs": [], 18 | "source": [ 19 | "work_dir='./data/splitTask'\n", 20 | "split_dir=f'{work_dir}/splits'\n", 21 | "import os\n", 22 | "if not os.path.exists(split_dir):\n", 23 | " os.mkdir(split_dir)\n" 24 | ] 25 | }, 26 | { 27 | "attachments": {}, 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "0. 读取源excel到pandas" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 2, 37 | "metadata": {}, 38 | "outputs": [], 39 | "source": [ 40 | "import pandas as pd" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 3, 46 | "metadata": {}, 47 | "outputs": [], 48 | "source": [ 49 | "df_source=pd.read_excel('./data/movies/users.xlsx')" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": 4, 55 | "metadata": {}, 56 | "outputs": [ 57 | { 58 | "data": { 59 | "text/html": [ 60 | "
\n", 61 | "\n", 74 | "\n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | "
userIdagegenderoccupationzip-code
0124Mtechnician85711
1253Fother94043
2323Mwriter32067
3424Mtechnician43537
4533Fother15213
\n", 128 | "
" 129 | ], 130 | "text/plain": [ 131 | " userId age gender occupation zip-code\n", 132 | "0 1 24 M technician 85711\n", 133 | "1 2 53 F other 94043\n", 134 | "2 3 23 M writer 32067\n", 135 | "3 4 24 M technician 43537\n", 136 | "4 5 33 F other 15213" 137 | ] 138 | }, 139 | "execution_count": 4, 140 | "metadata": {}, 141 | "output_type": "execute_result" 142 | } 143 | ], 144 | "source": [ 145 | "df_source.head()" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 16, 151 | "metadata": {}, 152 | "outputs": [ 153 | { 154 | "data": { 155 | "text/html": [ 156 | "
\n", 157 | "\n", 170 | "\n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | "
userIdagegenderoccupationzip-code
0124Mtechnician85711
1253Fother94043
2323Mwriter32067
3424Mtechnician43537
\n", 216 | "
" 217 | ], 218 | "text/plain": [ 219 | " userId age gender occupation zip-code\n", 220 | "0 1 24 M technician 85711\n", 221 | "1 2 53 F other 94043\n", 222 | "2 3 23 M writer 32067\n", 223 | "3 4 24 M technician 43537" 224 | ] 225 | }, 226 | "execution_count": 16, 227 | "metadata": {}, 228 | "output_type": "execute_result" 229 | } 230 | ], 231 | "source": [ 232 | "df_source.loc[0:3]" 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": 7, 238 | "metadata": {}, 239 | "outputs": [ 240 | { 241 | "data": { 242 | "text/plain": [ 243 | "RangeIndex(start=0, stop=943, step=1)" 244 | ] 245 | }, 246 | "execution_count": 7, 247 | "metadata": {}, 248 | "output_type": "execute_result" 249 | } 250 | ], 251 | "source": [ 252 | "df_source.index" 253 | ] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "execution_count": 8, 258 | "metadata": {}, 259 | "outputs": [ 260 | { 261 | "data": { 262 | "text/plain": [ 263 | "(943, 5)" 264 | ] 265 | }, 266 | "execution_count": 8, 267 | "metadata": {}, 268 | "output_type": "execute_result" 269 | } 270 | ], 271 | "source": [ 272 | "df_source.shape" 273 | ] 274 | }, 275 | { 276 | "cell_type": "code", 277 | "execution_count": 10, 278 | "metadata": {}, 279 | "outputs": [ 280 | { 281 | "data": { 282 | "text/plain": [ 283 | "943" 284 | ] 285 | }, 286 | "execution_count": 10, 287 | "metadata": {}, 288 | "output_type": "execute_result" 289 | } 290 | ], 291 | "source": [ 292 | "# rows计算所有行\n", 293 | "rows=df_source.shape[0]\n", 294 | "rows" 295 | ] 296 | }, 297 | { 298 | "attachments": {}, 299 | "cell_type": "markdown", 300 | "metadata": {}, 301 | "source": [ 302 | "一、 将一个大的excel拆分成几个小excel分给若干人的任务" 303 | ] 304 | }, 305 | { 306 | "attachments": {}, 307 | "cell_type": "markdown", 308 | "metadata": {}, 309 | "source": [ 310 | "1. 计算拆分后的每个excel的行数" 311 | ] 312 | }, 313 | { 314 | "cell_type": "code", 315 | "execution_count": 11, 316 | "metadata": {}, 317 | "outputs": [], 318 | "source": [ 319 | "# 这个大excel,会拆分给几个人\n", 320 | "task_persons=['wxm','jdq','wyn','yc','xr']" 321 | ] 322 | }, 323 | { 324 | "cell_type": "code", 325 | "execution_count": 12, 326 | "metadata": {}, 327 | "outputs": [], 328 | "source": [ 329 | "# 每个人的任务数目\n", 330 | "splits_size=rows//len(task_persons) if rows%len(task_persons)==0 else rows//len(task_persons)+1" 331 | ] 332 | }, 333 | { 334 | "cell_type": "code", 335 | "execution_count": 13, 336 | "metadata": {}, 337 | "outputs": [ 338 | { 339 | "data": { 340 | "text/plain": [ 341 | "189" 342 | ] 343 | }, 344 | "execution_count": 13, 345 | "metadata": {}, 346 | "output_type": "execute_result" 347 | } 348 | ], 349 | "source": [ 350 | "splits_size" 351 | ] 352 | }, 353 | { 354 | "attachments": {}, 355 | "cell_type": "markdown", 356 | "metadata": {}, 357 | "source": [ 358 | "2. 拆分成多个excel" 359 | ] 360 | }, 361 | { 362 | "cell_type": "code", 363 | "execution_count": 17, 364 | "metadata": {}, 365 | "outputs": [ 366 | { 367 | "name": "stdout", 368 | "output_type": "stream", 369 | "text": [ 370 | "begin: 0 end: 189\n", 371 | "begin: 189 end: 378\n", 372 | "begin: 378 end: 567\n", 373 | "begin: 567 end: 756\n", 374 | "begin: 756 end: 945\n" 375 | ] 376 | } 377 | ], 378 | "source": [ 379 | "df_subs=[]\n", 380 | "\n", 381 | "for idx,user_name in enumerate(task_persons):\n", 382 | " # iloc开始的索引\n", 383 | " begin=idx*splits_size\n", 384 | " # iloc结束的索引\n", 385 | " end=begin+splits_size\n", 386 | " print('begin:',begin,'end:',end)\n", 387 | " # 实现df按照iloc拆分\n", 388 | " df_sub=df_source.iloc[begin:end]\n", 389 | " # 将每个子df_sub存入df_subs\n", 390 | " df_subs.append((idx,user_name,df_sub))" 391 | ] 392 | }, 393 | { 394 | "attachments": {}, 395 | "cell_type": "markdown", 396 | "metadata": {}, 397 | "source": [ 398 | "3. 将每个df_sub导出为excel" 399 | ] 400 | }, 401 | { 402 | "cell_type": "code", 403 | "execution_count": 15, 404 | "metadata": {}, 405 | "outputs": [], 406 | "source": [ 407 | "for idx,user_name,df in df_subs:\n", 408 | " df.to_excel(f'{split_dir}/tasks_{idx}_{user_name}.xlsx',index=False)" 409 | ] 410 | }, 411 | { 412 | "attachments": {}, 413 | "cell_type": "markdown", 414 | "metadata": {}, 415 | "source": [ 416 | "二、合并多个小excel到一个大excel\n", 417 | " 1. 遍历文件夹,得到要合并的excel文件列表\n", 418 | " 2. 分别读取到df中,给每个df添加一列用于标记数据来源\n", 419 | " 3. 使用pd.concat进行df批量合并\n", 420 | " 4. 将合并后的df输出到excel中" 421 | ] 422 | }, 423 | { 424 | "attachments": {}, 425 | "cell_type": "markdown", 426 | "metadata": {}, 427 | "source": [ 428 | "1. 遍历文件夹,得到要合并的excel文件列表" 429 | ] 430 | }, 431 | { 432 | "cell_type": "code", 433 | "execution_count": 18, 434 | "metadata": {}, 435 | "outputs": [ 436 | { 437 | "data": { 438 | "text/plain": [ 439 | "['tasks_0_wxm.xlsx',\n", 440 | " 'tasks_1_jdq.xlsx',\n", 441 | " 'tasks_2_wyn.xlsx',\n", 442 | " 'tasks_3_yc.xlsx',\n", 443 | " 'tasks_4_xr.xlsx']" 444 | ] 445 | }, 446 | "execution_count": 18, 447 | "metadata": {}, 448 | "output_type": "execute_result" 449 | } 450 | ], 451 | "source": [ 452 | "excel_names=[]\n", 453 | "for name in os.listdir(split_dir):\n", 454 | " excel_names.append(name)\n", 455 | "excel_names" 456 | ] 457 | }, 458 | { 459 | "attachments": {}, 460 | "cell_type": "markdown", 461 | "metadata": {}, 462 | "source": [ 463 | "2. 分别读取到df中,给每个df添加一列用于标记数据来源" 464 | ] 465 | }, 466 | { 467 | "cell_type": "code", 468 | "execution_count": 33, 469 | "metadata": {}, 470 | "outputs": [ 471 | { 472 | "name": "stdout", 473 | "output_type": "stream", 474 | "text": [ 475 | "wxm\n", 476 | "jdq\n", 477 | "wyn\n", 478 | "yc\n", 479 | "xr\n" 480 | ] 481 | } 482 | ], 483 | "source": [ 484 | "df_list=[]\n", 485 | "# 读取每个excel到df中\n", 486 | "for name in excel_names:\n", 487 | " excel_path=f'{split_dir}/{name}'\n", 488 | " df=pd.read_excel(excel_path)\n", 489 | " # 读取到每个任务的姓名\n", 490 | " username=name.replace('tasks_','').replace('.xlsx','')[2:]\n", 491 | " print(username)\n", 492 | " df['name_task']=username\n", 493 | " df_list.append(df)" 494 | ] 495 | }, 496 | { 497 | "attachments": {}, 498 | "cell_type": "markdown", 499 | "metadata": {}, 500 | "source": [ 501 | "3. 使用pd.concat进行df批量合并" 502 | ] 503 | }, 504 | { 505 | "cell_type": "code", 506 | "execution_count": 34, 507 | "metadata": {}, 508 | "outputs": [], 509 | "source": [ 510 | "df_merge=pd.concat(df_list)" 511 | ] 512 | }, 513 | { 514 | "cell_type": "code", 515 | "execution_count": 36, 516 | "metadata": {}, 517 | "outputs": [ 518 | { 519 | "data": { 520 | "text/html": [ 521 | "
\n", 522 | "\n", 535 | "\n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | "
userIdagegenderoccupationzip-codename_task
0124Mtechnician85711wxm
1253Fother94043wxm
2323Mwriter32067wxm
3424Mtechnician43537wxm
4533Fother15213wxm
\n", 595 | "
" 596 | ], 597 | "text/plain": [ 598 | " userId age gender occupation zip-code name_task\n", 599 | "0 1 24 M technician 85711 wxm\n", 600 | "1 2 53 F other 94043 wxm\n", 601 | "2 3 23 M writer 32067 wxm\n", 602 | "3 4 24 M technician 43537 wxm\n", 603 | "4 5 33 F other 15213 wxm" 604 | ] 605 | }, 606 | "execution_count": 36, 607 | "metadata": {}, 608 | "output_type": "execute_result" 609 | } 610 | ], 611 | "source": [ 612 | "df_merge.head()" 613 | ] 614 | }, 615 | { 616 | "cell_type": "code", 617 | "execution_count": 38, 618 | "metadata": {}, 619 | "outputs": [ 620 | { 621 | "data": { 622 | "text/plain": [ 623 | "wxm 189\n", 624 | "jdq 189\n", 625 | "wyn 189\n", 626 | "yc 189\n", 627 | "xr 187\n", 628 | "Name: name_task, dtype: int64" 629 | ] 630 | }, 631 | "execution_count": 38, 632 | "metadata": {}, 633 | "output_type": "execute_result" 634 | } 635 | ], 636 | "source": [ 637 | "df_merge['name_task'].value_counts()" 638 | ] 639 | }, 640 | { 641 | "attachments": {}, 642 | "cell_type": "markdown", 643 | "metadata": {}, 644 | "source": [ 645 | "4. 将合并后的df输出到excel中" 646 | ] 647 | }, 648 | { 649 | "cell_type": "code", 650 | "execution_count": 39, 651 | "metadata": {}, 652 | "outputs": [], 653 | "source": [ 654 | "df_merge.to_excel(f'{work_dir}/merge_task.xlsx',index=False)" 655 | ] 656 | } 657 | ], 658 | "metadata": { 659 | "kernelspec": { 660 | "display_name": "Python 3", 661 | "language": "python", 662 | "name": "python3" 663 | }, 664 | "language_info": { 665 | "codemirror_mode": { 666 | "name": "ipython", 667 | "version": 3 668 | }, 669 | "file_extension": ".py", 670 | "mimetype": "text/x-python", 671 | "name": "python", 672 | "nbconvert_exporter": "python", 673 | "pygments_lexer": "ipython3", 674 | "version": "3.10.5" 675 | }, 676 | "orig_nbformat": 4 677 | }, 678 | "nbformat": 4, 679 | "nbformat_minor": 2 680 | } 681 | -------------------------------------------------------------------------------- /docker.md: -------------------------------------------------------------------------------- 1 | # docker 2 | 3 | ### docker镜像命令 4 | 5 | ``` 6 | docker images 列出所有本地的镜像 7 | docker search 镜像名 搜索镜像 8 | docker pull 镜像名 [:TAG] 9 | docker system df 查看所占空间 10 | docker rmi -f 镜像名/image id 删除镜像 11 | attach Attach local standard input, output, and error streams to a running container 12 | build Build an image from a Dockerfile 13 | commit Create a new image from a container's changes 14 | cp Copy files/folders between a container and the local filesystem 15 | create Create a new container 16 | diff Inspect changes to files or directories on a container's filesystem 17 | events Get real time events from the server 18 | exec Run a command in a running container 19 | export Export a container's filesystem as a tar archive 20 | history Show the history of an image 21 | images List images 22 | import Import the contents from a tarball to create a filesystem image 23 | info Display system-wide information 24 | inspect Return low-level information on Docker objects 25 | kill Kill one or more running containers 26 | load Load an image from a tar archive or STDIN 27 | login Log in to a Docker registry 28 | logout Log out from a Docker registry 29 | logs Fetch the logs of a container 30 | pause Pause all processes within one or more containers 31 | port List port mappings or a specific mapping for the container 32 | ps List containers 33 | pull Pull an image or a repository from a registry 34 | push Push an image or a repository to a registry 35 | rename Rename a container 36 | restart Restart one or more containers 37 | rm Remove one or more containers 38 | rmi Remove one or more images 39 | run Run a command in a new container 40 | save Save one or more images to a tar archive (streamed to STDOUT by default) 41 | search Search the Docker Hub for images 42 | start Start one or more stopped containers 43 | stats Display a live stream of container(s) resource usage statistics 44 | stop Stop one or more running containers 45 | tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE 46 | top Display the running processes of a container 47 | unpause Unpause all processes within one or more containers 48 | update Update configuration of one or more containers 49 | version Show the Docker version information 50 | wait Block until one or more containers stop, then print their exit codes 51 | 52 | ``` 53 | 54 | 面试题:docker虚悬镜像是什么: 55 | 56 | ``` 57 | 仓库名、标签都是的镜像,俗称虚悬镜像dangling image 58 | ``` 59 | 60 | ### docker容器命令 61 | 62 | **新建+启动容器** 63 | 64 | ``` 65 | docker run [options] image [command] [arg...] 66 | option说明:有些是一个减号,有些是两个减号 67 | --name='容器新名字' 为容器指定一个名称 68 | -d:后台运行容器并返回容器id,也即启动守护式容器(后台启动) 69 | -i:以交互模式运行容器,通常与-t同时使用 70 | -t:为容器重新分配一个伪输入终端,通常与-i同时使用 71 | 也即 启动交互式容器(前端有伪终端,等待交互) 72 | 73 | -P:随机终端映射,大写P 74 | -p:指定端口映射,小写p 75 | ``` 76 | 77 | ``` 78 | # 启动ubuntu 79 | sudo docker run -it --name=myu1 ubuntu [/bin/bash] 80 | # 退出ubuntu 81 | exit; 82 | ``` 83 | 84 | **列出当前所有正在运行的容器** 85 | 86 | ``` 87 | docker ps [options] 88 | -a:列出当前所有正在运行的容器+历史上运行过的 89 | -l:显示最近创建的容器 90 | -n:显示最近n个创建的容器 91 | -q:静默模式,只显示容器编号 92 | ``` 93 | 94 | **退出容器** 95 | 96 | ``` 97 | exit run进去容器,exit退出,容器停止 98 | ctrl+p+q run进去容器,ctrl+p+q退出,容器不停止 99 | ``` 100 | 101 | **启动已经停止运行的容器** 102 | 103 | ``` 104 | docker start 容器id或者容器名 105 | ``` 106 | 107 | **重启容器** 108 | 109 | ``` 110 | docker restart 容器id或者容器名 111 | ``` 112 | 113 | **停止容器** 114 | 115 | ``` 116 | docker stop 容器id或者容器名 117 | ``` 118 | 119 | **强制停止容器** 120 | 121 | ``` 122 | docker kill 容器id或者容器名 123 | ``` 124 | 125 | **删除已停止的容器** 126 | 127 | ``` 128 | docker rm 容器id 129 | ``` 130 | 131 | 132 | 133 | **有镜像才能创建容器,这是根本前提(下载一个redis6.0.8镜像演示)** 134 | 135 | - 启动守护式容器(后台服务器) 136 | 137 | ``` 138 | docker run -d redis:6.0.8 139 | ``` 140 | 141 | - 查看docker运行容器日志 142 | 143 | ``` 144 | docker logs 容器id 145 | docker轻量级可视化工具portainer 146 | ``` 147 | 148 | - 查看容器内运行的进行 149 | 150 | ``` 151 | docker top 容器id 152 | ``` 153 | 154 | - 查看容器内部细节 155 | 156 | ``` 157 | docker inspect 容器id 158 | ``` 159 | 160 | - 进入正在运行的容器并以命令行交互 161 | 162 | ``` 163 | docker exec -it 容器id bashShell 164 | docker attach 容器id 165 | 两者区别: 166 | attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出会导致容器的停止 167 | exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止 168 | ``` 169 | 170 | - 从容器内拷贝文件到主机上 171 | 172 | ``` 173 | docker cp 容器id:容器内路径 目的主机路径 174 | ``` 175 | 176 | - 导入导出容器 177 | 178 | ``` 179 | exprot 导出容器的内容留作为一个tar归档文件[对应import命令] 180 | import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export] 181 | 182 | docker export 容器id>文件名.tar 183 | cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 184 | ``` 185 | 186 | ### docker镜像 187 | 188 | **镜像**:是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包含代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。 189 | 190 | 镜像是分层的 191 | 192 | unionFS(联合文件系统,union file system) 193 | 194 | ``` 195 | 镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。 196 | 比如说有多人镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。 197 | ``` 198 | 199 | 重点理解: 200 | 201 | ``` 202 | Docker镜像层都是只读的,容器层是可写的。 203 | 当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层” 204 | ``` 205 | 206 | 提交副本 207 | 208 | ``` 209 | docker commit -m='提交的信息描述' -a='作者' 容器id 要创建的目标镜像名[:标签名] 210 | ``` 211 | 212 | 创建一个添加vim的ubuntu到阿里云的docker registry 213 | 214 | ``` 215 | 1. 再ubunt中安装vim 216 | 2. 提交副本 217 | sudo docker commit -m='add vim' -a='wxm' 35ff577bf928 wxmseu/myubuntu:1.0.1 218 | 3. 登录阿里云并push 219 | sudo docker login --username=wxmseu registry.cn-hangzhou.aliyuncs.com 220 | sudo docker tag 43f7af9460c8 registry.cn-hangzhou.aliyuncs.com/wxmseu/myubuntu:1.0.1 221 | sudo docker push registry.cn-hangzhou.aliyuncs.com/wxmseu/myubuntu:1.0.1 222 | ``` 223 | 224 | 225 | 226 | ### 创建私有库 227 | 228 | ``` 229 | 1. 下载镜像docker registry 230 | sudo docker pull registry 231 | 2. 运行私有库registry 232 | docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileg=true registry 233 | 默认情况下,仓库被创建再容器的/var/lib/registry 目录下,建议另行 234 | 3. curl验证私服库上有什么镜像 235 | curl -XGET http://127.0.0.1:5000/v2/_catalog 236 | 4.将新镜像修改符合私服规范的tag 237 | docker tag 镜像:tag host:port/repository“tag 238 | sudo docker tag wxmseu/myubuntu:1.0.2 127.0.0.1:5000/myubuntu:1.0.2 239 | 5. 修改配置文件使之支持http 240 | sudo vim /etc/docker/daemon.json 241 | { 242 | "registry-mirrors": ["https://1yw00sea.mirror.aliyuncs.com"], 243 | # 添加此行 244 | "insecure-registries": ["43.142.112.65:5000"] 245 | } 246 | # 重启 247 | sudo systemctl restart docker 248 | 6. push推送到私服库 249 | sudo docker push 127.0.0.1:5000/myubuntu:1.0.2 250 | ``` 251 | 252 | ### docker容器数据卷 253 | 254 | 卷 255 | 256 | ``` 257 | 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器, 258 | 但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性: 259 | 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷 260 | ``` 261 | 262 | 特点: 263 | 264 | 1. 数据卷可在容器之间共享或重用数据 265 | 2. 卷中的更改可以直接实时生效 266 | 3. 数据卷中的更改不会包含在镜像的更新中 267 | 4. 数据卷的生命周期一直持续到没有容器使用它为止 268 | 269 | 容器卷加入 270 | 271 | ``` 272 | docker run -d -p 5000:5000 -v 宿主机路径:容器内路径 --privileged=true 镜像名 273 | docker挂载主机目录访问如果出现cannot open directory:permission denied,在挂载目录后加--privileged=true 274 | ``` 275 | 276 | 查看容器是否挂载成功 277 | 278 | ``` 279 | docker inspect 容器id 280 | 281 | "Mounts": [ 282 | { 283 | "Type": "bind", 284 | "Source": "/home/ubuntu/test", 285 | "Destination": "/root", 286 | "Mode": "", 287 | "RW": true, 288 | "Propagation": "rprivate" 289 | } 290 | ], 291 | 292 | ``` 293 | 294 | 容器和宿主机之间数据共享 295 | 296 | 1. docker修改,主机同步获得 297 | 2. 主机修改,docker同步获得 298 | 3. dockers容器stop,主机修改,docker容器重启数据同步 299 | 300 | 读写规则 301 | 302 | ``` 303 | docker run -d -v 宿主机路径:容器内路径:rw --privileged=true 镜像名 304 | 默认为读写 rw 305 | 306 | docker run -d -v 宿主机路径:容器内路径:ro --privileged=true 镜像名 307 | ro 只读read only 308 | ``` 309 | 310 | 卷的继承和共享 311 | 312 | ``` 313 | docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu 314 | 主机和各继承的容器共享数据 315 | ``` 316 | 317 | ### mysql主从复制 318 | 319 | ##### 主服务器 320 | 321 | - 新建主服务器容器实例3306 322 | 323 | ``` 324 | sudo docker run -p 3306:3306 --name mysql-master -v /home/ubuntu/mysql/mysql-master/log:/var/log/mysql -v /home/ubuntu/mysql/mysql-master/data:/var/lib/mysql -v /home/ubuntu/mysql/mysql-master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql 325 | ``` 326 | 327 | - 进入/home/ubuntu/mysql/mysql-master/conf 新建my.cnf 328 | 329 | ``` 330 | cd /home/ubuntu/mysql/mysql-master/conf 331 | vim my.cnf 332 | 333 | [mysqld] 334 | ## 设置server_id,同一局域网中需要唯一 335 | server_id=101 336 | ## 指定不需要同步的数据库名称 337 | binlog-ignore-db=mysql 338 | ## 开启二进制日志功能 339 | log-bin=mall-mysql-bin 340 | ## 设置二进制日志使用内存大小(事务) 341 | binlog_cache_size=1M 342 | ## 设置使用的二进制日志格式(mixed,statement,row) 343 | binlog_format=mixed 344 | ## 二进制日志过期清理时间。默认值为0,表示不自动清理。 345 | expire_logs_days=7 346 | ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 347 | ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 348 | slave_skip_errors=1062 349 | 350 | ``` 351 | 352 | - 重启mysql-master容器 353 | 354 | ``` 355 | sudo docker restart mysql-master 356 | ``` 357 | 358 | - 进入mysql-master容器 359 | 360 | ``` 361 | sudo docker exec -it mysql-master /bin/bash 362 | ``` 363 | 364 | - master容器实例内创建数据同步用户 365 | 366 | ``` 367 | mysql -uroot -p 368 | CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; 369 | GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; 370 | 371 | ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; 372 | ``` 373 | 374 | - 查看主机状态 375 | 376 | ``` 377 | show master status; 378 | ``` 379 | 380 | 381 | 382 | ##### 从服务器 383 | 384 | - 新建从服务器3307 385 | 386 | ``` 387 | sudo docker run -p 3307:3306 --name mysql-slave -v /home/ubuntu/mysql/mysql-slave/log:/var/log/mysql -v /home/ubuntu/mysql/mysql-slave/data:/var/lib/mysql -v /home/ubuntu/mysql/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql 388 | ``` 389 | 390 | - 进入/home/ubuntu/mysql/mysql-slave/conf 新建my.cnf 391 | 392 | ``` 393 | cd /home/ubuntu/mysql/mysql-slave/conf 394 | sudo vim my.cnf 395 | 396 | [mysqld] 397 | ## 设置server_id,同一局域网中需要唯一 398 | server_id=102 399 | ## 指定不需要同步的数据库名称 400 | binlog-ignore-db=mysql 401 | ## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用 402 | log-bin=mall-mysql-slave1-bin 403 | ## 设置二进制日志使用内存大小(事务) 404 | binlog_cache_size=1M 405 | ## 设置使用的二进制日志格式(mixed,statement,row) 406 | binlog_format=mixed 407 | ## 二进制日志过期清理时间。默认值为0,表示不自动清理。 408 | expire_logs_days=7 409 | ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 410 | ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 411 | slave_skip_errors=1062 412 | ## relay_log配置中继日志 413 | relay_log=mall-mysql-relay-bin 414 | ## log_slave_updates表示slave将复制事件写进自己的二进制日志 415 | log_slave_updates=1 416 | ## slave设置为只读(具有super权限的用户除外) 417 | read_only=1 418 | 419 | ``` 420 | 421 | - 重启msyql-slave容器 422 | 423 | ``` 424 | sudo docker restart mysql-slave 425 | ``` 426 | 427 | - 进入到msyql-slave中 428 | 429 | ``` 430 | sudo docker exec -it mysql-slave /bin/bash 431 | mysql -uroot -p 432 | ``` 433 | 434 | - 配置主从复制 435 | 436 | ``` 437 | change master to master_host='宿主机ip',master_user='slave',master_password='123456',master_port=3306,master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30; 438 | 439 | change master to master_host='43.142.112.65',master_user='slave',master_password='123456',master_port=3306,master_log_file='mall-mysql-bin.000001', master_log_pos=1688, master_connect_retry=30; 440 | ``` 441 | 442 | - 在从数据库中查看主从复制状态 443 | 444 | ``` 445 | show slave status\G; 446 | 447 | 其中 448 | Slave_IO_Running: No 449 | Slave_SQL_Running: No 450 | 451 | ``` 452 | 453 | - 在从数据库中开启主从复制 454 | 455 | ``` 456 | start slave 457 | ``` 458 | 459 | - 在从数据库中查看主从复制状态 460 | 461 | ``` 462 | show slave status\G; 463 | 464 | 其中 465 | Slave_IO_Running: Yes 466 | Slave_SQL_Running: Yes 467 | ``` 468 | 469 | 面试题:1-2亿条数据需要缓存,请问如何设计这个存储案例“ 470 | 471 | 回答: 单机无法实现,采用分布式存储。 472 | 473 | - 哈希取余分区 474 | - 优点:简单粗暴,直接有效,只需要预估好数据规划好节点,例如3台、8台、10台,就能保证一段时间的数据支撑。使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用。 475 | - 缺点:原来规划好的节点,进行扩容或者缩容就比较麻烦,不管扩缩,每次数据变动导致节点有变动,映射关系需要重新进行计算,在服务器个数固定不变时没有问题,如果需要弹性扩容或故障停机的情况下,原来的取模公式就会发生变化:Hash(key)/3会变成Hash(key) /?。此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可控。 476 | 某个redis机器宕机了,由于台数数量变化,会导致hash取余全部数据重新洗牌。 477 | - 一致性哈希算法分区 478 | - 背景:一致性哈希算法在1997年由麻省理工学院提出,设计目的是为了解决分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变,自然取余数就存在问题。 479 | - 3大步骤 480 | - 算法构建一致性哈希环 481 | - 服务器IP节点映射 482 | - key落到服务器的落键规则 483 | - 优点 484 | - 一致性哈希算法的容错性 485 | - 一致性哈希算法的扩展性 486 | - 缺点 487 | - 一致性哈希算法的数据倾斜问题:在服务器节点太少时,容易因为节点分布不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在一台服务器上)问题。 488 | - 哈希槽分区 489 | - 哈希槽实质上是一个数组[0,2^14-1]形成hash slot空间 16384个槽位(0-16383) 490 | - 可以解决均匀分配的问题,在数据和节点之间又加了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系,现在相当于节点上放的是槽,槽里放的是数据。 491 | 492 | ### redis集群 493 | 494 | ##### 集群配置 495 | 496 | ``` 497 | 配置三主三从 498 | master1 6379- slave1 6383 499 | master2 6380- slave2 6384 500 | master3 6381- slave3 6382 501 | ``` 502 | 503 | - 新建6台docker容器启动redis 504 | 505 | ``` 506 | sudo docker run -d --name redis-node-1 --net host --privileged=true -v /home/ubuntu/redis/share/redis-node-1/:/data redis --cluster-enabled yes --appendonly yes --port 6379 507 | 508 | sudo docker run -d --name redis-node-2 --net host --privileged=true -v /home/ubuntu/redis/share/redis-node-2/:/data redis --cluster-enabled yes --appendonly yes --port 6380 509 | 510 | sudo docker run -d --name redis-node-3 --net host --privileged=true -v /home/ubuntu/redis/share/redis-node-3/:/data redis --cluster-enabled yes --appendonly yes --port 6381 511 | 512 | sudo docker run -d --name redis-node-4 --net host --privileged=true -v /home/ubuntu/redis/share/redis-node-4/:/data redis --cluster-enabled yes --appendonly yes --port 6382 513 | 514 | sudo docker run -d --name redis-node-5 --net host --privileged=true -v /home/ubuntu/redis/share/redis-node-5/:/data redis --cluster-enabled yes --appendonly yes --port 6383 515 | 516 | sudo docker run -d --name redis-node-6 --net host --privileged=true -v /home/ubuntu/redis/share/redis-node-6/:/data redis --cluster-enabled yes --appendonly yes --port 6384 517 | ``` 518 | 519 | - 为6台机器构建集群关系 520 | 521 | ``` 522 | sudo docker exec -it redis-node-1 /bin/bash 523 | 524 | # 本地部署 525 | redis-cli --cluster create 10.0.4.14:6379 10.0.4.14:6380 10.0.4.14:6381 10.0.4.14:6382 10.0.4.14:6383 10.0.4.14:6384 --cluster-replicas 1 526 | 527 | # 远程部署 528 | redis-cli --cluster create 43.142.112.65:6379 43.142.112.65:6380 43.142.112.65:6381 43.142.112.65:6382 43.142.112.65:6383 43.142.112.65:6384 --cluster-replicas 1 529 | ``` 530 | 531 | **集群总线** 532 | 533 | ``` 534 | 每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比如6379,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口,例如:redis的端口为6379,那么另外一个需要开通的端口是:6379 + 10000, 即需要开启 16379。16379端口用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(Cluster bus)用于节点的失败侦测、配置更新、故障转移授权,等等。 535 | ``` 536 | 537 | - 查看集群状态 538 | 539 | ``` 540 | cluster info 541 | cluster nodes 542 | ``` 543 | 544 | ##### 主从容错切换迁移 545 | 546 | - 数据读写存储,以集群环境连接redis 547 | 548 | ``` 549 | redis-cli -p 6379 -c 550 | ``` 551 | 552 | 查看集群信息 553 | 554 | ``` 555 | redis-cli --cluster check 10.0.4.14:6379 556 | ``` 557 | 558 | - 容器切换迁移 559 | - 主节点宕机,从节点变主机 560 | - 主节点恢复,变为从机 561 | 562 | ##### 扩容 563 | 564 | - 新建两个redis容器 565 | 566 | ``` 567 | sudo docker run -d --name redis-node-7 --net host --privileged=true -v /home/ubuntu/redis/share/redis-node-7/:/data redis --cluster-enabled yes --appendonly yes --port 6385 568 | 569 | sudo docker run -d --name redis-node-8 --net host --privileged=true -v /home/ubuntu/redis/share/redis-node-8/:/data redis --cluster-enabled yes --appendonly yes --port 6386 570 | ``` 571 | 572 | - 进入到7号容器实例内部 573 | 574 | ``` 575 | sudo docker exec -it redis-node-7 /bin/bash 576 | ``` 577 | 578 | - 将新增的6385节点(空槽位)作为master节点加入集群 579 | 580 | ``` 581 | redis-cli --cluster add-node 10.0.4.14:6385 10.0.4.14:6379 582 | 通过redis-cli --cluster check 10.0.4.14:6385查看集群信息可以发现当前7号主机没有槽位,没有从机 583 | 10.0.4.14:6385 (c8e1715f...) -> 0 keys | 0 slots | 0 slaves. 584 | 585 | ``` 586 | 587 | - 重新分配槽位 588 | 589 | ``` 590 | redis-cli --cluster reshard 10.0.4.14:6380 591 | 592 | How many slots do you want to move (from 1 to 16384)? 4096 593 | What is the receiving node ID? c8e1715f40773a59da732b3296540656c74bb1d0 594 | Please enter all the source node IDs. 595 | Type 'all' to use all the nodes as source nodes for the hash slots. 596 | Type 'done' once you entered all the source nodes IDs. 597 | Source node #1: all 598 | 599 | ``` 600 | 601 | ![image-20221128235016555](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20221128235016555.png) 602 | 603 | - 为主节点6385分配从节点6386 604 | 605 | ``` 606 | redis-cli --cluster add-node 10.0.4.14:6386 10.0.4.14:6385 --cluster-slave --cluster-master-id c8e1715f40773a59da732b3296540656c74bb1d0 607 | ``` 608 | 609 | - 检查集群状态 610 | 611 | ``` 612 | redis-cli --cluster check 10.0.4.14:6385 613 | ``` 614 | 615 | ![image-20221129132900842](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20221129132900842.png) 616 | 617 | ##### 缩容 618 | 619 | - 删除从节点6379 620 | 621 | ``` 622 | redis-cli --cluster del-node 10.0.4.14:6379 e030e314ea951b772e259fc16ee08223aa5e09e2 623 | ``` 624 | 625 | - 将主节点6383的槽号清空,重新分配,本例将请出来的槽号都给6380 626 | 627 | ``` 628 | redis-cli --cluster reshard 10.0.4.14:6380 629 | ``` 630 | 631 | ![image-20221129134648254](C:\Users\xiaom\AppData\Roaming\Typora\typora-user-images\image-20221129134648254.png) 632 | 633 | - 将主节点6383删除 634 | 635 | ``` 636 | redis-cli --cluster del-node 10.0.4.14:6383 2722a126cd2ecac86f3bd986db0558f9e3db626c 637 | ``` 638 | 639 | ### DockerFile 640 | 641 | dockerfile是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。 642 | 643 | 构建三步曲 644 | 645 | 1. 编写dockerfile文件 646 | 2. docker build命令构建镜像 647 | 3. docker run依镜像运行容器实例 648 | 649 | ##### 基础知识 650 | 651 | - 每条保留字指令都必须为大写字母且后面要跟随至少一个参数 652 | - 指令依照从上到下,顺序执行 653 | - `#` 表示注释 654 | - 每条指令都会创建一个新的镜像层并对镜像进行提交 655 | 656 | ##### 保留字 657 | 658 | - FROM -----基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from 659 | - MAINTAINER -----镜像维护者的姓名和邮箱地址 660 | - RUN 661 | - 容器构建时需要执行的命令 662 | - 两种格式 663 | - shell `RUN ` 664 | - exec `RUN ['executable','param1','param2']` 665 | - RUN时在docker build时运行 666 | - EXPOSE-----当前容器对外暴露的端口 667 | - WORKDIR------指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点 668 | - USER-----指定该镜像以什么样的用户去执行,如果都不指定,默认是root 669 | - ENV-----用来在构建镜像过程中设置环境变量 670 | - VOLUME-----容器数据卷,用于数据保存和持久化工作 671 | - ADD------ 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包 672 | - COPY 673 | - 类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置 674 | - COPY src dest 675 | - COPY ["src", "dest"] 676 | - :源文件或者源目录 677 | - :容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。 678 | - CMD 679 | - 容器启动命令 680 | - shell `CMD ` 681 | - exec `CMD ['executable','param1','param2']` 682 | - 参数列表形式: `CMD [param1','param2']`在制定了ENTRYPOINT指令后,用CMD指定具体的参数 683 | - Dockerfile 中可以有多个 CMD 指令,但**只有最后一个生效,CMD 会被 docker run 之后的参数替换** 684 | - ENTRYPOINT 685 | - 也是用来指定一个容器启动时要运行的命令 686 | - 类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序 687 | - 优点:在执行docker run的时候可以指定 ENTRYPOINT 运行所需的参数 688 | 689 | ##### 案例 690 | 691 | 创建自己的centos,要求具有vim,ifconfig,python功能 692 | 693 | 1. 编写Dockerfile文件,D大写 694 | 695 | ``` 696 | FROM centos 697 | MAINTAINER wxm 698 | 699 | ENV MYPATH /usr/local 700 | WORKDIR $MYPATH 701 | 702 | #安装vim编辑器 703 | RUN yum -y install vim 704 | #安装ifconfig命令查看网络IP 705 | RUN yum -y install net-tools 706 | #安装python 707 | RUN mkdir /usr/local/python 708 | #ADD 是相对路径jar,把Python-3.10.8.tgz添加到容器中,安装包必须要和Dockerfile文件在同一位置 709 | ADD Python-3.10.8.tgz /usr/local/python/ 710 | #配置python环境变量 711 | ENV PYTHON_HOME /usr/local/python/Pyth-3.10.8 712 | ENV PATH $PYTHON_HOME/bin:$PATH 713 | 714 | EXPOSE 80 715 | CMD echo $MYPATH 716 | CMD echo "success--------------ok" 717 | CMD /bin/bash 718 | 719 | ``` 720 | 721 | 2. 构建镜像 722 | 723 | ``` 724 | sudo docker build -t 新镜像名字:TAG. 725 | 726 | sudo docker build -t centospython:1.1. /home/ubuntu/myfile/ 727 | ``` 728 | 729 | 3. 运行新构建的镜像 730 | 731 | ``` 732 | sudo docker run -it 546c15103b9a 733 | ``` 734 | 735 | 736 | 737 | 738 | 739 | ​ 740 | -------------------------------------------------------------------------------- /pandas_demo/数据排序.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "attachments": {}, 5 | "cell_type": "markdown", 6 | "metadata": {}, 7 | "source": [ 8 | "pandas数据排序\n", 9 | "\n", 10 | "series排序:\n", 11 | "series.sort_values(ascending=True, inplace=Fals)\n", 12 | "参数说明:\n", 13 | " ascending:默认为true升序排序,为false降序排序\n", 14 | " inplace:是否修改原始series\n", 15 | "df的排序\n", 16 | "df.sort_values(by,ascending=True,inplace=True)\n", 17 | "参数说明:\n", 18 | " by:字符串或者list,单列排序或者多列排序\n", 19 | " ascending:bool或者list,升序还是降序,如果是list对应by的多列\n", 20 | " inplace:是否修改原始df\n" 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 2, 26 | "metadata": {}, 27 | "outputs": [], 28 | "source": [ 29 | "import pandas as pd\n", 30 | "df=pd.read_excel('weather.xlsx')" 31 | ] 32 | }, 33 | { 34 | "attachments": {}, 35 | "cell_type": "markdown", 36 | "metadata": {}, 37 | "source": [ 38 | "1. series的排序" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 3, 44 | "metadata": {}, 45 | "outputs": [ 46 | { 47 | "data": { 48 | "text/plain": [ 49 | "3646 -19\n", 50 | "1835 -16\n", 51 | "710 -15\n", 52 | "721 -14\n", 53 | "3647 -14\n", 54 | " ..\n", 55 | "2760 27\n", 56 | "3111 27\n", 57 | "2757 27\n", 58 | "2745 27\n", 59 | "2744 27\n", 60 | "Name: 最低温, Length: 4006, dtype: int64" 61 | ] 62 | }, 63 | "execution_count": 3, 64 | "metadata": {}, 65 | "output_type": "execute_result" 66 | } 67 | ], 68 | "source": [ 69 | "df['最低温'].sort_values()" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": 4, 75 | "metadata": {}, 76 | "outputs": [ 77 | { 78 | "data": { 79 | "text/plain": [ 80 | "3111 27\n", 81 | "2760 27\n", 82 | "2757 27\n", 83 | "3117 27\n", 84 | "3116 27\n", 85 | " ..\n", 86 | "1836 -14\n", 87 | "721 -14\n", 88 | "710 -15\n", 89 | "1835 -16\n", 90 | "3646 -19\n", 91 | "Name: 最低温, Length: 4006, dtype: int64" 92 | ] 93 | }, 94 | "execution_count": 4, 95 | "metadata": {}, 96 | "output_type": "execute_result" 97 | } 98 | ], 99 | "source": [ 100 | "df['最低温'].sort_values(ascending=False)" 101 | ] 102 | }, 103 | { 104 | "attachments": {}, 105 | "cell_type": "markdown", 106 | "metadata": {}, 107 | "source": [ 108 | "2. df的排序" 109 | ] 110 | }, 111 | { 112 | "attachments": {}, 113 | "cell_type": "markdown", 114 | "metadata": {}, 115 | "source": [ 116 | "2.1 单列排序" 117 | ] 118 | }, 119 | { 120 | "cell_type": "code", 121 | "execution_count": 6, 122 | "metadata": {}, 123 | "outputs": [ 124 | { 125 | "data": { 126 | "text/html": [ 127 | "
\n", 128 | "\n", 141 | "\n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | "
最高温最低温天气风力风向空气质量指数weekday
36460-19多云~晴西北风4级64 良周三
1835-6-16多云~晴北风4-5级24 优周五
710-3-15晴转阴~晴间多云北风4-5级NaN周六
721-6-14晴间多云北风4-5级NaN周三
3647-7-14西北风3级34 优周四
.....................
27603627晴~多云南风1-2级96 良周六
31113627晴~多云西南风2级102 轻度周日
27573527多云~雷阵雨东南风1-2级91 良周三
27453327多云西南风3-4级116 轻度周五
27443327多云~雷阵雨南风1-2级91 良周四
\n", 255 | "

4006 rows × 6 columns

\n", 256 | "
" 257 | ], 258 | "text/plain": [ 259 | " 最高温 最低温 天气 风力风向 空气质量指数 weekday\n", 260 | "3646 0 -19 多云~晴 西北风4级 64 良 周三\n", 261 | "1835 -6 -16 多云~晴 北风4-5级 24 优 周五\n", 262 | "710 -3 -15 晴转阴~晴间多云 北风4-5级 NaN 周六\n", 263 | "721 -6 -14 晴间多云 北风4-5级 NaN 周三\n", 264 | "3647 -7 -14 晴 西北风3级 34 优 周四\n", 265 | "... ... ... ... ... ... ...\n", 266 | "2760 36 27 晴~多云 南风1-2级 96 良 周六\n", 267 | "3111 36 27 晴~多云 西南风2级 102 轻度 周日\n", 268 | "2757 35 27 多云~雷阵雨 东南风1-2级 91 良 周三\n", 269 | "2745 33 27 多云 西南风3-4级 116 轻度 周五\n", 270 | "2744 33 27 多云~雷阵雨 南风1-2级 91 良 周四\n", 271 | "\n", 272 | "[4006 rows x 6 columns]" 273 | ] 274 | }, 275 | "execution_count": 6, 276 | "metadata": {}, 277 | "output_type": "execute_result" 278 | } 279 | ], 280 | "source": [ 281 | "df.sort_values(by='最低温')" 282 | ] 283 | }, 284 | { 285 | "attachments": {}, 286 | "cell_type": "markdown", 287 | "metadata": {}, 288 | "source": [ 289 | "2.2 多列排序" 290 | ] 291 | }, 292 | { 293 | "cell_type": "code", 294 | "execution_count": 7, 295 | "metadata": {}, 296 | "outputs": [ 297 | { 298 | "data": { 299 | "text/html": [ 300 | "
\n", 301 | "\n", 314 | "\n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | "
最高温最低温天气风力风向空气质量指数weekday
1836-11-14北风5-6级65 良周六
3638-8-13多云~晴西北风4级56 良周二
3647-7-14西北风3级34 优周四
721-6-14晴间多云北风4-5级NaN周三
1835-6-16多云~晴北风4-5级24 优周五
.....................
30943825晴~多云西南风2级89 良周四
5223824多云~晴无持续风向微风NaN周日
23453824南风1-2级82 良周四
12323823晴间多云~多云转晴无持续风向微风NaN周四
16424025雷雨~晴无持续风向微风NaN周一
\n", 428 | "

4006 rows × 6 columns

\n", 429 | "
" 430 | ], 431 | "text/plain": [ 432 | " 最高温 最低温 天气 风力风向 空气质量指数 weekday\n", 433 | "1836 -11 -14 晴 北风5-6级 65 良 周六\n", 434 | "3638 -8 -13 多云~晴 西北风4级 56 良 周二\n", 435 | "3647 -7 -14 晴 西北风3级 34 优 周四\n", 436 | "721 -6 -14 晴间多云 北风4-5级 NaN 周三\n", 437 | "1835 -6 -16 多云~晴 北风4-5级 24 优 周五\n", 438 | "... ... ... ... ... ... ...\n", 439 | "3094 38 25 晴~多云 西南风2级 89 良 周四\n", 440 | "522 38 24 多云~晴 无持续风向微风 NaN 周日\n", 441 | "2345 38 24 晴 南风1-2级 82 良 周四\n", 442 | "1232 38 23 晴间多云~多云转晴 无持续风向微风 NaN 周四\n", 443 | "1642 40 25 雷雨~晴 无持续风向微风 NaN 周一\n", 444 | "\n", 445 | "[4006 rows x 6 columns]" 446 | ] 447 | }, 448 | "execution_count": 7, 449 | "metadata": {}, 450 | "output_type": "execute_result" 451 | } 452 | ], 453 | "source": [ 454 | "# 按最高温升序,最低温降序排序\n", 455 | "df.sort_values(by=['最高温','最低温'],ascending=[True,False])" 456 | ] 457 | }, 458 | { 459 | "cell_type": "code", 460 | "execution_count": 8, 461 | "metadata": {}, 462 | "outputs": [ 463 | { 464 | "data": { 465 | "text/html": [ 466 | "
\n", 467 | "\n", 480 | "\n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | "
最高温最低温天气风力风向空气质量指数weekday
16424025雷雨~晴无持续风向微风NaN周一
16413825无持续风向微风NaN周日
27003825多云西南风4-5级94 良周二
30943825晴~多云西南风2级89 良周四
5223824多云~晴无持续风向微风NaN周日
.....................
721-6-14晴间多云北风4-5级NaN周三
1835-6-16多云~晴北风4-5级24 优周五
3647-7-14西北风3级34 优周四
3638-8-13多云~晴西北风4级56 良周二
1836-11-14北风5-6级65 良周六
\n", 594 | "

4006 rows × 6 columns

\n", 595 | "
" 596 | ], 597 | "text/plain": [ 598 | " 最高温 最低温 天气 风力风向 空气质量指数 weekday\n", 599 | "1642 40 25 雷雨~晴 无持续风向微风 NaN 周一\n", 600 | "1641 38 25 晴 无持续风向微风 NaN 周日\n", 601 | "2700 38 25 多云 西南风4-5级 94 良 周二\n", 602 | "3094 38 25 晴~多云 西南风2级 89 良 周四\n", 603 | "522 38 24 多云~晴 无持续风向微风 NaN 周日\n", 604 | "... ... ... ... ... ... ...\n", 605 | "721 -6 -14 晴间多云 北风4-5级 NaN 周三\n", 606 | "1835 -6 -16 多云~晴 北风4-5级 24 优 周五\n", 607 | "3647 -7 -14 晴 西北风3级 34 优 周四\n", 608 | "3638 -8 -13 多云~晴 西北风4级 56 良 周二\n", 609 | "1836 -11 -14 晴 北风5-6级 65 良 周六\n", 610 | "\n", 611 | "[4006 rows x 6 columns]" 612 | ] 613 | }, 614 | "execution_count": 8, 615 | "metadata": {}, 616 | "output_type": "execute_result" 617 | } 618 | ], 619 | "source": [ 620 | "# 两个字段都按照降序排序\n", 621 | "df.sort_values(by=['最高温','最低温'],ascending=False)" 622 | ] 623 | } 624 | ], 625 | "metadata": { 626 | "kernelspec": { 627 | "display_name": "Python 3", 628 | "language": "python", 629 | "name": "python3" 630 | }, 631 | "language_info": { 632 | "codemirror_mode": { 633 | "name": "ipython", 634 | "version": 3 635 | }, 636 | "file_extension": ".py", 637 | "mimetype": "text/x-python", 638 | "name": "python", 639 | "nbconvert_exporter": "python", 640 | "pygments_lexer": "ipython3", 641 | "version": "3.10.8" 642 | }, 643 | "orig_nbformat": 4 644 | }, 645 | "nbformat": 4, 646 | "nbformat_minor": 2 647 | } 648 | -------------------------------------------------------------------------------- /pandas_demo/新增数据列.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "attachments": {}, 5 | "cell_type": "markdown", 6 | "metadata": {}, 7 | "source": [ 8 | "在进行数据分析时,经常需要根据一定条件创建新的数据列,然后及逆行进一步分析\n", 9 | "1. 直接赋值\n", 10 | "2. df.apply方法\n", 11 | "3. df.assign方法\n", 12 | "4. 按条件选择分组分别赋值" 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": 1, 18 | "metadata": {}, 19 | "outputs": [ 20 | { 21 | "data": { 22 | "text/html": [ 23 | "
\n", 24 | "\n", 37 | "\n", 38 | " \n", 39 | " \n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | "
日期最高温最低温天气风力风向空气质量指数
02011-01-01 周六-2°-7°多云~阴无持续风向微风NaN
12011-01-02 周日-2°-7°多云无持续风向微风NaN
22011-01-03 周一-2°-6°多云~阴西北风~北风3-4级~4-5级NaN
32011-01-04 周二-2°-9°北风5-6级NaN
42011-01-05 周三-2°-10°北风~无持续风向3-4级~微风NaN
\n", 97 | "
" 98 | ], 99 | "text/plain": [ 100 | " 日期 最高温 最低温 天气 风力风向 空气质量指数\n", 101 | "0 2011-01-01 周六 -2° -7° 多云~阴 无持续风向微风 NaN\n", 102 | "1 2011-01-02 周日 -2° -7° 多云 无持续风向微风 NaN\n", 103 | "2 2011-01-03 周一 -2° -6° 多云~阴 西北风~北风3-4级~4-5级 NaN\n", 104 | "3 2011-01-04 周二 -2° -9° 晴 北风5-6级 NaN\n", 105 | "4 2011-01-05 周三 -2° -10° 晴 北风~无持续风向3-4级~微风 NaN" 106 | ] 107 | }, 108 | "execution_count": 1, 109 | "metadata": {}, 110 | "output_type": "execute_result" 111 | } 112 | ], 113 | "source": [ 114 | "import pandas as pd\n", 115 | "df=pd.read_excel(\"./weater_beijing.xlsx\")\n", 116 | "df.head()" 117 | ] 118 | }, 119 | { 120 | "cell_type": "code", 121 | "execution_count": 15, 122 | "metadata": {}, 123 | "outputs": [], 124 | "source": [ 125 | "# 替换温度的后缀°\n", 126 | "df.loc[:,'最低温']=df['最低温'].str.replace(\"°\",\"\")\n", 127 | "df.loc[:,'最高温']=df['最高温'].str.replace(\"°\",\"\")" 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": 29, 133 | "metadata": {}, 134 | "outputs": [], 135 | "source": [ 136 | "df.loc[:,'最低温'].fillna('0',inplace=True)" 137 | ] 138 | }, 139 | { 140 | "cell_type": "code", 141 | "execution_count": 32, 142 | "metadata": {}, 143 | "outputs": [ 144 | { 145 | "data": { 146 | "text/html": [ 147 | "
\n", 148 | "\n", 161 | "\n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | "
日期最高温最低温天气风力风向空气质量指数
4552012-04-11 周三9多云~无持续风向~微风~NaN
\n", 185 | "
" 186 | ], 187 | "text/plain": [ 188 | " 日期 最高温 最低温 天气 风力风向 空气质量指数\n", 189 | "455 2012-04-11 周三 9 多云~ 无持续风向~微风~ NaN" 190 | ] 191 | }, 192 | "execution_count": 32, 193 | "metadata": {}, 194 | "output_type": "execute_result" 195 | } 196 | ], 197 | "source": [ 198 | "df.loc[df['最低温']=='']" 199 | ] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "execution_count": 34, 204 | "metadata": {}, 205 | "outputs": [], 206 | "source": [ 207 | "# 将最低温中''替换成0\n", 208 | "df.loc[:,'最低温']=df['最低温'].replace('','0')" 209 | ] 210 | }, 211 | { 212 | "cell_type": "code", 213 | "execution_count": 36, 214 | "metadata": {}, 215 | "outputs": [ 216 | { 217 | "name": "stderr", 218 | "output_type": "stream", 219 | "text": [ 220 | "C:\\Users\\JDQ\\AppData\\Local\\Temp\\ipykernel_17304\\77100508.py:2: DeprecationWarning: In a future version, `df.iloc[:, i] = newvals` will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either `df[df.columns[i]] = newvals` or, if columns are non-unique, `df.isetitem(i, newvals)`\n", 221 | " df.loc[:,'最高温']=df.loc[:,'最高温'].astype('int32')\n" 222 | ] 223 | } 224 | ], 225 | "source": [ 226 | "# 将最高温和最低温列的obj类型转换成int型\n", 227 | "df.loc[:,'最低温']=df.loc[:,'最低温'].astype('int32')\n", 228 | "df.loc[:,'最高温']=df.loc[:,'最高温'].astype('int32')" 229 | ] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": 30, 234 | "metadata": {}, 235 | "outputs": [ 236 | { 237 | "data": { 238 | "text/html": [ 239 | "
\n", 240 | "\n", 253 | "\n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | "
日期最高温最低温天气风力风向空气质量指数
4552012-04-11 周三9多云~无持续风向~微风~NaN
\n", 277 | "
" 278 | ], 279 | "text/plain": [ 280 | " 日期 最高温 最低温 天气 风力风向 空气质量指数\n", 281 | "455 2012-04-11 周三 9 多云~ 无持续风向~微风~ NaN" 282 | ] 283 | }, 284 | "execution_count": 30, 285 | "metadata": {}, 286 | "output_type": "execute_result" 287 | } 288 | ], 289 | "source": [ 290 | "df.loc[df['日期']=='2012-04-11 周三']" 291 | ] 292 | }, 293 | { 294 | "attachments": {}, 295 | "cell_type": "markdown", 296 | "metadata": {}, 297 | "source": [ 298 | "1. 直接赋值" 299 | ] 300 | }, 301 | { 302 | "attachments": {}, 303 | "cell_type": "markdown", 304 | "metadata": {}, 305 | "source": [ 306 | "实例:计算温差" 307 | ] 308 | }, 309 | { 310 | "cell_type": "code", 311 | "execution_count": 42, 312 | "metadata": {}, 313 | "outputs": [ 314 | { 315 | "data": { 316 | "text/plain": [ 317 | "日期 object\n", 318 | "最高温 int32\n", 319 | "最低温 int32\n", 320 | "天气 object\n", 321 | "风力风向 object\n", 322 | "空气质量指数 object\n", 323 | "dtype: object" 324 | ] 325 | }, 326 | "execution_count": 42, 327 | "metadata": {}, 328 | "output_type": "execute_result" 329 | } 330 | ], 331 | "source": [ 332 | "df.dtypes" 333 | ] 334 | }, 335 | { 336 | "cell_type": "code", 337 | "execution_count": 43, 338 | "metadata": {}, 339 | "outputs": [], 340 | "source": [ 341 | "df['wencha']=df['最高温']-df['最低温']" 342 | ] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": 46, 347 | "metadata": {}, 348 | "outputs": [ 349 | { 350 | "data": { 351 | "text/html": [ 352 | "
\n", 353 | "\n", 366 | "\n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | "
日期最高温最低温天气风力风向空气质量指数wencha
02011-01-01 周六-2-7多云~阴无持续风向微风NaN5
12011-01-02 周日-2-7多云无持续风向微风NaN5
22011-01-03 周一-2-6多云~阴西北风~北风3-4级~4-5级NaN4
32011-01-04 周二-2-9北风5-6级NaN7
42011-01-05 周三-2-10北风~无持续风向3-4级~微风NaN8
\n", 432 | "
" 433 | ], 434 | "text/plain": [ 435 | " 日期 最高温 最低温 天气 风力风向 空气质量指数 wencha\n", 436 | "0 2011-01-01 周六 -2 -7 多云~阴 无持续风向微风 NaN 5\n", 437 | "1 2011-01-02 周日 -2 -7 多云 无持续风向微风 NaN 5\n", 438 | "2 2011-01-03 周一 -2 -6 多云~阴 西北风~北风3-4级~4-5级 NaN 4\n", 439 | "3 2011-01-04 周二 -2 -9 晴 北风5-6级 NaN 7\n", 440 | "4 2011-01-05 周三 -2 -10 晴 北风~无持续风向3-4级~微风 NaN 8" 441 | ] 442 | }, 443 | "execution_count": 46, 444 | "metadata": {}, 445 | "output_type": "execute_result" 446 | } 447 | ], 448 | "source": [ 449 | "df.head()" 450 | ] 451 | }, 452 | { 453 | "attachments": {}, 454 | "cell_type": "markdown", 455 | "metadata": {}, 456 | "source": [ 457 | "2. df.apply方法\n", 458 | "DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwargs)[source]\n", 459 | "Apply a function along an axis of the DataFrame.\n", 460 | "\n", 461 | "Objects passed to the function are Series objects whose index is either the DataFrame’s index (axis=0) or the DataFrame’s columns (axis=1). By default (result_type=None), the final return type is inferred from the return type of the applied function. Otherwise, it depends on the result_type argument.\n", 462 | "\n", 463 | "实例:添加一列温度类型\n", 464 | " 1. 如果最高温度大于33度就是高温\n", 465 | " 2. 如果小于-10度就是低温\n", 466 | " 3. 否则就是常温" 467 | ] 468 | }, 469 | { 470 | "cell_type": "code", 471 | "execution_count": 49, 472 | "metadata": {}, 473 | "outputs": [], 474 | "source": [ 475 | "def get_wendu_type(x):\n", 476 | " if x['最高温']>33:\n", 477 | " return '高温'\n", 478 | " if x['最低温']<-10:\n", 479 | " return '低温'\n", 480 | " return '常温'\n", 481 | "\n", 482 | "# 这里需要设置axis==1,这是series的index是columns\n", 483 | "df.loc[:,'wendu_type']=df.apply(get_wendu_type,axis=1)" 484 | ] 485 | }, 486 | { 487 | "cell_type": "code", 488 | "execution_count": 50, 489 | "metadata": {}, 490 | "outputs": [ 491 | { 492 | "data": { 493 | "text/plain": [ 494 | "常温 3730\n", 495 | "高温 231\n", 496 | "低温 45\n", 497 | "Name: wendu_type, dtype: int64" 498 | ] 499 | }, 500 | "execution_count": 50, 501 | "metadata": {}, 502 | "output_type": "execute_result" 503 | } 504 | ], 505 | "source": [ 506 | "# 产看温度类型的计数\n", 507 | "df['wendu_type'].value_counts()" 508 | ] 509 | }, 510 | { 511 | "attachments": {}, 512 | "cell_type": "markdown", 513 | "metadata": {}, 514 | "source": [ 515 | "3. df.assign方法\n", 516 | "DataFrame.assign(**kwargs)[source]\n", 517 | "Assign new columns to a DataFrame.\n", 518 | "\n", 519 | "Returns a new object with all original columns in addition to new ones. Existing columns that are re-assigned will be overwritten.\n", 520 | "\n", 521 | "实例:将温度从摄氏度变为华氏度" 522 | ] 523 | }, 524 | { 525 | "cell_type": "code", 526 | "execution_count": 51, 527 | "metadata": {}, 528 | "outputs": [ 529 | { 530 | "data": { 531 | "text/html": [ 532 | "
\n", 533 | "\n", 546 | "\n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | "
日期最高温最低温天气风力风向空气质量指数wenchawendu_type华氏度最高温华氏度最低温
02011-01-01 周六-2-7多云~阴无持续风向微风NaN5常温28.419.4
12011-01-02 周日-2-7多云无持续风向微风NaN5常温28.419.4
22011-01-03 周一-2-6多云~阴西北风~北风3-4级~4-5级NaN4常温28.421.2
32011-01-04 周二-2-9北风5-6级NaN7常温28.415.8
42011-01-05 周三-2-10北风~无持续风向3-4级~微风NaN8常温28.414.0
.................................
40012021-12-27 周一6-8西北风1级56 良14常温42.817.6
40022021-12-28 周二6-5多云~晴西北风1级64 良11常温42.823.0
40032021-12-29 周三5-5西北风3级43 优10常温41.023.0
40042021-12-30 周四6-7西北风3级38 优13常温42.819.4
40052021-12-31 周五5-7东北风1级44 优12常温41.019.4
\n", 708 | "

4006 rows × 10 columns

\n", 709 | "
" 710 | ], 711 | "text/plain": [ 712 | " 日期 最高温 最低温 天气 风力风向 空气质量指数 wencha \\\n", 713 | "0 2011-01-01 周六 -2 -7 多云~阴 无持续风向微风 NaN 5 \n", 714 | "1 2011-01-02 周日 -2 -7 多云 无持续风向微风 NaN 5 \n", 715 | "2 2011-01-03 周一 -2 -6 多云~阴 西北风~北风3-4级~4-5级 NaN 4 \n", 716 | "3 2011-01-04 周二 -2 -9 晴 北风5-6级 NaN 7 \n", 717 | "4 2011-01-05 周三 -2 -10 晴 北风~无持续风向3-4级~微风 NaN 8 \n", 718 | "... ... ... ... ... ... ... ... \n", 719 | "4001 2021-12-27 周一 6 -8 晴 西北风1级 56 良 14 \n", 720 | "4002 2021-12-28 周二 6 -5 多云~晴 西北风1级 64 良 11 \n", 721 | "4003 2021-12-29 周三 5 -5 晴 西北风3级 43 优 10 \n", 722 | "4004 2021-12-30 周四 6 -7 晴 西北风3级 38 优 13 \n", 723 | "4005 2021-12-31 周五 5 -7 晴 东北风1级 44 优 12 \n", 724 | "\n", 725 | " wendu_type 华氏度最高温 华氏度最低温 \n", 726 | "0 常温 28.4 19.4 \n", 727 | "1 常温 28.4 19.4 \n", 728 | "2 常温 28.4 21.2 \n", 729 | "3 常温 28.4 15.8 \n", 730 | "4 常温 28.4 14.0 \n", 731 | "... ... ... ... \n", 732 | "4001 常温 42.8 17.6 \n", 733 | "4002 常温 42.8 23.0 \n", 734 | "4003 常温 41.0 23.0 \n", 735 | "4004 常温 42.8 19.4 \n", 736 | "4005 常温 41.0 19.4 \n", 737 | "\n", 738 | "[4006 rows x 10 columns]" 739 | ] 740 | }, 741 | "execution_count": 51, 742 | "metadata": {}, 743 | "output_type": "execute_result" 744 | } 745 | ], 746 | "source": [ 747 | "# 可以同时添加多个新的列\n", 748 | "df.assign(\n", 749 | " 华氏度最高温=lambda x:x['最高温']*9/5+32,\n", 750 | " 华氏度最低温=lambda x:x['最低温']*9/5+32,\n", 751 | ")" 752 | ] 753 | }, 754 | { 755 | "attachments": {}, 756 | "cell_type": "markdown", 757 | "metadata": {}, 758 | "source": [ 759 | "4. 按条件选择分组分别赋值\n", 760 | "按条件先选择数据,然后对这部分数据赋值新列\n", 761 | "实例:高低温差大于10度,则认为温差大" 762 | ] 763 | }, 764 | { 765 | "cell_type": "code", 766 | "execution_count": 54, 767 | "metadata": {}, 768 | "outputs": [], 769 | "source": [ 770 | "# 先创建空列(这是第一种创建新列的方法)\n", 771 | "df['wencha_type']=''\n", 772 | "df.loc[df['最高温']-df['最低温']>10,'wencha_type']='温差大'\n", 773 | "df.loc[df['最高温']-df['最低温']<=10,'wencha_type']='温差正常'" 774 | ] 775 | }, 776 | { 777 | "cell_type": "code", 778 | "execution_count": 55, 779 | "metadata": {}, 780 | "outputs": [ 781 | { 782 | "data": { 783 | "text/plain": [ 784 | "温差正常 2099\n", 785 | "温差大 1907\n", 786 | "Name: wencha_type, dtype: int64" 787 | ] 788 | }, 789 | "execution_count": 55, 790 | "metadata": {}, 791 | "output_type": "execute_result" 792 | } 793 | ], 794 | "source": [ 795 | "df['wencha_type'].value_counts()" 796 | ] 797 | } 798 | ], 799 | "metadata": { 800 | "kernelspec": { 801 | "display_name": "Python 3", 802 | "language": "python", 803 | "name": "python3" 804 | }, 805 | "language_info": { 806 | "codemirror_mode": { 807 | "name": "ipython", 808 | "version": 3 809 | }, 810 | "file_extension": ".py", 811 | "mimetype": "text/x-python", 812 | "name": "python", 813 | "nbconvert_exporter": "python", 814 | "pygments_lexer": "ipython3", 815 | "version": "3.10.8" 816 | }, 817 | "orig_nbformat": 4 818 | }, 819 | "nbformat": 4, 820 | "nbformat_minor": 2 821 | } 822 | -------------------------------------------------------------------------------- /pandas_demo/data/movies/u.user: -------------------------------------------------------------------------------- 1 | 1|24|M|technician|85711 2 | 2|53|F|other|94043 3 | 3|23|M|writer|32067 4 | 4|24|M|technician|43537 5 | 5|33|F|other|15213 6 | 6|42|M|executive|98101 7 | 7|57|M|administrator|91344 8 | 8|36|M|administrator|05201 9 | 9|29|M|student|01002 10 | 10|53|M|lawyer|90703 11 | 11|39|F|other|30329 12 | 12|28|F|other|06405 13 | 13|47|M|educator|29206 14 | 14|45|M|scientist|55106 15 | 15|49|F|educator|97301 16 | 16|21|M|entertainment|10309 17 | 17|30|M|programmer|06355 18 | 18|35|F|other|37212 19 | 19|40|M|librarian|02138 20 | 20|42|F|homemaker|95660 21 | 21|26|M|writer|30068 22 | 22|25|M|writer|40206 23 | 23|30|F|artist|48197 24 | 24|21|F|artist|94533 25 | 25|39|M|engineer|55107 26 | 26|49|M|engineer|21044 27 | 27|40|F|librarian|30030 28 | 28|32|M|writer|55369 29 | 29|41|M|programmer|94043 30 | 30|7|M|student|55436 31 | 31|24|M|artist|10003 32 | 32|28|F|student|78741 33 | 33|23|M|student|27510 34 | 34|38|F|administrator|42141 35 | 35|20|F|homemaker|42459 36 | 36|19|F|student|93117 37 | 37|23|M|student|55105 38 | 38|28|F|other|54467 39 | 39|41|M|entertainment|01040 40 | 40|38|M|scientist|27514 41 | 41|33|M|engineer|80525 42 | 42|30|M|administrator|17870 43 | 43|29|F|librarian|20854 44 | 44|26|M|technician|46260 45 | 45|29|M|programmer|50233 46 | 46|27|F|marketing|46538 47 | 47|53|M|marketing|07102 48 | 48|45|M|administrator|12550 49 | 49|23|F|student|76111 50 | 50|21|M|writer|52245 51 | 51|28|M|educator|16509 52 | 52|18|F|student|55105 53 | 53|26|M|programmer|55414 54 | 54|22|M|executive|66315 55 | 55|37|M|programmer|01331 56 | 56|25|M|librarian|46260 57 | 57|16|M|none|84010 58 | 58|27|M|programmer|52246 59 | 59|49|M|educator|08403 60 | 60|50|M|healthcare|06472 61 | 61|36|M|engineer|30040 62 | 62|27|F|administrator|97214 63 | 63|31|M|marketing|75240 64 | 64|32|M|educator|43202 65 | 65|51|F|educator|48118 66 | 66|23|M|student|80521 67 | 67|17|M|student|60402 68 | 68|19|M|student|22904 69 | 69|24|M|engineer|55337 70 | 70|27|M|engineer|60067 71 | 71|39|M|scientist|98034 72 | 72|48|F|administrator|73034 73 | 73|24|M|student|41850 74 | 74|39|M|scientist|T8H1N 75 | 75|24|M|entertainment|08816 76 | 76|20|M|student|02215 77 | 77|30|M|technician|29379 78 | 78|26|M|administrator|61801 79 | 79|39|F|administrator|03755 80 | 80|34|F|administrator|52241 81 | 81|21|M|student|21218 82 | 82|50|M|programmer|22902 83 | 83|40|M|other|44133 84 | 84|32|M|executive|55369 85 | 85|51|M|educator|20003 86 | 86|26|M|administrator|46005 87 | 87|47|M|administrator|89503 88 | 88|49|F|librarian|11701 89 | 89|43|F|administrator|68106 90 | 90|60|M|educator|78155 91 | 91|55|M|marketing|01913 92 | 92|32|M|entertainment|80525 93 | 93|48|M|executive|23112 94 | 94|26|M|student|71457 95 | 95|31|M|administrator|10707 96 | 96|25|F|artist|75206 97 | 97|43|M|artist|98006 98 | 98|49|F|executive|90291 99 | 99|20|M|student|63129 100 | 100|36|M|executive|90254 101 | 101|15|M|student|05146 102 | 102|38|M|programmer|30220 103 | 103|26|M|student|55108 104 | 104|27|M|student|55108 105 | 105|24|M|engineer|94043 106 | 106|61|M|retired|55125 107 | 107|39|M|scientist|60466 108 | 108|44|M|educator|63130 109 | 109|29|M|other|55423 110 | 110|19|M|student|77840 111 | 111|57|M|engineer|90630 112 | 112|30|M|salesman|60613 113 | 113|47|M|executive|95032 114 | 114|27|M|programmer|75013 115 | 115|31|M|engineer|17110 116 | 116|40|M|healthcare|97232 117 | 117|20|M|student|16125 118 | 118|21|M|administrator|90210 119 | 119|32|M|programmer|67401 120 | 120|47|F|other|06260 121 | 121|54|M|librarian|99603 122 | 122|32|F|writer|22206 123 | 123|48|F|artist|20008 124 | 124|34|M|student|60615 125 | 125|30|M|lawyer|22202 126 | 126|28|F|lawyer|20015 127 | 127|33|M|none|73439 128 | 128|24|F|marketing|20009 129 | 129|36|F|marketing|07039 130 | 130|20|M|none|60115 131 | 131|59|F|administrator|15237 132 | 132|24|M|other|94612 133 | 133|53|M|engineer|78602 134 | 134|31|M|programmer|80236 135 | 135|23|M|student|38401 136 | 136|51|M|other|97365 137 | 137|50|M|educator|84408 138 | 138|46|M|doctor|53211 139 | 139|20|M|student|08904 140 | 140|30|F|student|32250 141 | 141|49|M|programmer|36117 142 | 142|13|M|other|48118 143 | 143|42|M|technician|08832 144 | 144|53|M|programmer|20910 145 | 145|31|M|entertainment|V3N4P 146 | 146|45|M|artist|83814 147 | 147|40|F|librarian|02143 148 | 148|33|M|engineer|97006 149 | 149|35|F|marketing|17325 150 | 150|20|F|artist|02139 151 | 151|38|F|administrator|48103 152 | 152|33|F|educator|68767 153 | 153|25|M|student|60641 154 | 154|25|M|student|53703 155 | 155|32|F|other|11217 156 | 156|25|M|educator|08360 157 | 157|57|M|engineer|70808 158 | 158|50|M|educator|27606 159 | 159|23|F|student|55346 160 | 160|27|M|programmer|66215 161 | 161|50|M|lawyer|55104 162 | 162|25|M|artist|15610 163 | 163|49|M|administrator|97212 164 | 164|47|M|healthcare|80123 165 | 165|20|F|other|53715 166 | 166|47|M|educator|55113 167 | 167|37|M|other|L9G2B 168 | 168|48|M|other|80127 169 | 169|52|F|other|53705 170 | 170|53|F|healthcare|30067 171 | 171|48|F|educator|78750 172 | 172|55|M|marketing|22207 173 | 173|56|M|other|22306 174 | 174|30|F|administrator|52302 175 | 175|26|F|scientist|21911 176 | 176|28|M|scientist|07030 177 | 177|20|M|programmer|19104 178 | 178|26|M|other|49512 179 | 179|15|M|entertainment|20755 180 | 180|22|F|administrator|60202 181 | 181|26|M|executive|21218 182 | 182|36|M|programmer|33884 183 | 183|33|M|scientist|27708 184 | 184|37|M|librarian|76013 185 | 185|53|F|librarian|97403 186 | 186|39|F|executive|00000 187 | 187|26|M|educator|16801 188 | 188|42|M|student|29440 189 | 189|32|M|artist|95014 190 | 190|30|M|administrator|95938 191 | 191|33|M|administrator|95161 192 | 192|42|M|educator|90840 193 | 193|29|M|student|49931 194 | 194|38|M|administrator|02154 195 | 195|42|M|scientist|93555 196 | 196|49|M|writer|55105 197 | 197|55|M|technician|75094 198 | 198|21|F|student|55414 199 | 199|30|M|writer|17604 200 | 200|40|M|programmer|93402 201 | 201|27|M|writer|E2A4H 202 | 202|41|F|educator|60201 203 | 203|25|F|student|32301 204 | 204|52|F|librarian|10960 205 | 205|47|M|lawyer|06371 206 | 206|14|F|student|53115 207 | 207|39|M|marketing|92037 208 | 208|43|M|engineer|01720 209 | 209|33|F|educator|85710 210 | 210|39|M|engineer|03060 211 | 211|66|M|salesman|32605 212 | 212|49|F|educator|61401 213 | 213|33|M|executive|55345 214 | 214|26|F|librarian|11231 215 | 215|35|M|programmer|63033 216 | 216|22|M|engineer|02215 217 | 217|22|M|other|11727 218 | 218|37|M|administrator|06513 219 | 219|32|M|programmer|43212 220 | 220|30|M|librarian|78205 221 | 221|19|M|student|20685 222 | 222|29|M|programmer|27502 223 | 223|19|F|student|47906 224 | 224|31|F|educator|43512 225 | 225|51|F|administrator|58202 226 | 226|28|M|student|92103 227 | 227|46|M|executive|60659 228 | 228|21|F|student|22003 229 | 229|29|F|librarian|22903 230 | 230|28|F|student|14476 231 | 231|48|M|librarian|01080 232 | 232|45|M|scientist|99709 233 | 233|38|M|engineer|98682 234 | 234|60|M|retired|94702 235 | 235|37|M|educator|22973 236 | 236|44|F|writer|53214 237 | 237|49|M|administrator|63146 238 | 238|42|F|administrator|44124 239 | 239|39|M|artist|95628 240 | 240|23|F|educator|20784 241 | 241|26|F|student|20001 242 | 242|33|M|educator|31404 243 | 243|33|M|educator|60201 244 | 244|28|M|technician|80525 245 | 245|22|M|student|55109 246 | 246|19|M|student|28734 247 | 247|28|M|engineer|20770 248 | 248|25|M|student|37235 249 | 249|25|M|student|84103 250 | 250|29|M|executive|95110 251 | 251|28|M|doctor|85032 252 | 252|42|M|engineer|07733 253 | 253|26|F|librarian|22903 254 | 254|44|M|educator|42647 255 | 255|23|M|entertainment|07029 256 | 256|35|F|none|39042 257 | 257|17|M|student|77005 258 | 258|19|F|student|77801 259 | 259|21|M|student|48823 260 | 260|40|F|artist|89801 261 | 261|28|M|administrator|85202 262 | 262|19|F|student|78264 263 | 263|41|M|programmer|55346 264 | 264|36|F|writer|90064 265 | 265|26|M|executive|84601 266 | 266|62|F|administrator|78756 267 | 267|23|M|engineer|83716 268 | 268|24|M|engineer|19422 269 | 269|31|F|librarian|43201 270 | 270|18|F|student|63119 271 | 271|51|M|engineer|22932 272 | 272|33|M|scientist|53706 273 | 273|50|F|other|10016 274 | 274|20|F|student|55414 275 | 275|38|M|engineer|92064 276 | 276|21|M|student|95064 277 | 277|35|F|administrator|55406 278 | 278|37|F|librarian|30033 279 | 279|33|M|programmer|85251 280 | 280|30|F|librarian|22903 281 | 281|15|F|student|06059 282 | 282|22|M|administrator|20057 283 | 283|28|M|programmer|55305 284 | 284|40|M|executive|92629 285 | 285|25|M|programmer|53713 286 | 286|27|M|student|15217 287 | 287|21|M|salesman|31211 288 | 288|34|M|marketing|23226 289 | 289|11|M|none|94619 290 | 290|40|M|engineer|93550 291 | 291|19|M|student|44106 292 | 292|35|F|programmer|94703 293 | 293|24|M|writer|60804 294 | 294|34|M|technician|92110 295 | 295|31|M|educator|50325 296 | 296|43|F|administrator|16803 297 | 297|29|F|educator|98103 298 | 298|44|M|executive|01581 299 | 299|29|M|doctor|63108 300 | 300|26|F|programmer|55106 301 | 301|24|M|student|55439 302 | 302|42|M|educator|77904 303 | 303|19|M|student|14853 304 | 304|22|F|student|71701 305 | 305|23|M|programmer|94086 306 | 306|45|M|other|73132 307 | 307|25|M|student|55454 308 | 308|60|M|retired|95076 309 | 309|40|M|scientist|70802 310 | 310|37|M|educator|91711 311 | 311|32|M|technician|73071 312 | 312|48|M|other|02110 313 | 313|41|M|marketing|60035 314 | 314|20|F|student|08043 315 | 315|31|M|educator|18301 316 | 316|43|F|other|77009 317 | 317|22|M|administrator|13210 318 | 318|65|M|retired|06518 319 | 319|38|M|programmer|22030 320 | 320|19|M|student|24060 321 | 321|49|F|educator|55413 322 | 322|20|M|student|50613 323 | 323|21|M|student|19149 324 | 324|21|F|student|02176 325 | 325|48|M|technician|02139 326 | 326|41|M|administrator|15235 327 | 327|22|M|student|11101 328 | 328|51|M|administrator|06779 329 | 329|48|M|educator|01720 330 | 330|35|F|educator|33884 331 | 331|33|M|entertainment|91344 332 | 332|20|M|student|40504 333 | 333|47|M|other|V0R2M 334 | 334|32|M|librarian|30002 335 | 335|45|M|executive|33775 336 | 336|23|M|salesman|42101 337 | 337|37|M|scientist|10522 338 | 338|39|F|librarian|59717 339 | 339|35|M|lawyer|37901 340 | 340|46|M|engineer|80123 341 | 341|17|F|student|44405 342 | 342|25|F|other|98006 343 | 343|43|M|engineer|30093 344 | 344|30|F|librarian|94117 345 | 345|28|F|librarian|94143 346 | 346|34|M|other|76059 347 | 347|18|M|student|90210 348 | 348|24|F|student|45660 349 | 349|68|M|retired|61455 350 | 350|32|M|student|97301 351 | 351|61|M|educator|49938 352 | 352|37|F|programmer|55105 353 | 353|25|M|scientist|28480 354 | 354|29|F|librarian|48197 355 | 355|25|M|student|60135 356 | 356|32|F|homemaker|92688 357 | 357|26|M|executive|98133 358 | 358|40|M|educator|10022 359 | 359|22|M|student|61801 360 | 360|51|M|other|98027 361 | 361|22|M|student|44074 362 | 362|35|F|homemaker|85233 363 | 363|20|M|student|87501 364 | 364|63|M|engineer|01810 365 | 365|29|M|lawyer|20009 366 | 366|20|F|student|50670 367 | 367|17|M|student|37411 368 | 368|18|M|student|92113 369 | 369|24|M|student|91335 370 | 370|52|M|writer|08534 371 | 371|36|M|engineer|99206 372 | 372|25|F|student|66046 373 | 373|24|F|other|55116 374 | 374|36|M|executive|78746 375 | 375|17|M|entertainment|37777 376 | 376|28|F|other|10010 377 | 377|22|M|student|18015 378 | 378|35|M|student|02859 379 | 379|44|M|programmer|98117 380 | 380|32|M|engineer|55117 381 | 381|33|M|artist|94608 382 | 382|45|M|engineer|01824 383 | 383|42|M|administrator|75204 384 | 384|52|M|programmer|45218 385 | 385|36|M|writer|10003 386 | 386|36|M|salesman|43221 387 | 387|33|M|entertainment|37412 388 | 388|31|M|other|36106 389 | 389|44|F|writer|83702 390 | 390|42|F|writer|85016 391 | 391|23|M|student|84604 392 | 392|52|M|writer|59801 393 | 393|19|M|student|83686 394 | 394|25|M|administrator|96819 395 | 395|43|M|other|44092 396 | 396|57|M|engineer|94551 397 | 397|17|M|student|27514 398 | 398|40|M|other|60008 399 | 399|25|M|other|92374 400 | 400|33|F|administrator|78213 401 | 401|46|F|healthcare|84107 402 | 402|30|M|engineer|95129 403 | 403|37|M|other|06811 404 | 404|29|F|programmer|55108 405 | 405|22|F|healthcare|10019 406 | 406|52|M|educator|93109 407 | 407|29|M|engineer|03261 408 | 408|23|M|student|61755 409 | 409|48|M|administrator|98225 410 | 410|30|F|artist|94025 411 | 411|34|M|educator|44691 412 | 412|25|M|educator|15222 413 | 413|55|M|educator|78212 414 | 414|24|M|programmer|38115 415 | 415|39|M|educator|85711 416 | 416|20|F|student|92626 417 | 417|27|F|other|48103 418 | 418|55|F|none|21206 419 | 419|37|M|lawyer|43215 420 | 420|53|M|educator|02140 421 | 421|38|F|programmer|55105 422 | 422|26|M|entertainment|94533 423 | 423|64|M|other|91606 424 | 424|36|F|marketing|55422 425 | 425|19|M|student|58644 426 | 426|55|M|educator|01602 427 | 427|51|M|doctor|85258 428 | 428|28|M|student|55414 429 | 429|27|M|student|29205 430 | 430|38|M|scientist|98199 431 | 431|24|M|marketing|92629 432 | 432|22|M|entertainment|50311 433 | 433|27|M|artist|11211 434 | 434|16|F|student|49705 435 | 435|24|M|engineer|60007 436 | 436|30|F|administrator|17345 437 | 437|27|F|other|20009 438 | 438|51|F|administrator|43204 439 | 439|23|F|administrator|20817 440 | 440|30|M|other|48076 441 | 441|50|M|technician|55013 442 | 442|22|M|student|85282 443 | 443|35|M|salesman|33308 444 | 444|51|F|lawyer|53202 445 | 445|21|M|writer|92653 446 | 446|57|M|educator|60201 447 | 447|30|M|administrator|55113 448 | 448|23|M|entertainment|10021 449 | 449|23|M|librarian|55021 450 | 450|35|F|educator|11758 451 | 451|16|M|student|48446 452 | 452|35|M|administrator|28018 453 | 453|18|M|student|06333 454 | 454|57|M|other|97330 455 | 455|48|M|administrator|83709 456 | 456|24|M|technician|31820 457 | 457|33|F|salesman|30011 458 | 458|47|M|technician|Y1A6B 459 | 459|22|M|student|29201 460 | 460|44|F|other|60630 461 | 461|15|M|student|98102 462 | 462|19|F|student|02918 463 | 463|48|F|healthcare|75218 464 | 464|60|M|writer|94583 465 | 465|32|M|other|05001 466 | 466|22|M|student|90804 467 | 467|29|M|engineer|91201 468 | 468|28|M|engineer|02341 469 | 469|60|M|educator|78628 470 | 470|24|M|programmer|10021 471 | 471|10|M|student|77459 472 | 472|24|M|student|87544 473 | 473|29|M|student|94708 474 | 474|51|M|executive|93711 475 | 475|30|M|programmer|75230 476 | 476|28|M|student|60440 477 | 477|23|F|student|02125 478 | 478|29|M|other|10019 479 | 479|30|M|educator|55409 480 | 480|57|M|retired|98257 481 | 481|73|M|retired|37771 482 | 482|18|F|student|40256 483 | 483|29|M|scientist|43212 484 | 484|27|M|student|21208 485 | 485|44|F|educator|95821 486 | 486|39|M|educator|93101 487 | 487|22|M|engineer|92121 488 | 488|48|M|technician|21012 489 | 489|55|M|other|45218 490 | 490|29|F|artist|V5A2B 491 | 491|43|F|writer|53711 492 | 492|57|M|educator|94618 493 | 493|22|M|engineer|60090 494 | 494|38|F|administrator|49428 495 | 495|29|M|engineer|03052 496 | 496|21|F|student|55414 497 | 497|20|M|student|50112 498 | 498|26|M|writer|55408 499 | 499|42|M|programmer|75006 500 | 500|28|M|administrator|94305 501 | 501|22|M|student|10025 502 | 502|22|M|student|23092 503 | 503|50|F|writer|27514 504 | 504|40|F|writer|92115 505 | 505|27|F|other|20657 506 | 506|46|M|programmer|03869 507 | 507|18|F|writer|28450 508 | 508|27|M|marketing|19382 509 | 509|23|M|administrator|10011 510 | 510|34|M|other|98038 511 | 511|22|M|student|21250 512 | 512|29|M|other|20090 513 | 513|43|M|administrator|26241 514 | 514|27|M|programmer|20707 515 | 515|53|M|marketing|49508 516 | 516|53|F|librarian|10021 517 | 517|24|M|student|55454 518 | 518|49|F|writer|99709 519 | 519|22|M|other|55320 520 | 520|62|M|healthcare|12603 521 | 521|19|M|student|02146 522 | 522|36|M|engineer|55443 523 | 523|50|F|administrator|04102 524 | 524|56|M|educator|02159 525 | 525|27|F|administrator|19711 526 | 526|30|M|marketing|97124 527 | 527|33|M|librarian|12180 528 | 528|18|M|student|55104 529 | 529|47|F|administrator|44224 530 | 530|29|M|engineer|94040 531 | 531|30|F|salesman|97408 532 | 532|20|M|student|92705 533 | 533|43|M|librarian|02324 534 | 534|20|M|student|05464 535 | 535|45|F|educator|80302 536 | 536|38|M|engineer|30078 537 | 537|36|M|engineer|22902 538 | 538|31|M|scientist|21010 539 | 539|53|F|administrator|80303 540 | 540|28|M|engineer|91201 541 | 541|19|F|student|84302 542 | 542|21|M|student|60515 543 | 543|33|M|scientist|95123 544 | 544|44|F|other|29464 545 | 545|27|M|technician|08052 546 | 546|36|M|executive|22911 547 | 547|50|M|educator|14534 548 | 548|51|M|writer|95468 549 | 549|42|M|scientist|45680 550 | 550|16|F|student|95453 551 | 551|25|M|programmer|55414 552 | 552|45|M|other|68147 553 | 553|58|M|educator|62901 554 | 554|32|M|scientist|62901 555 | 555|29|F|educator|23227 556 | 556|35|F|educator|30606 557 | 557|30|F|writer|11217 558 | 558|56|F|writer|63132 559 | 559|69|M|executive|10022 560 | 560|32|M|student|10003 561 | 561|23|M|engineer|60005 562 | 562|54|F|administrator|20879 563 | 563|39|F|librarian|32707 564 | 564|65|M|retired|94591 565 | 565|40|M|student|55422 566 | 566|20|M|student|14627 567 | 567|24|M|entertainment|10003 568 | 568|39|M|educator|01915 569 | 569|34|M|educator|91903 570 | 570|26|M|educator|14627 571 | 571|34|M|artist|01945 572 | 572|51|M|educator|20003 573 | 573|68|M|retired|48911 574 | 574|56|M|educator|53188 575 | 575|33|M|marketing|46032 576 | 576|48|M|executive|98281 577 | 577|36|F|student|77845 578 | 578|31|M|administrator|M7A1A 579 | 579|32|M|educator|48103 580 | 580|16|M|student|17961 581 | 581|37|M|other|94131 582 | 582|17|M|student|93003 583 | 583|44|M|engineer|29631 584 | 584|25|M|student|27511 585 | 585|69|M|librarian|98501 586 | 586|20|M|student|79508 587 | 587|26|M|other|14216 588 | 588|18|F|student|93063 589 | 589|21|M|lawyer|90034 590 | 590|50|M|educator|82435 591 | 591|57|F|librarian|92093 592 | 592|18|M|student|97520 593 | 593|31|F|educator|68767 594 | 594|46|M|educator|M4J2K 595 | 595|25|M|programmer|31909 596 | 596|20|M|artist|77073 597 | 597|23|M|other|84116 598 | 598|40|F|marketing|43085 599 | 599|22|F|student|R3T5K 600 | 600|34|M|programmer|02320 601 | 601|19|F|artist|99687 602 | 602|47|F|other|34656 603 | 603|21|M|programmer|47905 604 | 604|39|M|educator|11787 605 | 605|33|M|engineer|33716 606 | 606|28|M|programmer|63044 607 | 607|49|F|healthcare|02154 608 | 608|22|M|other|10003 609 | 609|13|F|student|55106 610 | 610|22|M|student|21227 611 | 611|46|M|librarian|77008 612 | 612|36|M|educator|79070 613 | 613|37|F|marketing|29678 614 | 614|54|M|educator|80227 615 | 615|38|M|educator|27705 616 | 616|55|M|scientist|50613 617 | 617|27|F|writer|11201 618 | 618|15|F|student|44212 619 | 619|17|M|student|44134 620 | 620|18|F|writer|81648 621 | 621|17|M|student|60402 622 | 622|25|M|programmer|14850 623 | 623|50|F|educator|60187 624 | 624|19|M|student|30067 625 | 625|27|M|programmer|20723 626 | 626|23|M|scientist|19807 627 | 627|24|M|engineer|08034 628 | 628|13|M|none|94306 629 | 629|46|F|other|44224 630 | 630|26|F|healthcare|55408 631 | 631|18|F|student|38866 632 | 632|18|M|student|55454 633 | 633|35|M|programmer|55414 634 | 634|39|M|engineer|T8H1N 635 | 635|22|M|other|23237 636 | 636|47|M|educator|48043 637 | 637|30|M|other|74101 638 | 638|45|M|engineer|01940 639 | 639|42|F|librarian|12065 640 | 640|20|M|student|61801 641 | 641|24|M|student|60626 642 | 642|18|F|student|95521 643 | 643|39|M|scientist|55122 644 | 644|51|M|retired|63645 645 | 645|27|M|programmer|53211 646 | 646|17|F|student|51250 647 | 647|40|M|educator|45810 648 | 648|43|M|engineer|91351 649 | 649|20|M|student|39762 650 | 650|42|M|engineer|83814 651 | 651|65|M|retired|02903 652 | 652|35|M|other|22911 653 | 653|31|M|executive|55105 654 | 654|27|F|student|78739 655 | 655|50|F|healthcare|60657 656 | 656|48|M|educator|10314 657 | 657|26|F|none|78704 658 | 658|33|M|programmer|92626 659 | 659|31|M|educator|54248 660 | 660|26|M|student|77380 661 | 661|28|M|programmer|98121 662 | 662|55|M|librarian|19102 663 | 663|26|M|other|19341 664 | 664|30|M|engineer|94115 665 | 665|25|M|administrator|55412 666 | 666|44|M|administrator|61820 667 | 667|35|M|librarian|01970 668 | 668|29|F|writer|10016 669 | 669|37|M|other|20009 670 | 670|30|M|technician|21114 671 | 671|21|M|programmer|91919 672 | 672|54|F|administrator|90095 673 | 673|51|M|educator|22906 674 | 674|13|F|student|55337 675 | 675|34|M|other|28814 676 | 676|30|M|programmer|32712 677 | 677|20|M|other|99835 678 | 678|50|M|educator|61462 679 | 679|20|F|student|54302 680 | 680|33|M|lawyer|90405 681 | 681|44|F|marketing|97208 682 | 682|23|M|programmer|55128 683 | 683|42|M|librarian|23509 684 | 684|28|M|student|55414 685 | 685|32|F|librarian|55409 686 | 686|32|M|educator|26506 687 | 687|31|F|healthcare|27713 688 | 688|37|F|administrator|60476 689 | 689|25|M|other|45439 690 | 690|35|M|salesman|63304 691 | 691|34|M|educator|60089 692 | 692|34|M|engineer|18053 693 | 693|43|F|healthcare|85210 694 | 694|60|M|programmer|06365 695 | 695|26|M|writer|38115 696 | 696|55|M|other|94920 697 | 697|25|M|other|77042 698 | 698|28|F|programmer|06906 699 | 699|44|M|other|96754 700 | 700|17|M|student|76309 701 | 701|51|F|librarian|56321 702 | 702|37|M|other|89104 703 | 703|26|M|educator|49512 704 | 704|51|F|librarian|91105 705 | 705|21|F|student|54494 706 | 706|23|M|student|55454 707 | 707|56|F|librarian|19146 708 | 708|26|F|homemaker|96349 709 | 709|21|M|other|N4T1A 710 | 710|19|M|student|92020 711 | 711|22|F|student|15203 712 | 712|22|F|student|54901 713 | 713|42|F|other|07204 714 | 714|26|M|engineer|55343 715 | 715|21|M|technician|91206 716 | 716|36|F|administrator|44265 717 | 717|24|M|technician|84105 718 | 718|42|M|technician|64118 719 | 719|37|F|other|V0R2H 720 | 720|49|F|administrator|16506 721 | 721|24|F|entertainment|11238 722 | 722|50|F|homemaker|17331 723 | 723|26|M|executive|94403 724 | 724|31|M|executive|40243 725 | 725|21|M|student|91711 726 | 726|25|F|administrator|80538 727 | 727|25|M|student|78741 728 | 728|58|M|executive|94306 729 | 729|19|M|student|56567 730 | 730|31|F|scientist|32114 731 | 731|41|F|educator|70403 732 | 732|28|F|other|98405 733 | 733|44|F|other|60630 734 | 734|25|F|other|63108 735 | 735|29|F|healthcare|85719 736 | 736|48|F|writer|94618 737 | 737|30|M|programmer|98072 738 | 738|35|M|technician|95403 739 | 739|35|M|technician|73162 740 | 740|25|F|educator|22206 741 | 741|25|M|writer|63108 742 | 742|35|M|student|29210 743 | 743|31|M|programmer|92660 744 | 744|35|M|marketing|47024 745 | 745|42|M|writer|55113 746 | 746|25|M|engineer|19047 747 | 747|19|M|other|93612 748 | 748|28|M|administrator|94720 749 | 749|33|M|other|80919 750 | 750|28|M|administrator|32303 751 | 751|24|F|other|90034 752 | 752|60|M|retired|21201 753 | 753|56|M|salesman|91206 754 | 754|59|F|librarian|62901 755 | 755|44|F|educator|97007 756 | 756|30|F|none|90247 757 | 757|26|M|student|55104 758 | 758|27|M|student|53706 759 | 759|20|F|student|68503 760 | 760|35|F|other|14211 761 | 761|17|M|student|97302 762 | 762|32|M|administrator|95050 763 | 763|27|M|scientist|02113 764 | 764|27|F|educator|62903 765 | 765|31|M|student|33066 766 | 766|42|M|other|10960 767 | 767|70|M|engineer|00000 768 | 768|29|M|administrator|12866 769 | 769|39|M|executive|06927 770 | 770|28|M|student|14216 771 | 771|26|M|student|15232 772 | 772|50|M|writer|27105 773 | 773|20|M|student|55414 774 | 774|30|M|student|80027 775 | 775|46|M|executive|90036 776 | 776|30|M|librarian|51157 777 | 777|63|M|programmer|01810 778 | 778|34|M|student|01960 779 | 779|31|M|student|K7L5J 780 | 780|49|M|programmer|94560 781 | 781|20|M|student|48825 782 | 782|21|F|artist|33205 783 | 783|30|M|marketing|77081 784 | 784|47|M|administrator|91040 785 | 785|32|M|engineer|23322 786 | 786|36|F|engineer|01754 787 | 787|18|F|student|98620 788 | 788|51|M|administrator|05779 789 | 789|29|M|other|55420 790 | 790|27|M|technician|80913 791 | 791|31|M|educator|20064 792 | 792|40|M|programmer|12205 793 | 793|22|M|student|85281 794 | 794|32|M|educator|57197 795 | 795|30|M|programmer|08610 796 | 796|32|F|writer|33755 797 | 797|44|F|other|62522 798 | 798|40|F|writer|64131 799 | 799|49|F|administrator|19716 800 | 800|25|M|programmer|55337 801 | 801|22|M|writer|92154 802 | 802|35|M|administrator|34105 803 | 803|70|M|administrator|78212 804 | 804|39|M|educator|61820 805 | 805|27|F|other|20009 806 | 806|27|M|marketing|11217 807 | 807|41|F|healthcare|93555 808 | 808|45|M|salesman|90016 809 | 809|50|F|marketing|30803 810 | 810|55|F|other|80526 811 | 811|40|F|educator|73013 812 | 812|22|M|technician|76234 813 | 813|14|F|student|02136 814 | 814|30|M|other|12345 815 | 815|32|M|other|28806 816 | 816|34|M|other|20755 817 | 817|19|M|student|60152 818 | 818|28|M|librarian|27514 819 | 819|59|M|administrator|40205 820 | 820|22|M|student|37725 821 | 821|37|M|engineer|77845 822 | 822|29|F|librarian|53144 823 | 823|27|M|artist|50322 824 | 824|31|M|other|15017 825 | 825|44|M|engineer|05452 826 | 826|28|M|artist|77048 827 | 827|23|F|engineer|80228 828 | 828|28|M|librarian|85282 829 | 829|48|M|writer|80209 830 | 830|46|M|programmer|53066 831 | 831|21|M|other|33765 832 | 832|24|M|technician|77042 833 | 833|34|M|writer|90019 834 | 834|26|M|other|64153 835 | 835|44|F|executive|11577 836 | 836|44|M|artist|10018 837 | 837|36|F|artist|55409 838 | 838|23|M|student|01375 839 | 839|38|F|entertainment|90814 840 | 840|39|M|artist|55406 841 | 841|45|M|doctor|47401 842 | 842|40|M|writer|93055 843 | 843|35|M|librarian|44212 844 | 844|22|M|engineer|95662 845 | 845|64|M|doctor|97405 846 | 846|27|M|lawyer|47130 847 | 847|29|M|student|55417 848 | 848|46|M|engineer|02146 849 | 849|15|F|student|25652 850 | 850|34|M|technician|78390 851 | 851|18|M|other|29646 852 | 852|46|M|administrator|94086 853 | 853|49|M|writer|40515 854 | 854|29|F|student|55408 855 | 855|53|M|librarian|04988 856 | 856|43|F|marketing|97215 857 | 857|35|F|administrator|V1G4L 858 | 858|63|M|educator|09645 859 | 859|18|F|other|06492 860 | 860|70|F|retired|48322 861 | 861|38|F|student|14085 862 | 862|25|M|executive|13820 863 | 863|17|M|student|60089 864 | 864|27|M|programmer|63021 865 | 865|25|M|artist|11231 866 | 866|45|M|other|60302 867 | 867|24|M|scientist|92507 868 | 868|21|M|programmer|55303 869 | 869|30|M|student|10025 870 | 870|22|M|student|65203 871 | 871|31|M|executive|44648 872 | 872|19|F|student|74078 873 | 873|48|F|administrator|33763 874 | 874|36|M|scientist|37076 875 | 875|24|F|student|35802 876 | 876|41|M|other|20902 877 | 877|30|M|other|77504 878 | 878|50|F|educator|98027 879 | 879|33|F|administrator|55337 880 | 880|13|M|student|83702 881 | 881|39|M|marketing|43017 882 | 882|35|M|engineer|40503 883 | 883|49|M|librarian|50266 884 | 884|44|M|engineer|55337 885 | 885|30|F|other|95316 886 | 886|20|M|student|61820 887 | 887|14|F|student|27249 888 | 888|41|M|scientist|17036 889 | 889|24|M|technician|78704 890 | 890|32|M|student|97301 891 | 891|51|F|administrator|03062 892 | 892|36|M|other|45243 893 | 893|25|M|student|95823 894 | 894|47|M|educator|74075 895 | 895|31|F|librarian|32301 896 | 896|28|M|writer|91505 897 | 897|30|M|other|33484 898 | 898|23|M|homemaker|61755 899 | 899|32|M|other|55116 900 | 900|60|M|retired|18505 901 | 901|38|M|executive|L1V3W 902 | 902|45|F|artist|97203 903 | 903|28|M|educator|20850 904 | 904|17|F|student|61073 905 | 905|27|M|other|30350 906 | 906|45|M|librarian|70124 907 | 907|25|F|other|80526 908 | 908|44|F|librarian|68504 909 | 909|50|F|educator|53171 910 | 910|28|M|healthcare|29301 911 | 911|37|F|writer|53210 912 | 912|51|M|other|06512 913 | 913|27|M|student|76201 914 | 914|44|F|other|08105 915 | 915|50|M|entertainment|60614 916 | 916|27|M|engineer|N2L5N 917 | 917|22|F|student|20006 918 | 918|40|M|scientist|70116 919 | 919|25|M|other|14216 920 | 920|30|F|artist|90008 921 | 921|20|F|student|98801 922 | 922|29|F|administrator|21114 923 | 923|21|M|student|E2E3R 924 | 924|29|M|other|11753 925 | 925|18|F|salesman|49036 926 | 926|49|M|entertainment|01701 927 | 927|23|M|programmer|55428 928 | 928|21|M|student|55408 929 | 929|44|M|scientist|53711 930 | 930|28|F|scientist|07310 931 | 931|60|M|educator|33556 932 | 932|58|M|educator|06437 933 | 933|28|M|student|48105 934 | 934|61|M|engineer|22902 935 | 935|42|M|doctor|66221 936 | 936|24|M|other|32789 937 | 937|48|M|educator|98072 938 | 938|38|F|technician|55038 939 | 939|26|F|student|33319 940 | 940|32|M|administrator|02215 941 | 941|20|M|student|97229 942 | 942|48|F|librarian|78209 943 | 943|22|M|student|77841 944 | -------------------------------------------------------------------------------- /pandas_demo/索引index的用途.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "attachments": {}, 5 | "cell_type": "markdown", 6 | "metadata": {}, 7 | "source": [ 8 | "pandas的索引index的用途\n", 9 | "把数据存储与普通的columns列也能用于数据查询,那使用index有什么好处?\n", 10 | "\n", 11 | "# index的用途总结:\n", 12 | "1. 更方便的数据查询\n", 13 | "2. 使用index可以获得性能提升\n", 14 | "3. 自动的数据对其功能\n", 15 | "4. 更多更强大的数据结构支持" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 3, 21 | "metadata": {}, 22 | "outputs": [ 23 | { 24 | "data": { 25 | "text/html": [ 26 | "
\n", 27 | "\n", 40 | "\n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | "
Unnamed: 0idtitlerelease_dateoverviewpopularityvote_averagevote_countvideo
0019404Dilwale Dulhania Le Jayenge1995-10-20Raj is a rich, carefree, happy-go-lucky second...25.8848.73304False
11278The Shawshank Redemption1994-09-23Framed in the 1940s for the double murder of h...60.1108.720369False
22238The Godfather1972-03-14Spanning the years 1945 to 1955, a chronicle o...62.7848.715219False
33724089Gabriel's Inferno Part II2020-07-31Professor Gabriel Emerson finally learns the t...28.3168.61360False
44424Schindler's List1993-11-30The true story of how businessman Oskar Schind...38.6618.612158False
\n", 118 | "
" 119 | ], 120 | "text/plain": [ 121 | " Unnamed: 0 id title release_date \\\n", 122 | "0 0 19404 Dilwale Dulhania Le Jayenge 1995-10-20 \n", 123 | "1 1 278 The Shawshank Redemption 1994-09-23 \n", 124 | "2 2 238 The Godfather 1972-03-14 \n", 125 | "3 3 724089 Gabriel's Inferno Part II 2020-07-31 \n", 126 | "4 4 424 Schindler's List 1993-11-30 \n", 127 | "\n", 128 | " overview popularity \\\n", 129 | "0 Raj is a rich, carefree, happy-go-lucky second... 25.884 \n", 130 | "1 Framed in the 1940s for the double murder of h... 60.110 \n", 131 | "2 Spanning the years 1945 to 1955, a chronicle o... 62.784 \n", 132 | "3 Professor Gabriel Emerson finally learns the t... 28.316 \n", 133 | "4 The true story of how businessman Oskar Schind... 38.661 \n", 134 | "\n", 135 | " vote_average vote_count video \n", 136 | "0 8.7 3304 False \n", 137 | "1 8.7 20369 False \n", 138 | "2 8.7 15219 False \n", 139 | "3 8.6 1360 False \n", 140 | "4 8.6 12158 False " 141 | ] 142 | }, 143 | "execution_count": 3, 144 | "metadata": {}, 145 | "output_type": "execute_result" 146 | } 147 | ], 148 | "source": [ 149 | "import pandas as pd\n", 150 | "df=pd.read_csv('Movie-Dataset-Latest.csv')\n", 151 | "df.head()" 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": 4, 157 | "metadata": {}, 158 | "outputs": [ 159 | { 160 | "data": { 161 | "text/plain": [ 162 | "Unnamed: 0 int64\n", 163 | "id int64\n", 164 | "title object\n", 165 | "release_date object\n", 166 | "overview object\n", 167 | "popularity float64\n", 168 | "vote_average float64\n", 169 | "vote_count int64\n", 170 | "video bool\n", 171 | "dtype: object" 172 | ] 173 | }, 174 | "execution_count": 4, 175 | "metadata": {}, 176 | "output_type": "execute_result" 177 | } 178 | ], 179 | "source": [ 180 | "df.dtypes" 181 | ] 182 | }, 183 | { 184 | "attachments": {}, 185 | "cell_type": "markdown", 186 | "metadata": {}, 187 | "source": [ 188 | "1. 使用index查询数据" 189 | ] 190 | }, 191 | { 192 | "cell_type": "code", 193 | "execution_count": 5, 194 | "metadata": {}, 195 | "outputs": [], 196 | "source": [ 197 | "# drop=false,让索引列还保持在column\n", 198 | "df.set_index('id',inplace=True,drop=False)" 199 | ] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "execution_count": 6, 204 | "metadata": {}, 205 | "outputs": [ 206 | { 207 | "data": { 208 | "text/html": [ 209 | "
\n", 210 | "\n", 223 | "\n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | "
Unnamed: 0idtitlerelease_dateoverviewpopularityvote_averagevote_countvideo
id
19404019404Dilwale Dulhania Le Jayenge1995-10-20Raj is a rich, carefree, happy-go-lucky second...25.8848.73304False
2781278The Shawshank Redemption1994-09-23Framed in the 1940s for the double murder of h...60.1108.720369False
2382238The Godfather1972-03-14Spanning the years 1945 to 1955, a chronicle o...62.7848.715219False
7240893724089Gabriel's Inferno Part II2020-07-31Professor Gabriel Emerson finally learns the t...28.3168.61360False
4244424Schindler's List1993-11-30The true story of how businessman Oskar Schind...38.6618.612158False
\n", 313 | "
" 314 | ], 315 | "text/plain": [ 316 | " Unnamed: 0 id title release_date \\\n", 317 | "id \n", 318 | "19404 0 19404 Dilwale Dulhania Le Jayenge 1995-10-20 \n", 319 | "278 1 278 The Shawshank Redemption 1994-09-23 \n", 320 | "238 2 238 The Godfather 1972-03-14 \n", 321 | "724089 3 724089 Gabriel's Inferno Part II 2020-07-31 \n", 322 | "424 4 424 Schindler's List 1993-11-30 \n", 323 | "\n", 324 | " overview popularity \\\n", 325 | "id \n", 326 | "19404 Raj is a rich, carefree, happy-go-lucky second... 25.884 \n", 327 | "278 Framed in the 1940s for the double murder of h... 60.110 \n", 328 | "238 Spanning the years 1945 to 1955, a chronicle o... 62.784 \n", 329 | "724089 Professor Gabriel Emerson finally learns the t... 28.316 \n", 330 | "424 The true story of how businessman Oskar Schind... 38.661 \n", 331 | "\n", 332 | " vote_average vote_count video \n", 333 | "id \n", 334 | "19404 8.7 3304 False \n", 335 | "278 8.7 20369 False \n", 336 | "238 8.7 15219 False \n", 337 | "724089 8.6 1360 False \n", 338 | "424 8.6 12158 False " 339 | ] 340 | }, 341 | "execution_count": 6, 342 | "metadata": {}, 343 | "output_type": "execute_result" 344 | } 345 | ], 346 | "source": [ 347 | "df.head()" 348 | ] 349 | }, 350 | { 351 | "cell_type": "code", 352 | "execution_count": 7, 353 | "metadata": {}, 354 | "outputs": [ 355 | { 356 | "data": { 357 | "text/plain": [ 358 | "Unnamed: 0 9463\n", 359 | "id 9463\n", 360 | "title 9463\n", 361 | "release_date 9463\n", 362 | "overview 9449\n", 363 | "popularity 9463\n", 364 | "vote_average 9463\n", 365 | "vote_count 9463\n", 366 | "video 9463\n", 367 | "dtype: int64" 368 | ] 369 | }, 370 | "execution_count": 7, 371 | "metadata": {}, 372 | "output_type": "execute_result" 373 | } 374 | ], 375 | "source": [ 376 | "df.count()" 377 | ] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "execution_count": 8, 382 | "metadata": {}, 383 | "outputs": [ 384 | { 385 | "data": { 386 | "text/plain": [ 387 | "Unnamed: 0 187\n", 388 | "id 500\n", 389 | "title Reservoir Dogs\n", 390 | "release_date 1992-09-02\n", 391 | "overview A botched robbery indicates a police informant...\n", 392 | "popularity 28.045\n", 393 | "vote_average 8.2\n", 394 | "vote_count 11351\n", 395 | "video False\n", 396 | "Name: 500, dtype: object" 397 | ] 398 | }, 399 | "execution_count": 8, 400 | "metadata": {}, 401 | "output_type": "execute_result" 402 | } 403 | ], 404 | "source": [ 405 | "# 使用index的查询方法,查询id为500的数据\n", 406 | "df.loc[500]" 407 | ] 408 | }, 409 | { 410 | "cell_type": "code", 411 | "execution_count": 9, 412 | "metadata": {}, 413 | "outputs": [ 414 | { 415 | "data": { 416 | "text/html": [ 417 | "
\n", 418 | "\n", 431 | "\n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | "
Unnamed: 0idtitlerelease_dateoverviewpopularityvote_averagevote_countvideo
id
500187500Reservoir Dogs1992-09-02A botched robbery indicates a police informant...28.0458.211351False
\n", 473 | "
" 474 | ], 475 | "text/plain": [ 476 | " Unnamed: 0 id title release_date \\\n", 477 | "id \n", 478 | "500 187 500 Reservoir Dogs 1992-09-02 \n", 479 | "\n", 480 | " overview popularity \\\n", 481 | "id \n", 482 | "500 A botched robbery indicates a police informant... 28.045 \n", 483 | "\n", 484 | " vote_average vote_count video \n", 485 | "id \n", 486 | "500 8.2 11351 False " 487 | ] 488 | }, 489 | "execution_count": 9, 490 | "metadata": {}, 491 | "output_type": "execute_result" 492 | } 493 | ], 494 | "source": [ 495 | "# 使用id列来查询\n", 496 | "df.loc[df['id']==500]" 497 | ] 498 | }, 499 | { 500 | "attachments": {}, 501 | "cell_type": "markdown", 502 | "metadata": {}, 503 | "source": [ 504 | "2. 使用index会提升查询效率\n", 505 | "- 如果index是唯一 的,pandas会使用hash表优化,查询性能为O(1)\n", 506 | "- 如果index不是唯一的,但是有序,pandas会使用二分查找算法,查询性能为O(log(n))\n", 507 | "- 如果index是完全随机的,那么每次查询都会扫描全表,查询性能为O(N)" 508 | ] 509 | }, 510 | { 511 | "cell_type": "code", 512 | "execution_count": 10, 513 | "metadata": {}, 514 | "outputs": [ 515 | { 516 | "data": { 517 | "text/plain": [ 518 | "True" 519 | ] 520 | }, 521 | "execution_count": 10, 522 | "metadata": {}, 523 | "output_type": "execute_result" 524 | } 525 | ], 526 | "source": [ 527 | "# 索引是否唯一\n", 528 | "df.index.is_unique" 529 | ] 530 | }, 531 | { 532 | "cell_type": "code", 533 | "execution_count": 12, 534 | "metadata": {}, 535 | "outputs": [ 536 | { 537 | "data": { 538 | "text/plain": [ 539 | "False" 540 | ] 541 | }, 542 | "execution_count": 12, 543 | "metadata": {}, 544 | "output_type": "execute_result" 545 | } 546 | ], 547 | "source": [ 548 | "# 索引是否单调递增\n", 549 | "df.index.is_monotonic_increasing" 550 | ] 551 | }, 552 | { 553 | "attachments": {}, 554 | "cell_type": "markdown", 555 | "metadata": {}, 556 | "source": [ 557 | "实验一:完全随机的顺序查询" 558 | ] 559 | }, 560 | { 561 | "cell_type": "code", 562 | "execution_count": 13, 563 | "metadata": {}, 564 | "outputs": [ 565 | { 566 | "name": "stdout", 567 | "output_type": "stream", 568 | "text": [ 569 | "43.9 µs ± 438 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" 570 | ] 571 | } 572 | ], 573 | "source": [ 574 | "# 将数据随机打散\n", 575 | "from sklearn.utils import shuffle\n", 576 | "# 计数,查询id==500数据性能\n", 577 | "%timeit df.loc[500]" 578 | ] 579 | }, 580 | { 581 | "attachments": {}, 582 | "cell_type": "markdown", 583 | "metadata": {}, 584 | "source": [ 585 | "实验二:将index排序后的查询(因为本数据中的索引唯一,所以排序与不排序后都是O(1)时间复杂度" 586 | ] 587 | }, 588 | { 589 | "cell_type": "code", 590 | "execution_count": 14, 591 | "metadata": {}, 592 | "outputs": [], 593 | "source": [ 594 | "df_sort=df.sort_index()" 595 | ] 596 | }, 597 | { 598 | "cell_type": "code", 599 | "execution_count": 15, 600 | "metadata": {}, 601 | "outputs": [ 602 | { 603 | "data": { 604 | "text/html": [ 605 | "
\n", 606 | "\n", 619 | "\n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | "
Unnamed: 0idtitlerelease_dateoverviewpopularityvote_averagevote_countvideo
id
583045Four Rooms1995-12-09It's Ted the Bellhop's first night on the job....13.0585.72062False
650876Judgment Night1993-10-15While racing to a boxing match, Frank, Mike, J...9.3246.5218False
1114511Star Wars1977-05-25Princess Leia is captured and held hostage by ...77.4198.216428False
1257712Finding Nemo2003-05-30Nemo, an adventurous young clownfish, is unexp...85.5117.815792False
132113Forrest Gump1994-07-06A man with a low IQ has accomplished great thi...49.0318.521823False
\n", 709 | "
" 710 | ], 711 | "text/plain": [ 712 | " Unnamed: 0 id title release_date \\\n", 713 | "id \n", 714 | "5 8304 5 Four Rooms 1995-12-09 \n", 715 | "6 5087 6 Judgment Night 1993-10-15 \n", 716 | "11 145 11 Star Wars 1977-05-25 \n", 717 | "12 577 12 Finding Nemo 2003-05-30 \n", 718 | "13 21 13 Forrest Gump 1994-07-06 \n", 719 | "\n", 720 | " overview popularity \\\n", 721 | "id \n", 722 | "5 It's Ted the Bellhop's first night on the job.... 13.058 \n", 723 | "6 While racing to a boxing match, Frank, Mike, J... 9.324 \n", 724 | "11 Princess Leia is captured and held hostage by ... 77.419 \n", 725 | "12 Nemo, an adventurous young clownfish, is unexp... 85.511 \n", 726 | "13 A man with a low IQ has accomplished great thi... 49.031 \n", 727 | "\n", 728 | " vote_average vote_count video \n", 729 | "id \n", 730 | "5 5.7 2062 False \n", 731 | "6 6.5 218 False \n", 732 | "11 8.2 16428 False \n", 733 | "12 7.8 15792 False \n", 734 | "13 8.5 21823 False " 735 | ] 736 | }, 737 | "execution_count": 15, 738 | "metadata": {}, 739 | "output_type": "execute_result" 740 | } 741 | ], 742 | "source": [ 743 | "df_sort.head()" 744 | ] 745 | }, 746 | { 747 | "cell_type": "code", 748 | "execution_count": 18, 749 | "metadata": {}, 750 | "outputs": [ 751 | { 752 | "name": "stdout", 753 | "output_type": "stream", 754 | "text": [ 755 | "43.9 µs ± 145 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" 756 | ] 757 | } 758 | ], 759 | "source": [ 760 | "# 查询排序后索引为500的性能\n", 761 | "%timeit df_sort.loc[500]" 762 | ] 763 | }, 764 | { 765 | "attachments": {}, 766 | "cell_type": "markdown", 767 | "metadata": {}, 768 | "source": [ 769 | "3. 使用index能自动对其数据\n", 770 | "包括series和df" 771 | ] 772 | }, 773 | { 774 | "cell_type": "code", 775 | "execution_count": 19, 776 | "metadata": {}, 777 | "outputs": [], 778 | "source": [ 779 | "s1=pd.Series([1,2,3],index=['a','b','c'])\n", 780 | "s2=pd.Series([2,4,5],index=['b','c','d'])" 781 | ] 782 | }, 783 | { 784 | "cell_type": "code", 785 | "execution_count": 20, 786 | "metadata": {}, 787 | "outputs": [ 788 | { 789 | "data": { 790 | "text/plain": [ 791 | "a NaN\n", 792 | "b 4.0\n", 793 | "c 7.0\n", 794 | "d NaN\n", 795 | "dtype: float64" 796 | ] 797 | }, 798 | "execution_count": 20, 799 | "metadata": {}, 800 | "output_type": "execute_result" 801 | } 802 | ], 803 | "source": [ 804 | "s1+s2" 805 | ] 806 | }, 807 | { 808 | "attachments": {}, 809 | "cell_type": "markdown", 810 | "metadata": {}, 811 | "source": [ 812 | "4. 使用index更多更强大的数据结构支持\n", 813 | "很多强大的索引数据结构\n", 814 | "- CategoricalIndex,基于分类数据的index,提升性能\n", 815 | "- MultiIndex,多维索引,用于groupby多维聚合后结果等\n", 816 | "- DatetimeIndex,时间类型索引,强大的日期和时间的方法支持" 817 | ] 818 | } 819 | ], 820 | "metadata": { 821 | "kernelspec": { 822 | "display_name": "Python 3", 823 | "language": "python", 824 | "name": "python3" 825 | }, 826 | "language_info": { 827 | "codemirror_mode": { 828 | "name": "ipython", 829 | "version": 3 830 | }, 831 | "file_extension": ".py", 832 | "mimetype": "text/x-python", 833 | "name": "python", 834 | "nbconvert_exporter": "python", 835 | "pygments_lexer": "ipython3", 836 | "version": "3.10.5" 837 | }, 838 | "orig_nbformat": 4 839 | }, 840 | "nbformat": 4, 841 | "nbformat_minor": 2 842 | } 843 | --------------------------------------------------------------------------------