From 47bcaa3af29b1b04bd63dcaf043281a1912e459d Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Thu, 7 Jan 2021 17:28:45 +0800 Subject: [PATCH 01/90] update on 20210107 --- 09_remote_ipython/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/09_remote_ipython/README.md b/09_remote_ipython/README.md index a797579..a5a07fe 100644 --- a/09_remote_ipython/README.md +++ b/09_remote_ipython/README.md @@ -26,7 +26,7 @@ done! 1. 打开ipython ```python -from notebook.auth import passwd +from IPython.lib import passwd In [2] : passwd() # 输入密码 Enter password: Verify password: From 4a1c15d88ba5b22e35a6c86f9d446842a9cb2782 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Mon, 11 Jan 2021 09:52:30 +0800 Subject: [PATCH 02/90] update on 20210111 --- 01_basic/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/01_basic/README.md b/01_basic/README.md index ffd211b..745e22a 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -80,6 +80,8 @@ [**40. 字典转成对象(骚操作)**](#字典转成对象) +[**41. lgb[gpu版本]安装**](#lgb安装) + --- ```python %reload_ext autoreload @@ -1036,6 +1038,18 @@ def dict_to_object(_d): return inst ``` +### lgb安装 + +```shell + +sudo apt-get install libboost-all-dev +sudo apt install ocl-icd-opencl-dev +sudo apt install cmake +``` +```shell +pip install --upgrade pip +pip install lightgbm --install-option=--gpu +``` From fce22f41c712c69d42fe16c7204d1aadf984042e Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Wed, 13 Jan 2021 15:50:33 +0800 Subject: [PATCH 03/90] update on 20210113 --- 01_basic/README.md | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/01_basic/README.md b/01_basic/README.md index 745e22a..645819a 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -80,7 +80,7 @@ [**40. 字典转成对象(骚操作)**](#字典转成对象) -[**41. lgb[gpu版本]安装**](#lgb安装) +[**41. lgb[gpu版本]和xgb[gpu版本]安装**](#boost安装) --- ```python @@ -1038,19 +1038,32 @@ def dict_to_object(_d): return inst ``` -### lgb安装 +### boost安装 ```shell - sudo apt-get install libboost-all-dev sudo apt install ocl-icd-opencl-dev -sudo apt install cmake +sudo apt install cmake(可以去https://cmake.org/files下载比如cmake-3.14.0.tar.gz然后执行./bootstrap然后make然后make install) ``` + +lgb gpu版安装
```shell pip install --upgrade pip pip install lightgbm --install-option=--gpu ``` - +xgb gpu版安装
+```shell +git clone --recursive https://github.com/dmlc/xgboost +cd xgboost +mkdir build +cd build +cmake .. -DUSE_CUDA=ON +make(或者make -j4可能或报错) + +cd .. +cd python-package +python setup.py install +``` ### From b43d9117e7e3de059bbd575fbbd652e30db8ede6 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Wed, 17 Mar 2021 16:37:55 +0800 Subject: [PATCH 04/90] update on 20210317 --- 10_docker/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/10_docker/README.md b/10_docker/README.md index 92a4827..78b1758 100644 --- a/10_docker/README.md +++ b/10_docker/README.md @@ -170,6 +170,14 @@ docker stop `docker ps -a| grep python:3.6 | awk '{print $1}'` docker rm `docker ps -a| grep python:3.6 | awk '{print $1}'` ``` +2.15 docker中python print不生效解决办法 +```shell +#方法一 显式调用flush +print("Hello www", flush=True) +#方法二 使用 "-u" 参数执行 python 命令 +sudo nvidia-docker run -v $PWD/masr_bz:/workspace/masr_bz -w /workspace/masr_bz binzhouchn/pytorch:1.7-cuda10.1-cudnn7-masr python -u train.py +``` + ## 3. docker镜像使用 From a003b8512fc48d8bfb1dd542d17438671e1fb717 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Thu, 8 Apr 2021 10:05:14 +0800 Subject: [PATCH 05/90] update on 20210407 --- 01_basic/README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/01_basic/README.md b/01_basic/README.md index 645819a..477d4c0 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -82,6 +82,8 @@ [**41. lgb[gpu版本]和xgb[gpu版本]安装**](#boost安装) +[**42. tqdm**](#tqdm) + --- ```python %reload_ext autoreload @@ -1065,6 +1067,29 @@ cd python-package python setup.py install ``` +### tqdm + +[当Pytorch遇上tqdm](https://blog.csdn.net/dreaming_coder/article/details/113486645)
+```python +for epoch in range(epoch): + with tqdm( + iterable=train_loader, + bar_format='{desc} {n_fmt:>4s}/{total_fmt:<4s} {percentage:3.0f}%|{bar}| {postfix}', + ) as t: + start_time = datetime.now() + loss_list = [] + for batch, data in enumerate(train_loader): + t.set_description_str(f"\33[36m【Epoch {epoch + 1:04d}】") + # 训练代码 + time.sleep(1) + # 计算当前损失 + loss = random() + loss_list.append(loss) + cur_time = datetime.now() + delta_time = cur_time - start_time + t.set_postfix_str(f"train_loss={sum(loss_list) / len(loss_list):.6f}, 执行时长:{delta_time}\33[0m") + t.update() +``` ### working on bert From fb38b865ea15a7a814c03d62c82d47179674939a Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 9 Apr 2021 10:41:35 +0800 Subject: [PATCH 06/90] update on 20210409 --- 03_pandas/README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/03_pandas/README.md b/03_pandas/README.md index c8be243..95b9769 100644 --- a/03_pandas/README.md +++ b/03_pandas/README.md @@ -40,6 +40,8 @@ [**20. dataframe表格填充**](#dataframe表格填充) +[**21. 加快dataframe读取**](#加快dataframe读取) + --- ### pandas_dataframe手动创建 @@ -321,4 +323,18 @@ df.loc[df.content_id=='x6mbO2rHfU3hTej4','sentiment_tmp'] = 1 df.fillna(method='ffill', axis=1).fillna(method='ffill') ``` +### 加快dataframe读取 +方式一:cpu多线程多进程读取(推荐)
+```python +#安装datatable==0.11.1 +import datatable as dtable +train = dtable.fread(path+'train.csv').to_pandas() +``` + +方式二:gpu读取
+```python +#安装cudf(稍微有点麻烦) +import cudf +train = cudf.read_csv(path+'train.csv').to_pandas() +``` \ No newline at end of file From 39f58925ce11d69ee53037e049a9c0721d370612 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 9 Apr 2021 11:23:40 +0800 Subject: [PATCH 07/90] update on 20210409 --- 03_pandas/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/03_pandas/README.md b/03_pandas/README.md index 95b9769..c3dbc9e 100644 --- a/03_pandas/README.md +++ b/03_pandas/README.md @@ -325,7 +325,7 @@ df.fillna(method='ffill', axis=1).fillna(method='ffill') ### 加快dataframe读取 -方式一:cpu多线程多进程读取(推荐)
+方式一:cpu多线程读取(推荐)
```python #安装datatable==0.11.1 import datatable as dtable From 2e92317d0abdf58afc525edabf0e2ed850b2cd63 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Wed, 21 Jul 2021 17:50:44 +0800 Subject: [PATCH 08/90] update on 20210721 --- 01_basic/README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/01_basic/README.md b/01_basic/README.md index 477d4c0..eb22709 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -597,6 +597,21 @@ import pandas as pd pd.get_dummies(data.categ_id) ``` +方法三
From 6f868fb326b12a8f9702ae2edcf6e9a3d23b49d0 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 30 Jul 2021 18:13:51 +0800 Subject: [PATCH 09/90] update on 20210730 --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fbfa3cd..dc32b13 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Analytics](https://ga-beacon.appspot.com/GA-80121379-2/notes-python)](https://github.com/binzhouchn/feature_engineering) # python笔记 -> 版本:0.3
+> 版本:0.4
> 作者:binzhou
> 邮件:binzhouchn@gmail.com
@@ -18,7 +18,8 @@ 推荐使用[Anaconda](http://www.continuum.io/downloads),这个IDE集成了大部分常用的包。 -### python pip使用国内镜像 +
+python pip使用国内镜像<\summary> [让python pip使用国内镜像](https://www.cnblogs.com/wqpkita/p/7248525.html) ```shell @@ -33,7 +34,10 @@ pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com flas pip --proxy=proxyAddress:port install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com flask ``` -### pip镜像配置 +<\details> + +
+pip镜像配置<\summary> pip install镜像配置(Linux) ``` @@ -55,3 +59,4 @@ index-url = http://mirrors.aliyun.com/pypi/simple/ [install] trusted-host = mirrors.aliyun.com ``` +<\details> \ No newline at end of file From b11e4b643b39695ea5f3d8f59d404b312d3148a0 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 30 Jul 2021 18:15:01 +0800 Subject: [PATCH 10/90] update on 20210730 --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index dc32b13..ea15ae2 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ 推荐使用[Anaconda](http://www.continuum.io/downloads),这个IDE集成了大部分常用的包。
-python pip使用国内镜像<\summary> +python pip使用国内镜像 [让python pip使用国内镜像](https://www.cnblogs.com/wqpkita/p/7248525.html) ```shell @@ -34,10 +34,10 @@ pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com flas pip --proxy=proxyAddress:port install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com flask ``` -<\details> +
-pip镜像配置<\summary> +pip镜像配置 pip install镜像配置(Linux) ``` @@ -59,4 +59,4 @@ index-url = http://mirrors.aliyun.com/pypi/simple/ [install] trusted-host = mirrors.aliyun.com ``` -<\details> \ No newline at end of file +
\ No newline at end of file From 520e2863cdcafb6fbc05f331d6c02b4954680d12 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 30 Jul 2021 18:16:36 +0800 Subject: [PATCH 11/90] update on 20210730 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ea15ae2..9c77936 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,8 @@ 推荐使用[Anaconda](http://www.continuum.io/downloads),这个IDE集成了大部分常用的包。 -
-python pip使用国内镜像 +
+pip使用国内镜像 [让python pip使用国内镜像](https://www.cnblogs.com/wqpkita/p/7248525.html) ```shell @@ -36,7 +36,7 @@ pip --proxy=proxyAddress:port install -i http://pypi.douban.com/simple --trusted
-
+
pip镜像配置 pip install镜像配置(Linux) From dacc4c8655e860096e0532c18e9e047a44248159 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Wed, 11 Aug 2021 10:06:44 +0800 Subject: [PATCH 12/90] update on 20210811 --- 01_basic/README.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/01_basic/README.md b/01_basic/README.md index eb22709..b7b13c7 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -84,6 +84,8 @@ [**42. tqdm**](#tqdm) +[**43. joblib Parallel并行**](#joblib_parallel) + --- ```python %reload_ext autoreload @@ -735,7 +737,7 @@ df = df.merge(df_aggr, how='left', on='personid').fillna(0) ``` ### python画图显示中文 -f + ```python ## 显示中文解决方法 # 解决方法一 @@ -1106,9 +1108,17 @@ for epoch in range(epoch): t.update() ``` -### -working on bert -working on bert 单句分类 -working on bert NER -working on bert 两句输入分类或其他 -working on 多分类任务 +### joblib_parallel + +```python +from joblib import Parallel, delayed +from math import sqrt +def ff(num): + return [sqrt(n ** 3) for n in range(num)] +#不使用并行 7.5s +res = [] +for i in range(10,7000): + res.append(ff(i)) +#使用并行 2.75s +res = Parallel(n_jobs = -1, verbose = 1)(delayed(ff)(i) for i in range(10,7000)) +``` \ No newline at end of file From e951dad35a8d12746adfde036753b4769b4ff73b Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Wed, 11 Aug 2021 10:07:00 +0800 Subject: [PATCH 13/90] update on 20210811 --- 01_basic/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/01_basic/README.md b/01_basic/README.md index b7b13c7..d0711da 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -1121,4 +1121,6 @@ for i in range(10,7000): res.append(ff(i)) #使用并行 2.75s res = Parallel(n_jobs = -1, verbose = 1)(delayed(ff)(i) for i in range(10,7000)) -``` \ No newline at end of file +``` + +### \ No newline at end of file From aa2ff1bc138b107a5b6975099bbe39a3d7abd63a Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Wed, 11 Aug 2021 10:13:13 +0800 Subject: [PATCH 14/90] update on 20210811 --- 01_basic/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/01_basic/README.md b/01_basic/README.md index d0711da..f0954b8 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -1110,7 +1110,9 @@ for epoch in range(epoch): ### joblib_parallel + ```python +#此方法可用于多个文件数据并行读取 from joblib import Parallel, delayed from math import sqrt def ff(num): From fd10fc2b80218fc694a4503be1f7cf9e9ca1e56e Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Wed, 11 Aug 2021 10:15:57 +0800 Subject: [PATCH 15/90] update on 20210811 --- 01_basic/README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/01_basic/README.md b/01_basic/README.md index f0954b8..fa3963e 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -87,6 +87,9 @@ [**43. joblib Parallel并行**](#joblib_parallel) --- +
+点击展开 + ```python %reload_ext autoreload %autoreload 2 @@ -1125,4 +1128,6 @@ for i in range(10,7000): res = Parallel(n_jobs = -1, verbose = 1)(delayed(ff)(i) for i in range(10,7000)) ``` -### \ No newline at end of file +### + +
\ No newline at end of file From a0e34d36fb905c241adb2f1d46f4f44e8d5bcc03 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Wed, 11 Aug 2021 10:37:31 +0800 Subject: [PATCH 16/90] update on 20210811 --- 01_basic/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01_basic/README.md b/01_basic/README.md index fa3963e..21fb9df 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -1115,7 +1115,7 @@ for epoch in range(epoch): ```python -#此方法可用于多个文件数据并行读取 +#Parallel for loop 此方法可用于多个文件数据并行读取 from joblib import Parallel, delayed from math import sqrt def ff(num): From 049b798feb7a6e1bceed0ed49f9b6f63b949c175 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 10 Sep 2021 11:10:41 +0800 Subject: [PATCH 17/90] update on 20210910 --- 01_basic/README.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/01_basic/README.md b/01_basic/README.md index 21fb9df..d3d8e36 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -86,6 +86,8 @@ [**43. joblib Parallel并行**](#joblib_parallel) +[**44. 调试神器 - 丢弃print**](#调试神器) + ---
点击展开 @@ -1128,6 +1130,28 @@ for i in range(10,7000): res = Parallel(n_jobs = -1, verbose = 1)(delayed(ff)(i) for i in range(10,7000)) ``` -### +### 调试神器 + +```python +#pip install pysnooper +import os +os.environ['pysnooper'] = '1' # 开关 + +from pysnooper import snoop +#如果为0,则重新定义snoop然后这个修饰啥都不干 +if os.environ['pysnooper'] == '0': + import wrapt + def snoop(*args, **kwargs): + @wrapt.decorator + def wrapper(wrapped, instance, args, kwargs): + return wrapped(*args, **kwargs) + return wrapper +``` + +### + + + +
\ No newline at end of file From 8fbfe43d605e070c8ddffddbde76dfdc88f64216 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Tue, 14 Sep 2021 13:36:35 +0800 Subject: [PATCH 18/90] update on 20210914 --- 01_basic/README.md | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/01_basic/README.md b/01_basic/README.md index d3d8e36..fccdbd3 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -88,6 +88,8 @@ [**44. 调试神器 - 丢弃print**](#调试神器) +[**45. 分组计算均值并填充**](#分组计算均值并填充) + ---
点击展开 @@ -1148,7 +1150,30 @@ if os.environ['pysnooper'] == '0': return wrapper ``` -### +### 分组计算均值并填充 + +```python +def pad_mean_by_group(df, gp_col='stock_id'): + # 只留下需要处理的列 + cols = [col for col in df.columns if col not in["stock_id", "time_id", "target", "row_id"]] + # 查询nan的列 + df_na = df[cols].isna() + # 根据分组计算平均值 + df_mean = df.groupby(gp_col)[cols].mean() + + # 依次处理每一列 + for col in cols: + na_series = df_na[col] + names = list(df.loc[na_series,gp_col]) + + t = df_mean.loc[names,col] + t.index = df.loc[na_series,col].index + + # 相同的index进行赋值 + df.loc[na_series,col] = t + return df +train_pca = pad_mean_by_group(train_pca) +``` From a14c49c16a4a4b3d179ff201f9dfa3ff0cd94baa Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 29 Oct 2021 09:22:48 +0800 Subject: [PATCH 19/90] update on 20211029 --- 10_docker/README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/10_docker/README.md b/10_docker/README.md index 78b1758..84ee8f2 100644 --- a/10_docker/README.md +++ b/10_docker/README.md @@ -419,6 +419,26 @@ docker pull stardog/stardog:latest docker run -v ~/stardog-6.2.2/:/var/opt/stardog -e STARDOG_SERVER_JAVA_ARGS="-Xmx8g -Xms8g -XX:MaxDirectMemorySize=2g" stardog/stardog:latest ``` + +3.8 容器云k8s + +Kubernetes是什么?Kubernetes是一个全新的基于容器技术的分布式架构解决方案,是Google开源的一个容器集群管理系统,Kubernetes简称K8S。Kubernetes 提供了完善的管理工具,这些工具涵盖了开发、部署测试、运维监控在内的各个环节。
+ +Kubernetes特性
+ - 自我修复:在节点故障时,重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理用户的请求,确保线上服务不中断。 + - 弹性伸缩:使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。 + - 自动部署和回滚:K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不影响业务。 + - 服务发现和负载均衡:K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。 + - 机密和配置管理:管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。 + - 存储编排:挂载外部存储系统,无论是来自本地存储,公有云,还是网络存储,都作为集群资源的一部分使用,极大提高存储使用灵活性。 + - 批处理:提供一次性任务,定时任务;满足批量数据处理和分析的场景。 + +[Kubernetes 深入学习(一) —— 入门和集群安装部署](https://www.cnblogs.com/chiangchou/p/k8s-1.html#_label0_0)
+[Kubernetes(一) 跟着官方文档从零搭建K8S](https://juejin.cn/post/6844903943051411469)
+ + + + [RDF入门](https://blog.csdn.net/txlCandy/article/details/50959358)
[OWL语言](https://blog.csdn.net/zycxnanwang/article/details/86557350)
From 603a5655f695d04ebc6208916ba640e529d7edb7 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 29 Oct 2021 09:23:56 +0800 Subject: [PATCH 20/90] update on 20211029 --- 10_docker/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/10_docker/README.md b/10_docker/README.md index 84ee8f2..7875d27 100644 --- a/10_docker/README.md +++ b/10_docker/README.md @@ -435,7 +435,7 @@ Kubernetes特性
[Kubernetes 深入学习(一) —— 入门和集群安装部署](https://www.cnblogs.com/chiangchou/p/k8s-1.html#_label0_0)
[Kubernetes(一) 跟着官方文档从零搭建K8S](https://juejin.cn/post/6844903943051411469)
- +[kubeadm部署k8s集群最全最详细](https://blog.csdn.net/Doudou_Mylove/article/details/103901732)
From 3402fa9bdadf8ced0591e9cd6212f3aa24c66fba Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Thu, 4 Nov 2021 19:09:25 +0800 Subject: [PATCH 21/90] update on 20211105 --- 14_go/README.md | 192 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 14_go/README.md diff --git a/14_go/README.md b/14_go/README.md new file mode 100644 index 0000000..a3e9da9 --- /dev/null +++ b/14_go/README.md @@ -0,0 +1,192 @@ +# python调用golang + +## 示例一 python端输入int返回int + +```Go +package main + +import ( + "C" +) + +func f1(x int) int { + return x*x + 2 +} + +//export Fib +func Fib(n int) int { + if n == 1 || n == 2 { + return 1 + } else { + return Fib(n-1) + Fib(n-2) + f1(1) + } +} + +func main() {} +``` + +//go build -buildmode=c-shared -o _fib.so fib.go
+//参考链接https://blog.csdn.net/cainiao_python/article/details/107724309
+//将_fib.so文件拷贝到python文件夹下
+ +```python +import ctypes +import time +from ctypes import * +so = ctypes.cdll.LoadLibrary('./_fib.so') +start = time.time() +result = so.Fib(40) +end = time.time() +print(f'斐波那契数列第40项:{result},耗时:{end - start}') +``` + +## 示例二 python端输入string返回string(推荐看示例三) + +```Go +package main + +import ( + "C" + "database/sql" + "log" + "strings" + + _ "github.com/go-sql-driver/mysql" +) + +//export Gdbc +func Gdbc(uri *C.char) string { + log.Println(uri) + db, err := sql.Open("mysql", C.GoString(uri)) + if err != nil { + log.Fatalln(err) + } + rows, err := db.Query("SELECT feature_word FROM insurance_qa.feature_words") + if err != nil { + log.Fatalln(err) + } + res := []string{} + for rows.Next() { + var s string + err = rows.Scan(&s) + if err != nil { + log.Fatalln(err) + } + // log.Printf("found row containing %q", s) + res = append(res, s) + } + rows.Close() + return strings.Join(res, ",") +} + +func main() { + // res := Gdbc("username:password@tcp(localhost:3306)/database?charset=utf8") + // fmt.Println(res) +} +``` +//go build -buildmode=c-shared -o _gdbc.so test.go
+//将_gdbc.so文件拷贝到python文件夹下
+ +```python +import ctypes +import time +from ctypes import * +class StructPointer(Structure): + _fields_ = [("p", c_char_p), ("n", c_longlong)] + +so = ctypes.cdll.LoadLibrary('./_gdbc.so') +so.Gdbc.restype = StructPointer +start = time.time() +uri = "username:password@tcp(localhost:3306)/database?charset=utf8" +res = so.Gdbc(uri.encode("utf-8")) +print(res.n) +print(res.p[:res.n].decode())#print(res.p.decode())这样貌似也没问题 +end = time.time() +print(f'耗时:{end - start}') +``` + +## 示例三 python端输入string,go查询数据库然后返回json str + +```Go +package main + +import ( + "C" + "database/sql" + "encoding/json" + "log" + + _ "github.com/go-sql-driver/mysql" +) + +type Fw struct { + feature_word string + word_type string + id int64 +} + +//export Gdbc +func Gdbc(uri *C.char) string { + db, err := sql.Open("mysql", C.GoString(uri)) + //设置数据库最大连接数 + db.SetConnMaxLifetime(100) + //设置上数据库最大闲置连接数 + db.SetMaxIdleConns(10) + if err != nil { + log.Fatalln(err) + } + rows, err := db.Query("SELECT feature_word,word_type,id FROM insurance_qa.feature_words") + if err != nil { + log.Fatalln(err) + } + res := [][]interface{}{} + var fw Fw + for rows.Next() { + err = rows.Scan(&fw.feature_word, &fw.word_type, &fw.id) + if err != nil { + log.Fatalln(err) + } + // log.Printf("found row containing %q", s) + tmp := []interface{}{} + tmp = append(tmp, fw.feature_word) + tmp = append(tmp, fw.word_type) + tmp = append(tmp, fw.id) + res = append(res, tmp) + // res = append(res, []interface{}{fw.feature_word, fw.word_type, fw.id})//上面的一行写法 + } + rows.Close() + b, err := json.Marshal(res) + if err != nil { + panic(err) + } + result := string(b) + return result +} + +func main() {} + +``` + +//go build -buildmode=c-shared -o _gdbc.so test.go
+//将_gdbc.so文件拷贝到python文件夹下
+ +```python +import ctypes +import time +import json +from ctypes import * +class StructPointer(Structure): + _fields_ = [("p", c_char_p), ("n", c_longlong)] + +so = ctypes.cdll.LoadLibrary('./_gdbc.so') +so.Gdbc.restype = StructPointer +start = time.time() +uri = "username:password@tcp(localhost:3306)/database?charset=utf8" +res = so.Gdbc(uri.encode("utf-8")) +print(res.n) +print(res.p.decode()) +print(json.loads(res.p.decode())) +end = time.time() +``` + +## \ No newline at end of file From 33c69fc000a9d7b3061880414c678b0c7eb90e74 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Tue, 16 Nov 2021 11:12:32 +0800 Subject: [PATCH 22/90] update on 20211116 --- 15_ansible/README.md | 60 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 15_ansible/README.md diff --git a/15_ansible/README.md b/15_ansible/README.md new file mode 100644 index 0000000..a7f8659 --- /dev/null +++ b/15_ansible/README.md @@ -0,0 +1,60 @@ +# ansible + +```shell +在/etc/ansible/ansible.cfg下配置[model] +# ping +ansible model -m ping +# ansible-playbook写剧本 +ansible-playbook xxx.yaml +# 传文件 +ansible model -m copy -a "src=./test.txt dest=/home/zhoubin" +# 创建文件(ansible-playbook形式) +- hosts: model + remote_user: zhoubin + tasks: + - name: "create test2.txt in the /etc directory" + file: + path: "/home/zhoubin/test2.txt" + state: "touch" +# 创建文件夹(ansible-playbook形式) +- hosts: model + remote_user: zhoubin + tasks: + - name: "create tmp file in the /etc directory" + file: + path: "/home/zhoubin/tmp" + state: "directory" +# 删除文件(ansible-playbook形式) +- hosts: model + remote_user: zhoubin + tasks: + - name: "delete test.txt in the /etc directory" + file: + path: "/home/zhoubin/test.txt" + state: "absent" +# 删除多个文件(ansible-playbook形式) +- hosts: model + remote_user: zhoubin + tasks: + - name: "delete multi files in the /etc directory" + file: + path: "{{ item }}" + state: "absent" + with_items: + - /home/zhoubin/test1.txt + - /home/zhoubin/test2.txt +# 将远程服务器文件拷贝到本机 +ansible model -m fetch -a "src=/home/zhoubin/test.txt dest=./ force=yes backup=yes" + +# 写一个剧本(传docker镜像并且加载) become:yes可以避免sudo输密码! +- hosts: model + remote_user: zhoubin + tasks: + - name: copy docker image + copy: src=./py37.tar.gz dest=/home/zhoubin + - name: load image + shell: docker load -i /home/zhoubin/py37.tar.gz + become: yes + + +``` \ No newline at end of file From f67928e53fabeda6fa7ef9f63be111869421b627 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Tue, 16 Nov 2021 11:19:09 +0800 Subject: [PATCH 23/90] update on 20211116 --- 15_ansible/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/15_ansible/README.md b/15_ansible/README.md index a7f8659..fcd40ca 100644 --- a/15_ansible/README.md +++ b/15_ansible/README.md @@ -1,4 +1,4 @@ -# ansible +# ansible笔记 ```shell 在/etc/ansible/ansible.cfg下配置[model] From dfb938d7bddeabcac1f7d41e80ceb2d5e0a0e1ba Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Tue, 16 Nov 2021 14:54:19 +0800 Subject: [PATCH 24/90] update on 20211116 --- 15_ansible/README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/15_ansible/README.md b/15_ansible/README.md index fcd40ca..19d4837 100644 --- a/15_ansible/README.md +++ b/15_ansible/README.md @@ -57,4 +57,9 @@ ansible model -m fetch -a "src=/home/zhoubin/test.txt dest=./ force=yes backup=y become: yes -``` \ No newline at end of file +``` + + +### 附录 + +[超简单ansible2.4.2.0与playbook入门教程](https://blog.csdn.net/qq_45206551/article/details/105004233)
\ No newline at end of file From eeaffaf4fc1f621d1f1afe50bf3dbe4adacfdf50 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Tue, 16 Nov 2021 16:53:28 +0800 Subject: [PATCH 25/90] update on 20211116 --- 15_ansible/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/15_ansible/README.md b/15_ansible/README.md index 19d4837..9b2aff0 100644 --- a/15_ansible/README.md +++ b/15_ansible/README.md @@ -62,4 +62,5 @@ ansible model -m fetch -a "src=/home/zhoubin/test.txt dest=./ force=yes backup=y ### 附录 -[超简单ansible2.4.2.0与playbook入门教程](https://blog.csdn.net/qq_45206551/article/details/105004233)
\ No newline at end of file +[超简单ansible2.4.2.0与playbook入门教程](https://blog.csdn.net/qq_45206551/article/details/105004233)
+[ansible-命令使用说明](https://www.cnblogs.com/scajy/p/11353825.html)
From af668f209802d97aefc62a21b3e277b7a704fba2 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Wed, 17 Nov 2021 09:02:11 +0800 Subject: [PATCH 26/90] update on 20211117 --- 03_pandas/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/03_pandas/README.md b/03_pandas/README.md index c3dbc9e..f27a541 100644 --- a/03_pandas/README.md +++ b/03_pandas/README.md @@ -1,5 +1,7 @@ ## 目录 +[pandas进阶修炼300题](https://www.heywhale.com/mw/project/6146c0318447b8001769ff20)
+ [**1. pandas并行包**](#pandas并行包) [**2. pandas dataframe手动创建**](#pandas_dataframe手动创建) From c6e93cbb4e8f53b58cdca1cc01a4f18417e7cb49 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Wed, 17 Nov 2021 09:03:47 +0800 Subject: [PATCH 27/90] update on 20211117 --- 03_pandas/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/03_pandas/README.md b/03_pandas/README.md index f27a541..516980c 100644 --- a/03_pandas/README.md +++ b/03_pandas/README.md @@ -339,4 +339,4 @@ train = dtable.fread(path+'train.csv').to_pandas() #安装cudf(稍微有点麻烦) import cudf train = cudf.read_csv(path+'train.csv').to_pandas() -``` \ No newline at end of file +``` From 469f2485fe613014e552d1f2416607988ef46374 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Wed, 17 Nov 2021 09:06:42 +0800 Subject: [PATCH 28/90] update on 20211117 --- 03_pandas/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/03_pandas/README.md b/03_pandas/README.md index 516980c..f27a541 100644 --- a/03_pandas/README.md +++ b/03_pandas/README.md @@ -339,4 +339,4 @@ train = dtable.fread(path+'train.csv').to_pandas() #安装cudf(稍微有点麻烦) import cudf train = cudf.read_csv(path+'train.csv').to_pandas() -``` +``` \ No newline at end of file From ec3776a06d6f5471fbffa731d3b0270470feffb9 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Thu, 18 Nov 2021 14:17:38 +0800 Subject: [PATCH 29/90] update on 20211118 --- 03_pandas/README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/03_pandas/README.md b/03_pandas/README.md index f27a541..04a1c25 100644 --- a/03_pandas/README.md +++ b/03_pandas/README.md @@ -44,6 +44,10 @@ [**21. 加快dataframe读取**](#加快dataframe读取) +[**22. df热力图**](#df热力图) + + + --- ### pandas_dataframe手动创建 @@ -339,4 +343,10 @@ train = dtable.fread(path+'train.csv').to_pandas() #安装cudf(稍微有点麻烦) import cudf train = cudf.read_csv(path+'train.csv').to_pandas() -``` \ No newline at end of file +``` + +### df热力图 + +```python +df.corr().style.background_gradient(cmap='coolwarm').set_precision(2) +``` From eb8bfd86b8517c7ecccf91da072365ee6f3d4dfd Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Thu, 18 Nov 2021 14:27:50 +0800 Subject: [PATCH 30/90] update on 20211118 --- 03_pandas/README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/03_pandas/README.md b/03_pandas/README.md index 04a1c25..9c7b041 100644 --- a/03_pandas/README.md +++ b/03_pandas/README.md @@ -46,6 +46,8 @@ [**22. df热力图**](#df热力图) +[**23. df热力地图**](#df热力地图) + --- @@ -350,3 +352,26 @@ train = cudf.read_csv(path+'train.csv').to_pandas() ```python df.corr().style.background_gradient(cmap='coolwarm').set_precision(2) ``` + +### df热力地图 + +结合pyecharts将各省市高校上榜数量进行地图可视化
+```python +from pyecharts import options as opts +from pyecharts.charts import Map +#省份 +list1 = ['北京','江苏','上海','广东','湖北','陕西','浙江','四川','湖南','山东','安徽','辽宁','重庆','福建','天津','吉林','河南','黑龙江','江西','甘肃','云南','河北'] +#省份对应的高效数量 +list2 = [18, 15, 10, 9, 7, 7, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1] +c = ( + Map() + .add('', [list(z) for z in zip(list1,list2)], "china",is_map_symbol_show=False) + .set_global_opts( + title_opts=opts.TitleOpts(title="排名前100高校各省市占比"), + visualmap_opts=opts.VisualMapOpts(max_=20), + + + ) +) +c.render_notebook() +``` \ No newline at end of file From 665b85eea6d395b409aac23a67f0b6b3af872dd5 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Thu, 18 Nov 2021 15:09:45 +0800 Subject: [PATCH 31/90] update on 20211118 --- 03_pandas/README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/03_pandas/README.md b/03_pandas/README.md index 9c7b041..afbc54c 100644 --- a/03_pandas/README.md +++ b/03_pandas/README.md @@ -48,7 +48,7 @@ [**23. df热力地图**](#df热力地图) - +[**24. 2个pandas EDA插件**](#eda插件) --- @@ -374,4 +374,17 @@ c = ( ) ) c.render_notebook() +``` + +### eda插件 + +```python +#插件一 +! pip install pandas_profiling +import pandas_profiling +pandas_profiling.ProfileReport(df) +#插件二 +import sweetviz as sv +report = sv.analyze(df) +report.show_html() ``` \ No newline at end of file From 95d6629e77bd1c9e3677595ec73479ee8a752f3c Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Thu, 25 Nov 2021 16:41:20 +0800 Subject: [PATCH 32/90] update on 20211125 --- 01_basic/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/01_basic/README.md b/01_basic/README.md index fccdbd3..9841c4e 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -334,6 +334,9 @@ data[data.msg_from.apply(len)==10] ``` ### re模块 + +[常用正则表达式速查手册,Python文本处理必备](https://mp.weixin.qq.com/s/ySsgcrSnkguO2c8D-SQNxw)
+ ```python # 1. 将一个问题中的网址、邮箱、手机号、身份证、日期、价格提出来 From dbeab97c126917e4784ff4b50e2ff4be21397888 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Tue, 7 Dec 2021 17:39:23 +0800 Subject: [PATCH 33/90] add databases notes --- 16_databases/README.md | 7 +++++++ 16_databases/redis_pic.png | Bin 0 -> 235613 bytes 2 files changed, 7 insertions(+) create mode 100644 16_databases/README.md create mode 100644 16_databases/redis_pic.png diff --git a/16_databases/README.md b/16_databases/README.md new file mode 100644 index 0000000..b00cd2d --- /dev/null +++ b/16_databases/README.md @@ -0,0 +1,7 @@ +# 各种存储数据库笔记 + +## redis + +![redis](redis_pic.png) + +## \ No newline at end of file diff --git a/16_databases/redis_pic.png b/16_databases/redis_pic.png new file mode 100644 index 0000000000000000000000000000000000000000..06eb3ec4a64a99252e301392d5f997116c4bfdf5 GIT binary patch literal 235613 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

Htgls$~#y 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

mGc3zy0O4{?&dT4;@>7CJ$$QAs~O_Dg}?6{&qg zXw9RwtH?L9SzB{HK4$o6W3mKEIJFYEN6`5FK(%C4*$osW>vMDxi=r*sEuRKJYY5RO zJlh8HRckgl8K$dJ>>tN~ak=5&sI2IUaybTw9J3@?!*c|(dXtL*Y`= z+0}8wd?3TtR!eCLAxgdLaaCichl~9IWmOxSoEr!fheKr3lU}qWs{?j_lfpS(r-$m` zPnj^m_ycjNkdOde!Hak*rBfklYLMcrkgwE;H3aDFYZW+4pI;jLCPmZP=%j#Q_M>n^ zLGQWeo|ilCx>H|b=2eg5uu9g^u|w{-<90ny)Tc@S6DRFMtoV!$fojXPteIb{wereSq%okdCPnRLtSH zKtpw$Jt5l$eb{FB?Vj2utt$^gU7W0arR&ogWb4kIno@6Y>q{e7=dnU;v=C=zG7e-M zcx`i_MrFx$Lh*r)tkYRTof$;u6bSWkmeSu3^X-I<3%zv5Vd6NG+=GeZ*eO#@0a73 zFOh-nF4Tj;Vq`qWY5l8zhJ-92q!b6syognpo`GJ;7dqws2md6y&E%tP+`fWD3GT=U z;t$hD1(#A<>cPxg2irGol!u;PE6;A-ArC$Bu=KQVl$pEjaQzOIBV|5`AACBb$=E=9 zHB+sBA+97d(9kJOm<{j8LxWA&=E|oiuq#O#c?EI}ChSLQR0@fbk56ykzTK_-2MU(; zUAh7e9_#x`p7Ir@gZO&s3wTTcSb0=JDje(wDc&MbMbwh;8ZwoEym~mmu7u@}KSk7s zB4i8Jn+Dt|jP3{ZqglHds!RDsZq9=UgL=ocAf3FyU-U@oQW)5I4gqUM(0{0WVRD2@ z7PofeKb`>u3bZFo_~oz_on1gb_T6#QXl61FWE{viU>vAPS>gc4vD+WNZLGDG21A(i z$muzsH6_^3p3yI&H{YH{PZDy0*L9W^)d z|Aym_$IWO{<@)Qd*O_|WhPV3Zr*S(LUVY{uG|cAAcfCih`_^^xz}u-FF}6l!gNx8NdNNFsS}~cWLuWn`F}q8|8rq?w2{UX6oe_CejyJRV!<-YHl8zi-Gh&#aaM_g(^J8<9zZZgERM6qlO-Urw>>-nK_1YyF&5v@EMAj<={k9O^p@BZ8O<-rG5OJ{ptjydjBIqNLk2nl7$oeDB|Dj-lj zkY8qt$DAlo^1@*^x;7Wme7CT)hL@@+$2|A@sIMMv(J$O z4?F;#sMA>4>A(uzw{G~Z{OM1B(pS!T;mZd<_yNrWDAk(JbjjLYte|dwWt%kO+WhI0 z@V-Wno)d313R33@6vnJPBt?BEVaJ*w562>1V~tOh>4AQPI)d7YI>@%E6S9cXlXohN zHP?P_$1DO4{VLZQU3+7_XKkk9&9Y!C;9u4-PV7Kgf=7SQIPv_Y6vts(A0NOTXojN1 zv)ODE+>&D^tz07rgUr4e2WsO0Yb9!J)?L)bu3ZG>7Y|FU2IE!|+mcfuSpd0YrfZDUOOXkklQ&v6ruv~ZDwbH(Qn;i4H?=vHH&d_;)=s$N}$2# zn_A@H{a47ERjcv-9QX~v3>Ww#*Tw_ytCuOnQV04HgKYbTE3T+S7z=~1x&gs{BIpbC z(gUymWc#)s!%XB;;SNF^l?a|1yWzTjmK(19o^*B&KuPJB7hYM1)jqPY0js+mvaNlK zlA`UC?^$#faDK2Eb*o>xdpqRUzxuJf@q|<5iDx$<2IAqo2Gc8Id8!Aiv_;lg9Olq1 zb%^uwD_i7=r`7;3!VrV~e*+HM|Mc3+aWm!jAzZd#3+{N?yty3;wG%M;3OgqC%n$ZSP)ujdH+l?^RDYp^RZT~Dn zS;F)jPB`%fJzo02p3D7kT@UQM^nt5SXb(lyV>EB5N7&{^TzSdkpi-Wf%AoIR7yu^z zP#4*A=$Czo)=N?r|G_IW83(FzpuC@9jby*=|I_}+*0;C`7w z6Q?LcW38Q*%F}obzUIH-K$a4N3PdA1HXHQVA*vmN8^dTQOmJ2;jw`NwSQ0AK!coK- z848;!aG-NzI-HU6jgNy$iiP{ilPU}xX+e$(45cW1bfMj7wJ!r`CoRNBa`mp8ut7(xP;`9wSl@%RTcIp;}N3+-BEVXqPq5 zte5FCc9$!z{wHa}hH2HWp;VnrG$e zuU{(Ip~7*RQ?`b$zFN`y1bsrml8*%fWNtcdb0RzDtfd@nrd{^FIV7 z4Ug+G0gey2H8gItzd?IvpGw0%E!MrqqtxIoPp5`R6+l>f3@5*4uMi~*s>lK3Ap3cC zD?6a}?8KHiHd~H?Eoc{0F8Q!@u3rZw9Fu*;R&CGF%5`wkHjRiFA!YiaMY29WPP!4) zhq~H`{;e0d_-0>G`&`y7?LjKilm%uSsE-3yi~U$yf#Fg2VCf^t?5P|WCcdKR*sIeF ztFq)!*8bN73tx$G+dwFIxIxhrjU=obFgeJ^4e{#W8VfUj!gJ8Iw5UK(ablV_7!!ud zmxcKX6~p3&v>43{Q~UuP7H0Y7mr5RC_+uXFM`gxfh(rAlPFP-|V2UBb%p@JEwy=@< zy8O62l0Ph|$+)oK{PWMpZ1;G%5egG>0-llr{;}#t_ux(Igf>JIXr9Mdd75R|>zLpyz!2 zivjF<>LL^So#%fBEez3m-x^vWY;%S+G8B^Q4Jv-WwJzhF=K zm+P*P70VaNn|$@kt7O%xXJpBtC(C4P;>^OVxx&3ebEpw2(U!8Dk*rCBEmUCD{! zU}X;YA~T>j)xH1yXUVOk%L zJCDrq5zagmB&zzngaC!2t7I&9s~_oD(?fI%SbA{HA<9+I;&XxPF1+Qiw;zHA^8=+x zl~=SM)>`sQCl&m1syW4B0t6rXu+@e}n={TVkV+<)JLa_k#Uk;}eti9G%2ZF2EN{~)<$_O(BWJz$J@WIL{$1X7 z=9zN(F)O9;`2XOdji&(nsJ!u%w`yO(6+oRhvi>xMT`WJ{GL;gZd5;|q)Y68cT3#F7 zJ;9jBcA7&++Jr`);a_=z(S&Z*&pSCz1J6q7#Ckl6gSzeTg>Zd)o% zj7IRxWE{vika580KuyY$zH1W`9oN?0BTi(9Y~1_mKD@DhKiV(`37 zH@4;FP{vI;JmjmP2pi;xP4qmkG8Ds`47rW6fbF5&Zr6e{FS%yS!@|D@D>408vE`d5 zI)T#PBVE00S49=*n~|T=&1^%Vq|Ug=JZb6$EmV$_g{ULBwj2~wTpf%vIR%`jA%AkM z6R@2OeF5^cV`nEWszA#d-=x)6w|3Ucf54}5UCX@AyePH^BUA*uZ?;_?d+cdB@`Sg` zu_vA)pZny;o4W_{Z7ZSW3$ZJeXcCndloJOX_KXk_tmpdWM_B# z4n0@$zK@(MEmNk;?e{(GEGWy1f39#_f@E8RlG3sGemVwc zVSbus_ru6j-A;(KX)M0M+Sl@%2E%x^U59-+o;@e1wv=*!Arg)G;{;i z0td^VTf17W`p&oH#CM(}CmggK0xxg$LY+|w7kMnxGMIJ^>61qM*NK5Z(e?RQKmB+u zzH^7%bju&)k9XfLb8%zed1rn^=1!l2G#pJuoV$7uGw?t7*}q8>wl7|M-p6H+8Q7MD zft{WyJulz<$&XOBJLIG1T_SrgScI*G+vSHh-Xu@1S|tk>?JMn|L;Q{Yh zdNHRK0sWw?HQ+j8G+Vk3L4e^7&87)p@)tm2Z{5x%BfgadI1!bt*^PibzSZS*A^&jY}Uk z%Y_$TB451pVmao(z2%O(|0s_X+GPKwhswtdEqnOTQ|oz5PFB@m}+BSwo-n z6}r%0p>YRAcIDMq%R>)6gtH!b>B3da?>+N9vh={$$y?uiko@6}yJhv7R@rUFLixmn zmq-EUqUJB2E#LU!XQXHC`()Gl=j5(C@0LPeqa1$BaXKN!$3WQxty;%eJ4C1BxFT`Y zEEQkPZ9WN)?}xg}ofatZ)U;mB0nE2{M^!SJ#vOmvmnblrsLbK_1010npaE?M-%$-Y z6`(8i!G+?mbE_U;ST6jbOeXfA9pHZpCUr2!BfVNiuI>Rs;nHZ*aPJRGSKGAbmsv9o zWE}Xv#sTZNIr^Y;NHI07EXCupi!k&It9gKlBMRL0#4i&hQgBxDE)hmNV8tIO0%5&bEob0`LkzD$@&&#j=aI187waL7>i?Dhua{LKzl`EU4%FCO!%8El);Ck?f zWRJP?zyp?%%h3BjaJKBX|ASc1YLeaNFOs*v`7dyde*yUZR+jzx_p)J2L1s*uCvDIf zC(m6VfAiT-%kBU5pd5b0k+S*aePxe@`{EqgIC;y7C&_rMQu6&SSKO{1l(AwAdf1uQ zQqrPQeyu7>#*c^-<};KpCT(NU+2c2$uiS=hb=XX*)hCZSk9`_y_iGZ{8cvL&4pZp@ zCe~#IV5<$R__`oJW-QUnnQOp z4|Km_C#nX7MXV&ei0hu8eDradyW3ouIeCgazx5?quy9Yj4K*F_6!pp4jq79`Za`c8 z+&X#p2hP_bc-`^?<W2wCPd&W~^3Z_nJ!cMfpf$-Ot2f}1g9D_e zt3wXiZy)*fA0Lpl8`kTCtK-LG3tICO*>kTwarOO+GQVZ2&OFymAc}3c`U=}Z9H-%^ zqmPnfk2?;FSKJPX1Mb)&Niz}GxSxCOht*!_=1r8CUqCsY@xHSp&+VTuT;Y<&HaYWs z@5Q-|K<&Yb(m5Ymiq$7Ppv5MHh!ZDFms8(yYN#JBT(}6zJZ>3NtghX?9!k$)haD#U zc&jOgt+#zWxQw}>1s6Dsmv_DUL(+gWxrLg-EH|AVe87>ibf1-YUVwOzHkJb193Jmf zM0Mv%49bswwNK{|(^xe;Gs{xQ%t-DFo2uBXRU_Z&faMN$#x6*&a3s{7m@hx(1p zxzd-%wGdpf2DI*YDS@hwQew$W#(|6juMG|~4%dP3O6=kw$e(Vp3GC|DEq+m#!A=I{H_PUX!EVd6gvOZytUg_}E0pXRGdo(zZojmNX?g$Cnq zV~D3|FoXFrAG_4BEbvc_&UC}33R2~IG1@fqDry{u!64ovFGH!g`;o_GFWgj?!|XmK z!ai&%e0j@D^5oO2<*`*y$q#<<6S-^kqtc0MojK?a#&8QE%}~pG0p3(valq@aO7u9k z<9%H^y1Jwtmj%q6Jr}o4VFiGGna=Gl;r9 zn7nJgv5b?$mavt}4^d^{m$&>zzJnFLcF?uCy$ebcwy5EymK+4C0`s(eyX?f3)-5e9 z$P#YM!`8VbY&GK>Vf7lTlTrI{dH36?*^|o0595~DBpB^OuyWP|`l*7X)%bBZt3<=| zW&>O*LUZB#IVYy{5+1l4wXcN*t2+%jC`wdW8u2;}c+`L`O1xp6t&Bg7UD9vTmuEVW z26)SNmzub5l#hOLh99>*4h-;(F4P55*$@8#C{j@DSV!H(FuXFKFXP~h8SB$1))Npl zqQ>gL*mwe9M6J=C)-k4y>s1o4@xky~3K!%^{ z3QoKmRdNy%YrqX`%{;K4-LvXHS*%E2sIV8|IfP?j|cx&nCW8NrB7A%li zGwzc=-u6d1V(-1M58nx+31~;fYs%!w^7gl!ge#!?QEQ$P-vhW;SVY$hXcm}Bb_+P4PmsgQMZEO4TM-f!j?Nm?}ymR6(t#< z=8t@%$~$nzbNFFV!$bF($v7}r4&-@e)vHsOF43w6ovGBIp1EuNsmP-T;L2vg(&n^m?Q}#gyGN9q1}hGaN^|Sn|>Jm z%rHOv86Nt_=`~pU#?zv|@x{{daqwaW#$mpb;xaz{ITKC35SQU$7^D^rS3CX?)~DC} z`DGZ5#rNs3G9!K(ee;Qxq|BHfd1`a*WkBT~{=p7E6gWT`e!$BaZ=9cLL|x1`jKh#v zkevu`#4I*;Rsf7?lfGo}4gsTTNJV#d7tZ$FByF>2$#F*=Elt>Zhd;8lvqxITPlKY- zCYxWuZDR}fl3uKI%o#rkXG@R+jPwmSn2$mUXpZ9 zqk?%v?oe&exAgJc5$djLT0x#oAcdk$Yag}-ssU1$7pS+IBnef_pvd8NfYD#VGf#Tc zA^CuE4kCpg?E!$VpJy2dVf=E?=pZEtQ&bA&i4cd;S{|DD3>ODjw|QRAuP&5JoEl$R zZmdyMt56G3KY3{ttE$`f>C;2F%w!zMIFNB5&Vf8T{qD|A?c6yku#@)(j1Fv5X~Zl! zuQuk4j2Rt3f}X_&e}?%&Hr;mH8|{YIU?_x}o%@I5D@^`1)=ZKJf z6DoEFQ;8-&zQGw^7-s1+%*w>V4LK{-yO$gr?4r=81D;0#;*g`mf*1bgV=i_xdAbLPJ5`f5sW|qu<{m zy{{~h7q)Jb6Hj?B4ia>ZFrDf7%$YK8)=Zg%iwb`Fi~qp+ zz=`tYGtbN6M;<5B=j?_H9p=gJ|KmoP*t=a8;@zMHvvIit6$vhx1d{{lsU?Nr;Y_?Q z)C(Mq&;s0sxd<-azq0N7ezfz~3#FpDd2oG8l-giztOsmU{8H)f);^(Gp9F};0ESUn zN;K+?b4-CzOl+S4I8j^7AQ=O7yJ|yMWFfEECvptnc`RyQdRa;Y0-U&E6!o)6g?$$r zmSbi{mjkSwTGzb#6;hyW&AHgW@#s=%Z4MzbOU8kW0~rTG4zRz_sltg6f=pl!Ljw!9 z-AutN>)HXu0_kUidn_n)QrM=#WUE2GARYq2VnRdQ&)mE=oEIVRamGYtDHxbIBTJ(X zu$rK0NP@2^0Osw}WD1IfrF}^UfByLfpNG{3N~S}_gi467p!hhLXJ6S&;vw@=;5$9R zIR}GDqnrMIehrRz%-^Sh;abKVS*jV-sBP^X)u8GOXSx{Dz$g5X*0%9-_{zhiXIu;3 z*TB0tEO$;N#%AE_Ol0WbB+sTaVP)IcXX!He@E*HMH&&E-a_-HdsgtM6Ie46N8m{7A zaM0m0b+^4_OM9mrxMaCZpD_)w+{`B|Fq}CbO#@!yT+2~M9wm=F^@OfSTy*}&u;mUH zQ(&d*k_$gAk34#x3^YxXrPw-{@9U9?xC!m_V+*nYZ}Xh_&Xtniu^Fpb3S+ncq0!_W3- z{!|F~h;h=yhQW{2*L9^)W$x;3QTm&~+qmHhG6xdh(3z-1>4UZrq$x@9MIgox*cJf? zHm+)uH*Mo_PL3;QF>#m55|!P)I8kMoM&84AYK(kJSqimsAS;tvIhDa>9LPA}a{%-6 z7@F`u8pfT>M>l`i0H$IO2e2d)7pw_W;>R%;`U?j+4*n%!0YYElN?RGRTk~{lO2R-$ zyxe|6LxsWMgCxRq2}1?MS8@nL8i<4V2}63R45b-vOJR6Yek_jRG`GRhpS&=7_26|< zo*+E+V^cp@uhL+!84&OJbn5vFd$^YAF)ib(31Aewa@e+(Wc+JzjZTA8H_FlIrBD}# zA*`z@7HgQlpq+xzl705Ugm+GQ8hB_thX)2VVPx2^!NZ((E$AZIQlUxCp3`Q@e5`6v z807Xkf{@BZyJ7VLrg5NI_MAIc_L@r})FB9UQYW!0+^GIRx;$@l;L`m{lBMw4To{mp z_c>T_>$EhZeejXfo}K~ObHNgs1M>OEYcn&j%M@3tP@#-= zgy9qRFJV0Li>o(*VSBQ6#;tc$2>eMDgBy)6AH()@uC%4JdCgz~lM=jqlr9_K0eKUL z&5;)g86_Q5F!?~PP3%~^F>n`?{5PLn^<~a7lW`#9K*oWL1Fr@S~+ zXc!KZaphwq(^bJ`7!n}ORKP0nsan2t2HIb?NT5pv8t`bO4QZi}m&BiuNu5{&%uteO zsE9P<$5kcPKK`IfgaHJ1w#NDGU@4#lmru#jV;*;rR@EVJQGpW8NhxSirZ&$uy7RTAQrD9jK7Dk^!b zZB{9~nn&KLh=pKyQ*EMPav)m&D9OU5W*?k>I!Ie;S{R*j|C5~z?ju91N95Za1h)O)_^UH zyy##6WyE4(+CwpZnsGeVUsi%)oLb>Z@rRjHZ@MfmQ3yE-0@poBn$-i^qB@k8LV`at6QjwTZUrtD$1)Ef zz9kjrI|i0HhlvAL7#=$AFR^0qyvwW!QOjU5kBkEu2VM&tU~j-5NA7aN;VVxaMF*Xd za3?s>i`!B3tAFW%;U^GoZSbNJV`pY8%)sqSSbv4Y1am*&nF>Iv%Z`=Z@vT?YL zQy+vvHjp^dcH%NJ6|DZ1@*>&A-FkfM1kph;Rv4fxHA2~I!q&J(JYL$@*{u;71~4^N z|D4PHjhb3{9*LVBV86TL8g?=)5bg~r>ZvnixQn5A4Sd}vi9diMIv zL_EMv#~@8oRMMJg6c}v%w7%}-34177W(+}hVHEbCnK<^Y0b$0B=~5{6;1NIw>sTS+Rn(36RW~X=RRtp^QzU(0ecQ(O zsKZ{s_0dgDt+M9Db-0wg509f5E>3e$!=>?fdx}%{$OYb9WJH= zAp**U3EQS9F`R~96X?y)aF`IGFag2DLm}S=Zqi`!bQL6+64W$}UA-4e2FQQ;Le|8ff!zcjxbSNJ1 zhcn&=Ydlq4C}z5o1Sf+d4jP}g>Jj`wY={U0a^%rR%6D)0j_kY7V%dMmGOQNhybEA7 zHuDqUvA8D8hYYlU)NfSgzVJ*s%S?h-DU6%>EkapZ`{a80@o#@A<7Z5j8*jN8g6}k0 zw%0zT;BY0TQwHVgbAor7SNY0r8A#~Cm8GCsJ8_ImMIM{b_Fi~-liYgOZL+mvyL|13 z-C0-a|a18T} zwr4E!FLcuBLz{_MI*!aru0wy%?@nj zkQO-#!C>5R;}ad;z-ogc2hb$rhjZZb1>7X~vEpZRC(*;OO5sUy2II#x()cPbXFR6M!Ug@*%K&8%*aZ%(K&S}cEhUdUB7 z3rhW393KFf)oCfw!9(7ajIBmB;H*q@Yl|#iaiDzgqvy&^KmV0{{}(@&o*g^Oq9>(Y z1_X~<>qqU%5_1M2&@xCq!p>atw!MjM6J+V~{pB6+d6)bKkKumoi=PSWPDG1w$x-Z~ zavr1fSJP!1Qu-<0Hp+ZlNB*gQ_?+Bx?>%zG4cADqfJaVQS&&2bNp1^i6FN~=ESHf_ zvdz_>bFQ3n%G>Y;5a@=VUgIBA4h##ws+c&vNxj)G za#h9*>sh?7q$0vTlwt9D=oA}^&AN~HRMrw;BdF@OsP0sUHJXeT(rfnWvC|=#XBsMr zW7b&pvFf2pTId+FWM_nB9LPA3aUkPBWez}!#TG1_Gf-i~gXMgj6RX^y9En&w%8Xe( z41$fAlICn82gtPdeQcoQfXkl^re0F&SI>ZKacu_E+_ij@(yt}nNWfI0#rQ@T^2UUP zI2{a6!lS(5%zY4_@#2D499OOGr1UIq`;K;*G;xw#{MVn5k6(0=AUty!Qpgh59P;&iB1LI*Ud0pqc*6w(7nynwd2!+NSspmLB4u zac#V?{g;&-0k_ zANF|x5Ysh$@p!JIU`2>=n3W`~9}zFh%}LWmo9`gtlFesrm@1UqN@Y;YtVb>pkJFaYz?1`c|h<+Qhe=(d5I zgF4-eYwrNX2THpApCZQ}`kA2+!2|hB$8a;uhoN9$^!fgVgI~s{Nej0y3+K0i(q3Sc zj%dVIS`-#&O_(W(8|2O6^Gkf3c_y6k%?~%bo;ON>QJUay!Ungl&{(=w4*u3XDc{eN0c$N>vk@m+G zn}(9s_HEl`;-pESC#X9Vq|6|B)?YKU@z;!d5ke?f`mtog_oY}bHUA6+ef60J>Db<` z?{c+_YfX;IEl$DgIRU6Z_(r!BftS6?m%QYgD4jc_ydh8FMd7opd7RGXn*h!HfE_M_ z_!bJ?Y~j)}VZ4($>&=fMgOUKHEdE}Zqo}sO>`FS?+oi3o4Hr`6A@sX=jVJ>($d4*P zaInWQWr!CA_=Z{Q?e3P=G~W8a73_tsf^G{VJy!Q?sdr6$j?FERVcR1fqh%eT7i&~d z_tYc!!!}D}^X@-4iLR^I<`?5XTBn$19CkyA7?O)q-P^N@oo(zj!9x=YRXLlkt;b@DLr4Xbd{tyb5>S_7VBWouuwa`PDnlm^^l53$O8MS-V8SNV+ z@`3^?O#GLGF{vHa+QtpezCJbdGv$Wejra+~k@yjS~ zr`vu>@tFp%=x@s7wnne*`*$` zCC#63Np&9HFsRJVqS2|SvX=ox>aSld6}YqRM|t#W{-af5m@=4EmtkULh9={{tAGP| z6{kw~QZ1MgTou7fX9ckWWm_=feAAiMDmdbClH9~&+uV}E>8FA|_y1HeX#;tcXmtfs zc(Ahv@rX>H0?}AH&`g@*0#BUoWH*N$f9SEo_B6`mh?#GU16qGQ;V>5bnstswd##nZ zY$Fuc(O6QW=s6*8>uwyd*8Ehe587Ta+2!b=?vP9maip2FIBD>s=TDmX^ZS+3)GLRU z!j80SK=%x$(>l`WzZURYEw=AylpgTb1lu?g?j*#4Jk)W}qlbGUd`27N(C%oY zOKr528O29mEvE=q8DNr!p=I1yIVXW9`IVgumN$FSe3wc-x zC^5|F!g)LLi0Adfwi!hrexBj+>#1X@`^#|tt5jzguFa?fj`0~Uz{U@MAq_?!{LDB| zbH%<9yq-CVh5F9M;7nAMx*zK5WkiRCIs7iK=4aHKn*Zs1FhPE zuVK=3{C=lm-YwQ(zAj&kNgJ;(cRr+5eS#7qL}tb+2S%)VjMWThbY&cPjd6gdVyvCp znBiDJ!Q7247S0=o!!b;O17?{F#M_Y!m_czxL*M8CFb8fM2xyCp6W*F|K;9WQY>-65 z#c$F!5BlSHy+#8>NT@$>tABu*@P;$+D*2c)W-B&HY1(BKd0ca4@Re{z36KG9P*+~~ zOoKm8&X9Q_FUbYMxmWF7%m|mWF}w)}-)Z6kh57LzPyQNmr2>TuXFQfLScf&l{sCO= z#%te#!c`h{RvA#dU;uC=+jtsL>+tZx1sazU%e5qv8rHA4fzK+C`Z}y?HFtT`AUF~N zHD6HWHSZ<(B1}m(!gC5hzpQqeR!|0EDiLq!WqA&Q5!V@(K_f4k2;7bqgR1;h*Z`y- zbWl#S@}Re+seY^*yp=KqCBw+mMm##p84Opd#KCy3Oc<58`mwTMB^5xFU?mJ*=aLpp z4JlgYN}$pmR_;8O=gXdq;pj)sYq{c?s~+GBbw%k#eDU(+0Nr0E2b=NM4>CLZV3rGO9bsv#?$XZG{Ju0w zouSUqkNhQLn3jVHAPuPp8(0}jtznr1wio?at5Q-LQDFeCiYmW=;g732e5jdSUBm@A zN~3E!Rf{g|6zLE#R*%j!!y>K@oV~ z9y|u?=iK~Afz3Djew8R=JsSul@OYdww@W)78l{pH;+M9ccZ=oYOpcFI^D}J`V_zS{ zu6Q>wItCiHo4EgQy2)R=`P1@cG@3g#Jq2`7dXu4^^@M_(AQUr?^uQm?dUBA-+?g88+UZN| zNyC2<+o@m#BYje^`5~=7Zn+4=iXL2l-Pq7AxneXU+lU!=Zo?rh@i#&YjeQ*ppjZHw zaomUn0ZDs04*z5v!U^CR7w&n$+5<(Yh124|(}k;;EryMYrR)yklEwglU%tJ=7wr4& zD&f*3s=Am4x6~DSiqhQED@D$V!<3{Q5El9MMKlCMHp9YIH2Qfxe{%H+NV7}_PJUQM z6c$Tsf~$%iSc;Vh9a7G|>ufNu20sUE7Et2r(RND= zk)gt1Yg4^g0dWSuM>(>{8D0>jD|MQ?8)nR2&9e2X3@xXp*W}B_|P&mbo(yWE{vikZ~a6Kq?1R zL}|?D!+}SangVbtN)%d~{D(!I?4S@7Ho{@A4k3r47`I1MGb)>@ghs)J+lCr3Napmd zrZ6s)4!r>h=Q(N-$%&J~2;&$DN(uhJTaD(+9AQGGmPRO;+-X!qyhglhLryq6`nMF= zT*Oa!{2^2W5agPoM_YY?)1p-SavNkG>F0qb?Ys+dXx4)K1^QYE>M*+?tU?Zw<9NQg zd@qDe(9&d&9B)w^z z%TEJnat3w480{BM1wxdQh~(E3+aO3D(J)O*mvBk24Y@uDl5SH~W6tO)O*kk8OqjTd z30?8Q<29^fY-fGMjksYRV6pb++K*u<#p}D+rW>1^QBF~PG1`5&k+8E&j9$Y}C7%jl zW6&lYEe@)B^&|hIGN7`q{HJgA$VP&GsW6U%?w-q|UkMo;fS?RqDkV`y)RA``J=zlc zIcKz9v1)*rTIm@MMVPg(u@7yDeJ<#7b9bz3uAgBqOnSoUG;3py>{0)#R3$LTQ5lh= zAn~$}f-_sjfs6wg2Qm)qLJl}($&E8Q+;G^Tc);{avO2-z^&%f;u@IeCQK!x>lH}ULGiB}{wl=^ zSnAS74D!zL+hW=prfSwSYqsPJ3N*mya zHUPJF6t+XnvrAWjQeYu&25q`LT}CksA*o1EAE^$*Smz=-A~^H&+Gt6j@8Bvx(4KAC z%MTt=dwC9_CV?K0VaT9D;ZHeqoVbV?#KF1;4ym!SiN{EDJDzZLBrN6-)b><|9wTgF zzWamyensTTYKwjAYnK*l@I<>djXqC#1AK}yR@dmK1?JLYc~}`B3xOd(=rGTkyNFs9 zVD5HMWiw0xsUm4N{|;=S)^2tAZ>gq4Wc>_8o{Z!TtF>gD!SAH z2$ZDDIHX$;W9j=hIv(6P{ zML&Vv_)Ma#9DKh@#2S1hn0muBFZC2py$Mu+uVXQ~0v0a_`KVqtF0UK+BBz_kUsl1!?+ zeyJhB03U?4#T0-ewCvn)~!N9N2p zkZ~a6K*oU~aR7q?)t`88%UgIkUa+Tb#$|6gEJpl)2fCB|CX)=B00000NkvXXu0mjf DHE!XA literal 0 HcmV?d00001 From 4e1bc1912d524d9d987aa9dfa2b3f5dfd23b3144 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Mon, 13 Dec 2021 13:36:17 +0800 Subject: [PATCH 34/90] add py3 notes --- 01_basic/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/01_basic/README.md b/01_basic/README.md index 9841c4e..7a5e291 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -336,6 +336,7 @@ data[data.msg_from.apply(len)==10] ### re模块 [常用正则表达式速查手册,Python文本处理必备](https://mp.weixin.qq.com/s/ySsgcrSnkguO2c8D-SQNxw)
+[regexlearn](https://github.com/aykutkardas/regexlearn.com)
```python # 1. 将一个问题中的网址、邮箱、手机号、身份证、日期、价格提出来 From 57044ee7768523c1d60d9ea9e92edc2b3d7e62ae Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Mon, 27 Dec 2021 18:36:16 +0800 Subject: [PATCH 35/90] update readme 211227 --- 01_basic/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/01_basic/README.md b/01_basic/README.md index 7a5e291..80d9830 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -90,6 +90,8 @@ [**45. 分组计算均值并填充**](#分组计算均值并填充) +[**46. python日期处理**](#python日期处理) + ---

点击展开 @@ -1179,7 +1181,9 @@ def pad_mean_by_group(df, gp_col='stock_id'): train_pca = pad_mean_by_group(train_pca) ``` +### python日期处理 +[80个例子,彻底掌握Python日期时间处理](https://mp.weixin.qq.com/s/2bJUZBfWS_8ULGrb9tRpmw)
From c12e097d21086cc56709572875ad7fc5814a9d16 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Mon, 27 Dec 2021 18:37:07 +0800 Subject: [PATCH 36/90] update readme 211227 --- 01_basic/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/01_basic/README.md b/01_basic/README.md index 80d9830..6e9e5cc 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -1186,5 +1186,4 @@ train_pca = pad_mean_by_group(train_pca) [80个例子,彻底掌握Python日期时间处理](https://mp.weixin.qq.com/s/2bJUZBfWS_8ULGrb9tRpmw)
-
\ No newline at end of file From 5956f05e4fcfb5ff93460c33a0f20a3ba0839304 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Mon, 27 Dec 2021 18:38:42 +0800 Subject: [PATCH 37/90] update readme 211227 --- 01_basic/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/01_basic/README.md b/01_basic/README.md index 6e9e5cc..b1c1035 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -1186,4 +1186,6 @@ train_pca = pad_mean_by_group(train_pca) [80个例子,彻底掌握Python日期时间处理](https://mp.weixin.qq.com/s/2bJUZBfWS_8ULGrb9tRpmw)
+ +
\ No newline at end of file From dd7a0649051ebcfc67b6c7209889cd2701c9fcdc Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Mon, 27 Dec 2021 18:39:13 +0800 Subject: [PATCH 38/90] update readme 211227 --- 01_basic/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/01_basic/README.md b/01_basic/README.md index b1c1035..b79e91e 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -1188,4 +1188,5 @@ train_pca = pad_mean_by_group(train_pca) +
\ No newline at end of file From c51b39b016293e7cd3079a9cb17d103eac884a01 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Mon, 27 Dec 2021 18:40:31 +0800 Subject: [PATCH 39/90] update readme 211227 --- 01_basic/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/01_basic/README.md b/01_basic/README.md index b79e91e..80d9830 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -1187,6 +1187,4 @@ train_pca = pad_mean_by_group(train_pca) - -
\ No newline at end of file From 8ea3f95c255adae03fab809e0d871393bc42142e Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Tue, 28 Dec 2021 09:06:07 +0800 Subject: [PATCH 40/90] update readme 211227 --- 01_basic/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/01_basic/README.md b/01_basic/README.md index 80d9830..b1c1035 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -1187,4 +1187,5 @@ train_pca = pad_mean_by_group(train_pca) +
\ No newline at end of file From 71dceb770bc785d9b6ef0f7b747e397a00fbbcd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E4=BF=A1=E5=8F=B7?= Date: Thu, 14 Apr 2022 21:07:45 +0800 Subject: [PATCH 41/90] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9c77936..7e052eb 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ 默认安装了 `Python 3.8`,以及相关的第三方包 `gensim`, `tqdm`, `flask` +anaconda 虚拟环境创建python版本降级命令:conda create -n tableqa python=3.6 + > life is short.use python. 推荐使用[Anaconda](http://www.continuum.io/downloads),这个IDE集成了大部分常用的包。 @@ -59,4 +61,4 @@ index-url = http://mirrors.aliyun.com/pypi/simple/ [install] trusted-host = mirrors.aliyun.com ``` -
\ No newline at end of file +
From 29d63a25f1442ac7a46ce2cfa22c3b7d537527f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E4=BF=A1=E5=8F=B7?= Date: Fri, 22 Apr 2022 08:59:25 +0800 Subject: [PATCH 42/90] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7e052eb..b05b1db 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ 默认安装了 `Python 3.8`,以及相关的第三方包 `gensim`, `tqdm`, `flask` -anaconda 虚拟环境创建python版本降级命令:conda create -n tableqa python=3.6 +anaconda 虚拟环境创建python版本降级命令:conda create -n tableqa python=3.7 > life is short.use python. From 3a43ce9789589528561da5cb99a4e6eca4288587 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Wed, 1 Jun 2022 09:18:47 +0800 Subject: [PATCH 43/90] update readme 211227 --- 01_basic/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01_basic/README.md b/01_basic/README.md index b1c1035..7a047f9 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -389,7 +389,7 @@ s = '22基本日常生活活动:指食物摄取、大小便始末、穿脱衣 re.findall(r'^\d+(?![\d*小时*]|[\d*种*])[\u4e00-\u9fa5]+', s) # 匹配只留下中文、英文和数字 -re.sub(r'[^\u4E00-\u9FA5\s0-9a-zA-Z]+', '', s)- +re.sub(r'[^\u4E00-\u9FA5\s0-9a-zA-Z]+', '', s) ``` ### eval From c8efc35b5f8b086b51f78c015b1fe62b2a3521e6 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Wed, 1 Jun 2022 09:21:57 +0800 Subject: [PATCH 44/90] update readme 220601 --- 01_basic/README.md | 97 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/01_basic/README.md b/01_basic/README.md index 7a047f9..8bde885 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -390,6 +390,103 @@ re.findall(r'^\d+(?![\d*小时*]|[\d*种*])[\u4e00-\u9fa5]+', s) # 匹配只留下中文、英文和数字 re.sub(r'[^\u4E00-\u9FA5\s0-9a-zA-Z]+', '', s) + +# 日期解析202206 +import cn2an #version 0.5.14 +import datetime +import re +def getYearMonth(s): + ''' + 【格式说明】 + 今年上个月/上月/前一个月/前个月 -> 202204 + 今年当月/该月/这月/这个月/本月 -> 202205 + 去年5月/去年五月/2021年五月/2021五月/二零二一五月/二零二一 五月 -> 202105 + 前年5月/前年五月/2020年五月/2020五月/二零二零五月/二零二零 五月 -> 202005 + 2021年7月/二零二一年7月 -> 202107 + 5月/五月份 -> 202205 + 2021.6/2021.06/2021-6/2021-06/2021 - 6月/2021 ---6月/2021 . 6月/2021...6月, -> 202106 + 2021 4月/2021 04 -> 202104 + 如果没有提到时间 -> 202205(默认今年当月) + 如果输入的时间有误或月份有误比如输入2021 23, -> 202205(默认今年当月) + 如果输入时间超过当前时间 -> 202205(默认今年当月) + 如果输入时间早于2020年1月 -> 202205(默认今年当月) + ''' + cur_date = datetime.datetime.now().strftime('%Y%m') + try: + DATE_REG1 = '(?:[一二三四五六七八九零十0-9]{1,4}年[一二三四五六七八九零十0-9]{1,2}月)|(?:去年[一二三四五六七八九零十0-9]+月)|(?:前年[一二三四五六七八九零十0-9]+月)|(?:[一二三四五六七八九零十0-9]+年[一二三四五六七八九零十0-9]+月)|(?:[一二三四五六七八九零十0-9]{1,2}月)|(?:[一二三四五六七八九零十0-9]+年)|(?:[一二三四五六七八九零十0-9]+月)' + thism_lst = ['当月', '该月', '这个月', '本月'] + lastm_lst = ['上月', '上个月', '前一个月', '前个月'] + date = '' + def helper(s, pattern): + date = '' + s = cn2an.transform(s, "cn2an") # 转换成阿拉伯数字 + res = re.findall(pattern, s) + if res: + res = res[0] # 如果有多个就取第一个 + year = '2022' #需要人工维护当年,还有过去两年的一个判断;每年要手动更新这部分 + if '去年' in res or '21年' in res: + year = '2021' + elif '前年' in res or '20年' in res: + year = '2020' + month = re.findall('(?:([0-9]+)月)', res) + if month: + month = int(month[0]) + if month > 0 and month < 13: + if month < 10: + month = '0' + str(month) + else: + month = str(month) + else: + return '' + date = year + month + else: + date = year + str(datetime.datetime.now().month) + return date + six_d = re.findall(r'2\d{5}', s) #直接识别6位日期比如202110 + if six_d: + date = six_d[0] + if not date: + # 针对2021 4月/2021.6/2021.06/2021-6/2021-06/2021 - 6月/2021 ---6月/2021 . 6月/2021...6月这些情况 + DATE_REG3 = r'(?:\d{4}\s*\.+\s*\d{1,2})|(?:\d{4}\s*-+\s*\d{1,2})|(?:\d{4}\s*_+\s*\d{1,2})|(?:\d{4}\s+\d{1,2})' + six_d2 = re.findall(DATE_REG3, s) + if six_d2: + _six_d2 = six_d2[0] + try: + int(_six_d2[-2]) + _six_d2_m = _six_d2[-2:] + except: + _six_d2_m = _six_d2[-1] + s = _six_d2[:4]+'年'+_six_d2_m+'月' + s = s.replace(' ', '') + if not date: + for i in thism_lst: + if i in s: + date = cur_date + break + if not date: + for i in lastm_lst: + if i in s: + date = (datetime.datetime.now() - datetime.timedelta(days=30, hours=23)).strftime('%Y%m') + break + if not date: + # 判断2021五月这种情况 + DATE_REG2 = '(?:[一二三四五六七八九零十0-9]{4}[一二三四五六七八九零十]{1,2}月)' + res = re.findall(DATE_REG2, s) + if res: + s = res[0][:4]+'年'+res[0][4:] + date = helper(s, DATE_REG1) + else: + date = '' + if not date: + date = helper(s, DATE_REG1) + if not date: + date = cur_date + #corner case再判断下,处理下边界问题 + if date < '202001' or date[-2:] > '12': + date = cur_date + except: + date = cur_date + return date ``` ### eval From 0bb3a9bb260ce411412aacde7c1874dfc35c5e6a Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Thu, 14 Jul 2022 13:30:03 +0800 Subject: [PATCH 45/90] update readme 220714 --- 03_pandas/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/03_pandas/README.md b/03_pandas/README.md index afbc54c..a224b42 100644 --- a/03_pandas/README.md +++ b/03_pandas/README.md @@ -380,7 +380,7 @@ c.render_notebook() ```python #插件一 -! pip install pandas_profiling +#!pip install pandas_profiling import pandas_profiling pandas_profiling.ProfileReport(df) #插件二 From 054d5c3ca9a2fad600b8b721d67b359374a1fe65 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Thu, 14 Jul 2022 13:35:14 +0800 Subject: [PATCH 46/90] update readme 220714 --- 03_pandas/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/03_pandas/README.md b/03_pandas/README.md index a224b42..364cd1d 100644 --- a/03_pandas/README.md +++ b/03_pandas/README.md @@ -2,6 +2,8 @@ [pandas进阶修炼300题](https://www.heywhale.com/mw/project/6146c0318447b8001769ff20)
+[可以替代pandas比较好用的数据平行处理包](#数据平行处理) + [**1. pandas并行包**](#pandas并行包) [**2. pandas dataframe手动创建**](#pandas_dataframe手动创建) @@ -52,6 +54,12 @@ --- +### 数据平行处理 + +[polar](https://pola-rs.github.io/polars-book/user-guide/quickstart/intro.html)
+[pandarallel](https://nalepae.github.io/pandarallel/)
+ + ### pandas_dataframe手动创建 手动创建dataframe From 0259661d7cbdd649a3850d5192ac752c2ef17c72 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Thu, 14 Jul 2022 13:37:48 +0800 Subject: [PATCH 47/90] update readme 220714 --- 03_pandas/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/03_pandas/README.md b/03_pandas/README.md index 364cd1d..28ec9e1 100644 --- a/03_pandas/README.md +++ b/03_pandas/README.md @@ -56,7 +56,10 @@ ### 数据平行处理 -[polar](https://pola-rs.github.io/polars-book/user-guide/quickstart/intro.html)
+[polar]
+https://pola-rs.github.io/polars-book/user-guide/quickstart/intro.html
+https://pola-rs.github.io/polars/py-polars/html/reference
+ [pandarallel](https://nalepae.github.io/pandarallel/)
From 90608f5ef20ccfafe8e0e9ee97fb1bb94ac634d3 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Mon, 18 Jul 2022 14:39:37 +0800 Subject: [PATCH 48/90] add es.md 0718 --- 07_database/es.md | 150 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 07_database/es.md diff --git a/07_database/es.md b/07_database/es.md new file mode 100644 index 0000000..a4a00cd --- /dev/null +++ b/07_database/es.md @@ -0,0 +1,150 @@ +# es存入768维度向量,以及向量查询(ES版本需要7.3之后) + +https://github.com/UKPLab/sentence-transformers/blob/master/examples/applications/semantic-search/semantic_search_quora_elasticsearch.py + + +```python +""" +This script contains an example how to perform semantic search with ElasticSearch. + +As dataset, we use the Quora Duplicate Questions dataset, which contains about 500k questions: +https://www.quora.com/q/quoradata/First-Quora-Dataset-Release-Question-Pairs + +Questions are indexed to ElasticSearch together with their respective sentence +embeddings. + +The script shows results from BM25 as well as from semantic search with +cosine similarity. + +You need ElasticSearch (https://www.elastic.co/de/elasticsearch/) up and running. Further, you need the Python +ElasticSearch Client installed: https://elasticsearch-py.readthedocs.io/en/master/ + +As embeddings model, we use the SBERT model 'quora-distilbert-multilingual', +that it aligned for 100 languages. I.e., you can type in a question in various languages and it will +return the closest questions in the corpus (questions in the corpus are mainly in English). +""" + +from sentence_transformers import SentenceTransformer, util +import os +from elasticsearch import Elasticsearch, helpers +import csv +import time +import tqdm.autonotebook + + + +es = Elasticsearch() + +model = SentenceTransformer('quora-distilbert-multilingual') + +url = "http://qim.fs.quoracdn.net/quora_duplicate_questions.tsv" +dataset_path = "quora_duplicate_questions.tsv" +max_corpus_size = 100000 + +#Download dataset if needed +if not os.path.exists(dataset_path): + print("Download dataset") + util.http_get(url, dataset_path) + +#Get all unique sentences from the file +all_questions = {} +with open(dataset_path, encoding='utf8') as fIn: + reader = csv.DictReader(fIn, delimiter='\t', quoting=csv.QUOTE_MINIMAL) + for row in reader: + all_questions[row['qid1']] = row['question1'] + if len(all_questions) >= max_corpus_size: + break + + all_questions[row['qid2']] = row['question2'] + if len(all_questions) >= max_corpus_size: + break + +qids = list(all_questions.keys()) +questions = [all_questions[qid] for qid in qids] + +#Index data, if the index does not exists +if not es.indices.exists(index="quora"): + try: + es_index = { + "mappings": { + "properties": { + "question": { + "type": "text" + }, + "question_vector": { + "type": "dense_vector", + "dims": 768 + } + } + } + } + + es.indices.create(index='quora', body=es_index, ignore=[400]) + chunk_size = 500 + print("Index data (you can stop it by pressing Ctrl+C once):") + with tqdm.tqdm(total=len(qids)) as pbar: + for start_idx in range(0, len(qids), chunk_size): + end_idx = start_idx+chunk_size + + embeddings = model.encode(questions[start_idx:end_idx], show_progress_bar=False) + bulk_data = [] + for qid, question, embedding in zip(qids[start_idx:end_idx], questions[start_idx:end_idx], embeddings): + bulk_data.append({ + "_index": 'quora', + "_id": qid, + "_source": { + "question": question, + "question_vector": embedding + } + }) + + helpers.bulk(es, bulk_data) + pbar.update(chunk_size) + + except: + print("During index an exception occured. Continue\n\n") + + + + +#Interactive search queries +while True: + inp_question = input("Please enter a question: ") + + encode_start_time = time.time() + question_embedding = model.encode(inp_question) + encode_end_time = time.time() + + #Lexical search + bm25 = es.search(index="quora", body={"query": {"match": {"question": inp_question }}}) + + #Sematic search + sem_search = es.search(index="quora", body={ + "query": { + "script_score": { + "query": { + "match_all": {} + }, + "script": { + "source": "cosineSimilarity(params.queryVector, doc['question_vector']) + 1.0", + "params": { + "queryVector": question_embedding + } + } + } + } + }) + + print("Input question:", inp_question) + print("Computing the embedding took {:.3f} seconds, BM25 search took {:.3f} seconds, semantic search with ES took {:.3f} seconds".format(encode_end_time-encode_start_time, bm25['took']/1000, sem_search['took']/1000)) + + print("BM25 results:") + for hit in bm25['hits']['hits'][0:5]: + print("\t{}".format(hit['_source']['question'])) + + print("\nSemantic Search results:") + for hit in sem_search['hits']['hits'][0:5]: + print("\t{}".format(hit['_source']['question'])) + + print("\n\n========\n") +``` \ No newline at end of file From 46c5787ca7d6e7d10f9e31534f3e2ffbc7d22a45 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Mon, 18 Jul 2022 14:48:14 +0800 Subject: [PATCH 49/90] add faiss.md 0718 --- 07_database/faiss.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 07_database/faiss.md diff --git a/07_database/faiss.md b/07_database/faiss.md new file mode 100644 index 0000000..8cecb90 --- /dev/null +++ b/07_database/faiss.md @@ -0,0 +1,11 @@ +# faiss向量搜索库 + +与es.md提到的es7.3向量搜索一样,faiss是更加专业的向量搜索工具 + +[实战入门faiss搜索bert最邻近句子:docker CPU镜像开箱即用,无需额外安装下载](https://mp.weixin.qq.com/s?__biz=MzA4NzkxNzM3Nw==&mid=2457484515&idx=1&sn=c13b27b09b4a7e2a31a1ee421b362540&chksm=87bc8acdb0cb03db46ca7cc0893e46d4078e925a3b35f717806315c0881f6ad75b2165df4a0f&cur_album_id=2002019450945896449&scene=189#wechat_redirect) + +[semantic_search_quora_faiss.py](https://github.com/UKPLab/sentence-transformers/blob/master/examples/applications/semantic-search/semantic_search_quora_faiss.py) + + + +## todo \ No newline at end of file From 4b6903e1055910f402f5e6a6946b922a374905a0 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 17 Mar 2023 15:44:27 +0800 Subject: [PATCH 50/90] update readme 20230317 --- 01_basic/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/01_basic/README.md b/01_basic/README.md index 8bde885..224e972 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -958,6 +958,13 @@ sorted(l, key=lambda x:x[1], reverse=True) # Out[42]: [('c', 6), ('d', 4), ('e', 3), ('b', 2), ('a', 1)] ``` +用法一(衍生):
```python # 调整数组顺序使奇数位于偶数前面,奇偶相对顺序不变 From f785ffc0b75a9f05fb7bbee6fb14e40cf36876aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E4=BF=A1=E5=8F=B7?= Date: Mon, 10 Apr 2023 16:10:26 +0800 Subject: [PATCH 51/90] Update README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index b05b1db..69a34d3 100644 --- a/README.md +++ b/README.md @@ -62,3 +62,12 @@ index-url = http://mirrors.aliyun.com/pypi/simple/ trusted-host = mirrors.aliyun.com ``` + +# 使用conda升级到python3.8 + +https://qa.1r1g.com/sf/ask/4099772281/)
+```shell +conda update -n base -c defaults conda +conda install -c anaconda python=3.8 +#然后再重新安装下依赖包 +``` From ae958f27fe83095d37815fb2d4dc3bf7c2a24812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E4=BF=A1=E5=8F=B7?= Date: Mon, 10 Apr 2023 16:10:56 +0800 Subject: [PATCH 52/90] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 69a34d3..b27d70a 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ trusted-host = mirrors.aliyun.com ``` -# 使用conda升级到python3.8 +## 使用conda升级到python3.8 https://qa.1r1g.com/sf/ask/4099772281/)
```shell From 502bdac0a2211fe0f3bedae5850d5cd24702e67e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E4=BF=A1=E5=8F=B7?= Date: Tue, 11 Apr 2023 09:21:10 +0800 Subject: [PATCH 53/90] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b27d70a..92e89be 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,15 @@ `Github`加载`ipynb`的速度较慢,建议在 [Nbviewer](http://nbviewer.ipython.org/github/lijin-THU/notes-python/blob/master/index.ipynb) 中查看该项目。 +[python各版本下载仓库](https://www.python.org/ftp/python/)
+ --- ## 简介 -默认安装了 `Python 3.8`,以及相关的第三方包 `gensim`, `tqdm`, `flask` +默认安装了 `Python 3.9`,以及相关的第三方包 `gensim`, `tqdm`, `flask` -anaconda 虚拟环境创建python版本降级命令:conda create -n tableqa python=3.7 +anaconda 虚拟环境创建python版本降级命令:conda create -n tableqa python=3.8 > life is short.use python. From f4519019881b4e1a06c9783052326184afacefcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E4=BF=A1=E5=8F=B7?= Date: Mon, 17 Apr 2023 11:48:00 +0800 Subject: [PATCH 54/90] Update README.md --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 92e89be..08e5f11 100644 --- a/README.md +++ b/README.md @@ -67,9 +67,19 @@ trusted-host = mirrors.aliyun.com ## 使用conda升级到python3.8 +方法一
https://qa.1r1g.com/sf/ask/4099772281/)
```shell conda update -n base -c defaults conda conda install -c anaconda python=3.8 #然后再重新安装下依赖包 + +方法二(或使用虚拟环境)
+$ conda create -p /your_path/env_name python=3.8 +# 激活环境 +$ source activate /your_path/env_name +# 关闭环境 +$ source deactivate /your_path/env_name +# 删除环境 +$ conda env remove -p /your_path/env_name ``` From 7fa3cdd60a6dc03cf12052e1c6da8c9c46922185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E4=BF=A1=E5=8F=B7?= Date: Mon, 17 Apr 2023 11:48:36 +0800 Subject: [PATCH 55/90] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 08e5f11..385e7e0 100644 --- a/README.md +++ b/README.md @@ -73,8 +73,9 @@ https://qa.1r1g.com/sf/ask/4099772281/)
conda update -n base -c defaults conda conda install -c anaconda python=3.8 #然后再重新安装下依赖包 - +``` 方法二(或使用虚拟环境)
+``` $ conda create -p /your_path/env_name python=3.8 # 激活环境 $ source activate /your_path/env_name From 3b83965aeb5f4f5104ecfe81c9a390e3f1d6496d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E4=BF=A1=E5=8F=B7?= Date: Wed, 31 May 2023 17:00:44 +0800 Subject: [PATCH 56/90] Update README.md --- 10_docker/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/10_docker/README.md b/10_docker/README.md index 7875d27..818f049 100644 --- a/10_docker/README.md +++ b/10_docker/README.md @@ -7,7 +7,7 @@ [docker docs for mac](https://docs.docker.com/docker-for-mac/)
1.2 linux下安装
-TODO +[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/) 1.3 配置docker镜像站
[docker镜像站网址](https://www.daocloud.io/mirror#accelerator-doc)
From 9fc7e25fae4da8fc690b452bdeac556ea0adbecc Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 4 Aug 2023 14:47:10 +0800 Subject: [PATCH 57/90] update multiprocess --- .DS_Store | Bin 0 -> 20484 bytes 01_basic/README.md | 75 ++++++++++++++++++ 08_pycharm/.DS_Store | Bin 0 -> 6148 bytes .../.DS_Store" | Bin 0 -> 6148 bytes 4 files changed, 75 insertions(+) create mode 100644 .DS_Store create mode 100644 08_pycharm/.DS_Store create mode 100644 "08_pycharm/\346\277\200\346\264\273\347\240\201/.DS_Store" diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..bf2d0682525e17b6f9086f698ef55cace79e3675 GIT binary patch literal 20484 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 1: + total = len(iterable) if hasattr(iterable, '__len__') else None + + with ProcessPoolExecutor(max_workers) as pool, tqdm(total=total, desc=desc, unit=unit) as pbar: + for i in pool.map(func, iterable): + yield i + pbar.update() + + else: + return map(func, iterable) + +xtuple, xlist, xset = Pipe(tuple), Pipe(list), Pipe(set) + +def ff(x): + for i in range(x): + a = 1 + return x+2 + +if __name__ == '__main__': + dfs = [] + arr = [100000000,200000000,300000000,400000000] + #without multiprocess + for i in arr: + dfs.append(ff(i)) + #with multiprocess + dfs = arr | xProcessPoolExecutor(ff, 16) | xlist #这里的16是进程数,一般cpu有N核就起N-1个进程 + print(dfs) +``` +```python +# 多进程(yuanjie封装meutils) 以多进程读取data下pdf文件为例 +from meutils.pipe import * +os.environ['LOG_PATH'] = 'pdf.log' +from meutils.log_utils import * +location = 'output' #pdf文件处理后保存的文件夹 +@diskcache(location=location) +def func(file_path): + try: + df = pdf_layout(str(file_path)) #解析成字典 详见https://github.com/binzhouchn/deep_learning/blob/master/4_llm/1_%E5%90%91%E9%87%8F%E6%95%B0%E6%8D%AE%E5%BA%93/es/es.py 中的body字典 + with open(f'{location}/{file_path.stem}.txt', 'w', encoding='utf8') as f: + json.dump(df, f, ensure_ascii=False) + except Exception as e: + logger.debug(f"{file_path}: {e}") + logger.debug(f"{file_path}: {traceback.format_exc().strip()}") +if __name__ == '__main__': + ps = Path('./data/').glob('*.pdf') | xlist #将所有pdf文件都列出来 + dfs = ps | xProcessPoolExecutor(func, 16) | xlist #这里的16是进程数,一般cpu有N核就起N-1个进程 +``` ### cv的多进程实现 diff --git a/08_pycharm/.DS_Store b/08_pycharm/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..bec7f6f54d9a49cd9e3113fc8cc1896409aaeb7b GIT binary patch literal 6148 zcmeHK!EO^V5Ve~?om7Y%sM@22#4U$JNyq^qEg>9wLs~=+1+}}~(5$q(UL_mSvIOmC z(0)z1!3Q9|fN$uvGxh)}Aw9Mc@<^UH_ISLWC)wU%jPc$iXfjq~j0tFnP)t z$Qq5Hlj9oW)Q^-8y>EWHFxw7T1}p=s#sHq(5=&Xg4*lu;`HjMH)@c0TYo+p?yX!(! zMfG0wtvggxH}kT|xaW=bu=mo-hCbP^l!|`ap8q-=O!sRKo~tDD!elVg!C^3fDQ|Ye zBv8|ynk2zkuj3kr5EW6`uWjdftJ|r|cB?z9%e>odp#69@tB9>f&8IsD@yUn$-FoLs7>O6jO%;%E+>ZiAx^j4m?+jZIMbgs?$vq^4g z&d3R67acX-Llw_o#^i}rzfYI7c=+z;=J$&)&;G>4D!9g*4wtR^7sqC!R<9@nbZErJ zitf*D%Q9dYxIG5&evr@*9m2w(zB)kZ5&*Ca!&<<`S^{Gvp+i_01P=%|p@1foQ;ES% zIE+i0=MWYKO*rFJd~o_QrwWDZufzIMPiNdQXtia)GH{iFlIhm){eQ8%{=XVzdzJyq zz<zT3RH?o~!jPXh*C^1%Kj0tFnxdL<}1nt;{ zWQ;~;06ETa!2NE!=||EZ@-+j70mH!KV*ta*m!PY za!QDTD7+|ayLH)h6EEqsD_-jhetqzgx=;G1l+i!k^FM~Q?oM%bO~#2A#nL z9T+kF%=T@zYZx#L+|K~s4;C~;hcMNst`6u_2>_UbVI`nrErBr>p+lHz1Pch)p@2G+ zQ;ETKIE-85=MbhEbvWZxd~jNsQ-#9S>M*~h+!=Q?n%*#A7|1d(u0MOz?SH39oihewHCBpXej8HYE&W6(Q~X6e2V9xDFK^>3ZO%nYJ?FG P^G86@U^>IVgEH_J Date: Wed, 16 Aug 2023 14:54:52 +0800 Subject: [PATCH 58/90] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 385e7e0..ba458d9 100644 --- a/README.md +++ b/README.md @@ -84,3 +84,7 @@ $ source deactivate /your_path/env_name # 删除环境 $ conda env remove -p /your_path/env_name ``` + +## 其他python仓库推荐 + +[All algorithms implemented in Python - for education](https://github.com/TheAlgorithms/Python/)
From 30791cf1dde4b9eb9c71ed8366962d7c67f706f9 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 25 Aug 2023 11:09:46 +0800 Subject: [PATCH 59/90] update python notes --- 01_basic/README.md | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/01_basic/README.md b/01_basic/README.md index f48fb05..539ce2a 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -92,6 +92,8 @@ [**46. python日期处理**](#python日期处理) +[**47. dataclass**](#dataclass) + ---
点击展开 @@ -1364,7 +1366,43 @@ train_pca = pad_mean_by_group(train_pca) [80个例子,彻底掌握Python日期时间处理](https://mp.weixin.qq.com/s/2bJUZBfWS_8ULGrb9tRpmw)
- - +### dataclass + +dataclass 提供一个简便的方式创建数据类, 默认实现__init__(), __repr__(), __eq__()方法
+dataclass支持数据类型的嵌套
+支持将数据设置为不可变:@dataclass(frozen=True)
+ +不用dataclass
+ +```python +class Person: + def __init__(self, name, age): + self.name = name + self.age = age +p = Person('test', 18) +q = Person('test', 18) +#<__main__.Person at 0x7ff4ade66f40> +str(p) +repr(p) +#'<__main__.Person object at 0x7ff4ade66f40>' +p == q +#False +``` +```python +from typing import Any +from dataclasses import dataclass +@dataclass +class Person: + name: Any + age: Any = 18 +p = Person('test', 18) +q = Person('test', 18) +#Person(name='test', age=18) +str(p) +repr(p) +#"Person(name='test', age=18)" +p == q +#True +```
\ No newline at end of file From 4f5365c93deff55623cb72f0346a642601a9eecd Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 1 Sep 2023 17:35:20 +0800 Subject: [PATCH 60/90] update md5 --- .DS_Store | Bin 20484 -> 20484 bytes 01_basic/README.md | 21 +++++++++++++++++++++ 10_docker/.DS_Store | Bin 0 -> 8196 bytes 3 files changed, 21 insertions(+) create mode 100644 10_docker/.DS_Store diff --git a/.DS_Store b/.DS_Store index bf2d0682525e17b6f9086f698ef55cace79e3675..ceb39ab38df1d46c547abb913760fa8cbdf09b59 100644 GIT binary patch delta 98 zcmV-o0GAT=|6EFgO^FgZ9ZAUQKPlaClRlaeMAle8m2 zlfEjmlinFD0s=j=3>v%vlaeMivrIq;0h0?Im;(Ym36t+ZS(E=AhOV$$vv7aqQ-`1Itqq{#egQ!t zDKj1m4gqh@@UqmR;>`R!h@dskWOvhu$ 点击展开 @@ -1405,4 +1407,23 @@ p == q #True ``` +### md5_sha256 + +```python +import hashlib + +def enc(s, ed='md5'): + if ed == 'md5': + hash_object = hashlib.md5(s.encode()) + elif ed == 'sha256': + hash_object = hashlib.sha256(s.encode()) + else: + raise ValueError('unsupport type!') + hash_hex = hash_object.hexdigest() + return hash_hex + +for i in ['13730973320','13802198853','17619520726']: + print(enc(i,'md5')) +``` + \ No newline at end of file diff --git a/10_docker/.DS_Store b/10_docker/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..fdff98b2de29c72f209426a74e929a509c274bcc GIT binary patch literal 8196 zcmeHMU2GIp6u#fK(3vu&)AH9vU>9l&VguW>)fQ4*+N!Ozp}M6%fR^2zfsUP>sXMdV zLMTmM{jwJFSBi;(^ck~RnvF7@W!dm$ z(!oLyfgl1w1cC?z5eOo1BSe7iY~G{=?tQ@x#vlSg1a8U*@b5#EI;U};P7CUNI%x1p z0HVAE@EXmj4)AoMK8^cyT2N1wY>MguzAF3@145nnQ7%q2?$c>Og*t;!XYhB1U!lO; zo%EufI73{}U<@JAGR&ZgU7J(CYgET)n4KDT#!{x8BDt?qW2WJ_vDi6; zii#I4E|H{CskE&0!NiC?o^X?H&S^_#_wlFRq&t%G=Y6(q&d!smenTH0R+qQimYXyz zJ?kkOnoc772MkNI$J^|jr8%CRgkVULEXl)a)#PMTeXK6p)G$>Sove?wG}lF28t$B$ zlBHEO^{rh8GKY^$K00;uW#K3MZv`u#=l3hua@utA?ZWBM$%4}}1*hfGB}!Siv#awy zrF+mw+g8Fjq7SR(4*A_hkG)wvPd*N$Z8Mj#oME*hoix)qGwJF(O_K}LTDgt>m6i~OjYvTc8_s0PQRXYh*rmA z!e#m0rK{Ggui3n{v1Ld5*>bg_QdzF79LO7vkuvo?%vi4{ZQJk(Mfu2jcaNiC%i6v zt0e8?>+M;cMzO4H4BsZJNvY4FCP+-eV?Hx+#|KP?{xm zmpqUc?uo_iN~=_XI(aZ{XEJndM=Zy~ZIb$x^bp^>JL$N)$8?Lf=U#Nsv4;5iPEFG_ zNs_7yz^IOI5>wA*S>@N!T2{-N>H6to2PrX*v1i!{c8Z;5XV^FF2X=w|#C~O$*q`h# z_BR-0RAL!cU?n1mVgsrXLkqTHJMKjmxKJtPXKc@Qi>OhBJtf6JP+ zN@Nd#Q=gchE`>BwOE?Urvs`-phDb!^_!Ez{8zYJeN)g%P-oBBzA)mK3M!X`*2El7= zQX=Xi0>02}*`_FJF=d9}?zoG%izx>Lx4nb7jOVDlAc(ID;qTcD`-NRX2qh>Z=&mN% zZo(EcVh8R)Cw8G5J?O_E_F^CQ6KD^?z{4JJ^B!=I;W0dpCkVdJ;d#7><9G=t2)u9N zExe8Qa1!r(Fg}e>@F_mS=lBBO;v6o{190~|0RMO`0Ou1~%e1XSBv(j+xh8_A>x)2< z5Ub+#|J@7!{(pVO0;wPZK?MGn5kPTAqN9zDzR>5C*V<9)2dMML<)#JoRA}HLeBCR@ liO&9ENb{)Ai~Dq1P~uSg&wmKewc!3g!-D(YL*LCi`~!9DG@<|i literal 0 HcmV?d00001 From 6ed5095b655ba3e8a4e02ec42e8bb65fce8cd8a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E4=BF=A1=E5=8F=B7?= Date: Wed, 20 Sep 2023 17:43:12 +0800 Subject: [PATCH 61/90] Update README.md --- 09_remote_ipython/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/09_remote_ipython/README.md b/09_remote_ipython/README.md index a5a07fe..19a1543 100644 --- a/09_remote_ipython/README.md +++ b/09_remote_ipython/README.md @@ -26,7 +26,7 @@ done! 1. 打开ipython ```python -from IPython.lib import passwd +from IPython.lib import passwd #from notebook.auth import passwd In [2] : passwd() # 输入密码 Enter password: Verify password: From acb93f66b11fbd75eb1cf840f3a106f0d5c9a68b Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 3 Nov 2023 15:16:28 +0800 Subject: [PATCH 62/90] update docker readme --- 10_docker/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/10_docker/README.md b/10_docker/README.md index 818f049..f950c0e 100644 --- a/10_docker/README.md +++ b/10_docker/README.md @@ -15,7 +15,8 @@ 1.4 配置docker代理
- windows中右击图标,选settings->Proxies - - [mac/linux](https://www.cnblogs.com/EasonJim/p/9988154.html) + - [mac](https://www.cnblogs.com/EasonJim/p/9988154.html) + - [linux](https://blog.csdn.net/qq_30034989/article/details/132021346) ```shell # 如果使用HTTP代理服务器时,将为docker服务创建systemd插件目录 From a8f695b5ebc444986fbcbf1ed35adff2d8b0643d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E4=BF=A1=E5=8F=B7?= Date: Thu, 18 Jan 2024 14:26:48 +0800 Subject: [PATCH 63/90] Update README.md --- 10_docker/README.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/10_docker/README.md b/10_docker/README.md index f950c0e..6f269c7 100644 --- a/10_docker/README.md +++ b/10_docker/README.md @@ -147,11 +147,21 @@ docker stop $(docker ps -a -q) docker rm $(docker ps -a -q) ``` -2.12 docker修改完镜像生成新的镜像以后貌似没看法删除旧的镜像 +2.12 虚悬镜像 + +上面的镜像列表中,还可以看到一个特殊的镜像,这个镜像既没有仓库名,也没有标签,均为
+```shell + 00285df0df87 5 days ago 342 MB +```
+这个镜像原本是有镜像名和标签的,原来为 mongo:3.2,随着官方镜像维护,发布了新版本后,重新 docker pull mongo:3.2 时,mongo:3.2 这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 。除了 docker pull 可能导致这种情况,docker build 也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image) ,可以用下面的命令专门显示这类镜像:
+```shell +$ docker image ls -f dangling=true +REPOSITORY TAG IMAGE ID CREATED SIZE + 00285df0df87 5 days ago 342 MB +```
+一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除。
```shell -pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy -pandas sklearn jieba gensim tqdm flask requests PyMySQL redis pyahocorasick -pymongo pyspark py2neo neo4j-driver==$PYTHON_DRIVER_VERSION +$ docker image prune ``` 2.13 拷贝宿主机本地文件到docker中,和从docker中拷贝到宿主机 From ea39fbcb33e41cf7f861a863ee99757f813c6a1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E4=BF=A1=E5=8F=B7?= Date: Thu, 18 Jan 2024 14:29:25 +0800 Subject: [PATCH 64/90] Update README.md --- 10_docker/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/10_docker/README.md b/10_docker/README.md index 6f269c7..b823beb 100644 --- a/10_docker/README.md +++ b/10_docker/README.md @@ -1,4 +1,4 @@ -# simple use for docker +# [docker入门实践](https://yeasy.gitbook.io/docker_practice/) ## 1. docker安装及配置Docker镜像站 From 5f60c255f650a565718f00530cf348961bf7f0c3 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Thu, 25 Jan 2024 15:46:54 +0800 Subject: [PATCH 65/90] update slots --- .DS_Store | Bin 20484 -> 18436 bytes 01_basic/README.md | 76 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/.DS_Store b/.DS_Store index ceb39ab38df1d46c547abb913760fa8cbdf09b59..f4a31c61398335c73a5cce9a1f57ca38a87b2ecb 100644 GIT binary patch delta 298 zcmZo!z}PZ@QHFtmfzhcn#gKu)0m$S4Vh}CB!@$78wNd6Z^JD`bmdV@>@{`pJ#5bRF z+Q76~-dLCsD9ykK#6ZBoy|GZ7WwScZ6JbWd%{&UnnUr=W735?VmlzmaV`O4xVP#|I zVCUfGhz-ujFApwBEGaE^np~jZ?aRr*880ANU2SM$p`&1EXi%%8P;F>vXsn}PVPI5S z%gG_CtZy9@pPiGNm){Msj1g)n122RRCwnIMsflggth|JCa-){)W?hGcOzaRzF`$6d x<`9Db-p%$7{Y>Hv3~Uey2W}wk3iIn`84nv4khd6^Ai>}5D;*1Zx-Yb zW7(|6^Hi8oU^9=xai+;D4O)c_4RjPtjcaujstpY+Ep!wtjm;-J8k$aSR1@C3Sa}KO zWG)S#&5LC-m>9(;7ivjO)?yK#Y-=FCSkHj@Ft6US~ zWCItL$=odRn-g`HFl}~Z*}$|pz_g7?0_X@fuu~X3xPi1Q%%z)U9Bf!7`}1(H0G-M) OImKn> 点击展开 @@ -1426,4 +1430,76 @@ for i in ['13730973320','13802198853','17619520726']: print(enc(i,'md5')) ``` +### 查看内存 + +有几种方法可以在Python中获取对象的大小。可以使用sys.getsizeof()来获取对象的确切大小,使用objgraph.show_refs()来可视化对象的结构,或者使用psutil.Process().memory_info()。RSS获取当前分配的所有内存。 + +```python +>>> import numpy as np + >>> import sys + >>> import objgraph + >>> import psutil + >>> import pandas as pd + + >>> ob = np.ones((1024, 1024, 1024, 3), dtype=np.uint8) + + ### Check object 'ob' size + >>> sys.getsizeof(ob) / (1024 * 1024) + 3072.0001373291016 + + ### Check current memory usage of whole process (include ob and installed packages, ...) + >>> psutil.Process().memory_info().rss / (1024 * 1024) + 3234.19140625 + + ### Check structure of 'ob' (Useful for class object) + >>> objgraph.show_refs([ob], filename='sample-graph.png') + + ### Check memory for pandas.DataFrame + >>> from sklearn.datasets import load_boston + >>> data = load_boston() + >>> data = pd.DataFrame(data['data']) + >>> print(data.info(verbose=False, memory_usage='deep')) + + RangeIndex: 506 entries, 0 to 505 + Columns: 13 entries, 0 to 12 + dtypes: float64(13) + memory usage: 51.5 KB + + ### Check memory for pandas.Series + >>> data[0].memory_usage(deep=True) # deep=True to include all the memory used by underlying parts that construct the pd.Series + 4176 +``` + +### slots用法 + +```python +#不使用__slots__时,可以很容易地添加一个额外的job属性 +class Author: + def __init__(self, name, age): + self.name = name + self.age = age + + + me = Author('Yang Zhou', 30) + me.job = 'Software Engineer' + print(me.job) + # Software Engineer + +# 在大多数情况下,我们不需要在运行时更改实例的变量或方法,并且__dict__不会(也不应该)在类定义后更改。所以Python为此提供了一个属性:__slots__ +class Author: + __slots__ = ('name', 'age') + + def __init__(self, name, age): + self.name = name + self.age = age + + + me = Author('Yang Zhou', 30) + me.job = 'Software Engineer' + print(me.job) + # AttributeError: 'Author' object has no attribute 'job' +``` + + + \ No newline at end of file From 7e5ae0e30952e49f4ea4f9deaab29565b6500958 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Thu, 25 Jan 2024 15:49:44 +0800 Subject: [PATCH 66/90] update slots --- 01_basic/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/01_basic/README.md b/01_basic/README.md index ef0ca9a..a54367a 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -1479,7 +1479,6 @@ class Author: self.name = name self.age = age - me = Author('Yang Zhou', 30) me.job = 'Software Engineer' print(me.job) @@ -1492,8 +1491,7 @@ class Author: def __init__(self, name, age): self.name = name self.age = age - - + me = Author('Yang Zhou', 30) me.job = 'Software Engineer' print(me.job) From 8c84e4ae472729f7d4a2731cadac71c9cdff71d1 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Thu, 25 Jan 2024 15:59:59 +0800 Subject: [PATCH 67/90] =?UTF-8?q?update=20=E6=9F=A5=E7=9C=8B=E5=86=85?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01_basic/README.md | 64 +++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/01_basic/README.md b/01_basic/README.md index a54367a..d287bce 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -1436,38 +1436,38 @@ for i in ['13730973320','13802198853','17619520726']: ```python >>> import numpy as np - >>> import sys - >>> import objgraph - >>> import psutil - >>> import pandas as pd - - >>> ob = np.ones((1024, 1024, 1024, 3), dtype=np.uint8) - - ### Check object 'ob' size - >>> sys.getsizeof(ob) / (1024 * 1024) - 3072.0001373291016 - - ### Check current memory usage of whole process (include ob and installed packages, ...) - >>> psutil.Process().memory_info().rss / (1024 * 1024) - 3234.19140625 - - ### Check structure of 'ob' (Useful for class object) - >>> objgraph.show_refs([ob], filename='sample-graph.png') - - ### Check memory for pandas.DataFrame - >>> from sklearn.datasets import load_boston - >>> data = load_boston() - >>> data = pd.DataFrame(data['data']) - >>> print(data.info(verbose=False, memory_usage='deep')) - - RangeIndex: 506 entries, 0 to 505 - Columns: 13 entries, 0 to 12 - dtypes: float64(13) - memory usage: 51.5 KB - - ### Check memory for pandas.Series - >>> data[0].memory_usage(deep=True) # deep=True to include all the memory used by underlying parts that construct the pd.Series - 4176 +>>> import sys +>>> import objgraph +>>> import psutil +>>> import pandas as pd + +>>> ob = np.ones((1024, 1024, 1024, 3), dtype=np.uint8) + +### Check object 'ob' size +>>> sys.getsizeof(ob) / (1024 * 1024) +3072.0001373291016 + +### Check current memory usage of whole process (include ob and installed packages, ...) +>>> psutil.Process().memory_info().rss / (1024 * 1024) +3234.19140625 + +### Check structure of 'ob' (Useful for class object) +>>> objgraph.show_refs([ob], filename='sample-graph.png') + +### Check memory for pandas.DataFrame +>>> from sklearn.datasets import load_boston +>>> data = load_boston() +>>> data = pd.DataFrame(data['data']) +>>> print(data.info(verbose=False, memory_usage='deep')) + +RangeIndex: 506 entries, 0 to 505 +Columns: 13 entries, 0 to 12 +dtypes: float64(13) +memory usage: 51.5 KB + +### Check memory for pandas.Series +>>> data[0].memory_usage(deep=True) # deep=True to include all the memory used by underlying parts that construct the pd.Series +4176 ``` ### slots用法 From 832ea8ac2f3dd2db185a799e00a1132e49eaa6fe Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Tue, 2 Apr 2024 10:27:11 +0800 Subject: [PATCH 68/90] update nginx --- 12_nginx/README.md | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/12_nginx/README.md b/12_nginx/README.md index 96a4c31..5acf588 100644 --- a/12_nginx/README.md +++ b/12_nginx/README.md @@ -1,11 +1,16 @@ ## nginx -[nginx作为http服务器-静态页面的访问](https://www.cnblogs.com/xuyang94/p/12667844.html)
-[docker nginx反向代理](https://www.cnblogs.com/dotnet261010/p/12596185.html)
-[nginx负载均衡参考1](https://www.jianshu.com/p/4c250c1cd6cd)
-[nginx负载均衡参考2](https://www.cnblogs.com/diantong/p/11208508.html)
+[**1. nginx入门使用**](#nginx入门使用) + +[**2. nginx正则使用1(2024.4.2更新)**](#nginx正则使用1) + -### nginx使用 + +--- +
+点击展开 + +### nginx入门使用 **1. 第一步用安装docker nginx** @@ -72,4 +77,20 @@ docker run --name=nginx -d -p 4030:4030 nginx def custom(): return str(3 + 2) ``` -[配置文件2](default2.conf) \ No newline at end of file +[配置文件2](default2.conf) + +
+ +### nginx正则使用1 + + + + + + + - 参考资料 + +[nginx作为http服务器-静态页面的访问](https://www.cnblogs.com/xuyang94/p/12667844.html)
+[docker nginx反向代理](https://www.cnblogs.com/dotnet261010/p/12596185.html)
+[nginx负载均衡参考1](https://www.jianshu.com/p/4c250c1cd6cd)
+[nginx负载均衡参考2](https://www.cnblogs.com/diantong/p/11208508.html)
\ No newline at end of file From d8879da9836a93ca963c0e2279d101addd8d42be Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Tue, 2 Apr 2024 10:28:15 +0800 Subject: [PATCH 69/90] update nginx --- 12_nginx/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/12_nginx/README.md b/12_nginx/README.md index 5acf588..7029c09 100644 --- a/12_nginx/README.md +++ b/12_nginx/README.md @@ -7,11 +7,12 @@ --- -
-点击展开 ### nginx入门使用 +
+点击展开 + **1. 第一步用安装docker nginx** ```shell From 112cec1607e82995570ed975e76fd4c2d2c2ae78 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Tue, 2 Apr 2024 10:52:14 +0800 Subject: [PATCH 70/90] update nginx --- 12_nginx/README.md | 11 +++++++++++ 12_nginx/default3.conf | 15 +++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 12_nginx/default3.conf diff --git a/12_nginx/README.md b/12_nginx/README.md index 7029c09..3af9489 100644 --- a/12_nginx/README.md +++ b/12_nginx/README.md @@ -84,7 +84,18 @@ def custom(): ### nginx正则使用1 +```shell +cd /etc/nginx/conf.d +#修改后重启 +systemctl restart nginx +nginx -s reload +``` +[配置文件3](default3.conf) +说明:本次使用正则的目的是当我访问
+http://10.28.xx.xx:8000/aimanager_gpu/recsys/时,
+正则匹配后转到http://localhost:10086,后面不加/aimanager_gpu/recsys路由
+(如果不走正则那么转到http://localhost:10086后会自动拼接/aimanager_gpu/recsys)
diff --git a/12_nginx/default3.conf b/12_nginx/default3.conf new file mode 100644 index 0000000..2253947 --- /dev/null +++ b/12_nginx/default3.conf @@ -0,0 +1,15 @@ +upstream recsys { + server localhost:10086; + } + +server { + server_name localhost; + listen 8000; + location ~* /aimanager_gpu/recsys/ { + if ($request_uri ~ /aimanager_gpu/recsys/(.+)) + { + set $rightUrl $1; + } + proxy_pass http://recsys/$rightUrl; + } +} \ No newline at end of file From 8b8869b97fe4e81e12055c60b8203f74e6fb4237 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Tue, 2 Apr 2024 10:53:34 +0800 Subject: [PATCH 71/90] update nginx --- 12_nginx/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/12_nginx/README.md b/12_nginx/README.md index 3af9489..6acbd3d 100644 --- a/12_nginx/README.md +++ b/12_nginx/README.md @@ -92,10 +92,10 @@ nginx -s reload ``` [配置文件3](default3.conf) -说明:本次使用正则的目的是当我访问
-http://10.28.xx.xx:8000/aimanager_gpu/recsys/时,
-正则匹配后转到http://localhost:10086,后面不加/aimanager_gpu/recsys路由
-(如果不走正则那么转到http://localhost:10086后会自动拼接/aimanager_gpu/recsys)
+说明:本次使用正则的目的是当我访问 +http://10.28.xx.xx:8000/aimanager_gpu/recsys/时, +正则匹配后转到http://localhost:10086,后面不加/aimanager_gpu/recsys路由 +(如果不走正则那么转到http://localhost:10086后会自动拼接/aimanager_gpu/recsys) From a4efe338bb85b6afa006c1af0a240fbd2bd85f04 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Tue, 2 Apr 2024 10:57:54 +0800 Subject: [PATCH 72/90] update nginx --- 12_nginx/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/12_nginx/README.md b/12_nginx/README.md index 6acbd3d..15f65bc 100644 --- a/12_nginx/README.md +++ b/12_nginx/README.md @@ -95,7 +95,7 @@ nginx -s reload 说明:本次使用正则的目的是当我访问 http://10.28.xx.xx:8000/aimanager_gpu/recsys/时, 正则匹配后转到http://localhost:10086,后面不加/aimanager_gpu/recsys路由 -(如果不走正则那么转到http://localhost:10086后会自动拼接/aimanager_gpu/recsys) +(如果不走正则那么proxy_pass转到http://localhost:10086后会自动拼接/aimanager_gpu/recsys) From 0097aba16ecfda12517b5076bfe6e72e69c71026 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Thu, 18 Apr 2024 11:11:43 +0800 Subject: [PATCH 73/90] =?UTF-8?q?add=20newapi=20docker=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 18436 -> 0 bytes 10_docker/.DS_Store | Bin 8196 -> 0 bytes 10_docker/newapi_docker_demo/README.md | 94 +++++++++++++++++++++++++ 3 files changed, 94 insertions(+) delete mode 100644 .DS_Store delete mode 100644 10_docker/.DS_Store create mode 100644 10_docker/newapi_docker_demo/README.md diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index f4a31c61398335c73a5cce9a1f57ca38a87b2ecb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18436 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 diff --git a/10_docker/newapi_docker_demo/README.md b/10_docker/newapi_docker_demo/README.md new file mode 100644 index 0000000..39dcc95 --- /dev/null +++ b/10_docker/newapi_docker_demo/README.md @@ -0,0 +1,94 @@ +## Dockerfile + +```Dockerfile +FROM node:16 as builder + +WORKDIR /build +COPY web/package.json . +RUN npm install +COPY ./web . +COPY ./VERSION . +RUN DISABLE_ESLINT_PLUGIN='true' VITE_REACT_APP_VERSION=$(cat VERSION) npm run build + +FROM golang AS builder2 + +ENV GO111MODULE=on \ + CGO_ENABLED=1 \ + GOOS=linux + +WORKDIR /build +ADD go.mod go.sum ./ +RUN go mod download +COPY . . +COPY --from=builder /build/dist ./web/dist +RUN go build -ldflags "-s -w -X 'one-api/common.Version=$(cat VERSION)' -extldflags '-static'" -o one-api + +FROM alpine + +RUN apk update \ + && apk upgrade \ + && apk add --no-cache ca-certificates tzdata \ + && update-ca-certificates 2>/dev/null || true + +COPY --from=builder2 /build/one-api / +EXPOSE 3000 +WORKDIR /data +ENTRYPOINT ["/one-api"] +``` + + +## Dockerfile 解析 + +这个 Dockerfile 通过多个阶段构建一个含前端和后端组件的应用。每个阶段使用不同的基础镜像和步骤来完成特定的任务。 + +### 第一阶段:前端构建(Node.js) + +- **基础镜像**: + - `FROM node:16 as builder`:使用 Node.js 16 版本的官方镜像作为基础镜像,并标记此构建阶段为 `builder`。 +- **设置工作目录**: + - `WORKDIR /build`:将工作目录设置为 `/build`。 +- **复制文件**: + - `COPY web/package.json .`:将前端代码目录下的 `package.json` 文件复制到工作目录中。 +- **安装依赖**: + - `RUN npm install`:根据 `package.json` 安装所需依赖。 +- **复制前端代码和版本文件**: + - `COPY ./web .`:将web文件夹下所有文件复制到工作目录。 + - `COPY ./VERSION .`:将项目版本文件复制到工作目录。 +- **构建前端项目**: + - `RUN DISABLE_ESLINT_PLUGIN='true' VITE_REACT_APP_VERSION=$(cat VERSION) npm run build`:设置环境变量并执行前端构建脚本,生成生产环境用的前端文件。 + +### 第二阶段:后端构建(Go) + +- **基础镜像**: + - `FROM golang AS builder2`:使用 Go 的官方镜像作为基础,并标记此阶段为 `builder2`。 +- **环境变量**: + - 设置多个环境变量,以支持 Go 的模块系统和确保生成的是适用于 Linux 的静态链接二进制文件。 +- **设置工作目录**: + - `WORKDIR /build`:设置工作目录。 +- **添加 Go 模块文件**: + - `ADD go.mod go.sum ./`:添加 Go 模块定义文件。 +- **下载依赖**: + - `RUN go mod download`:下载 Go 依赖。 +- **复制代码和前端构建产物**: + - `COPY . .`:复制所有后端代码到工作目录。 + - `COPY --from=builder /build/dist ./web/dist`:从第一阶段中复制构建好的前端文件到后端服务目录中。 +- **编译应用**: + - `RUN go build -ldflags "-s -w -X 'one-api/common.Version=$(cat VERSION)' -extldflags '-static'" -o one-api`:使用 Go 编译命令构建应用,设置链接器选项以嵌入版本信息并优化二进制大小。 + +### 第三阶段:运行环境 + +- **基础镜像**: + - `FROM alpine`:使用轻量级的 Alpine Linux 镜像作为基础。 +- **安装证书和时区数据**: + - 运行一系列命令以安装必要的证书和时区数据,确保应用可以处理 HTTPS 连接和正确的时间。 +- **复制编译好的应用**: + - `COPY --from=builder2 /build/one-api /`:从第二阶段复制编译好的应用到根目录。 +- **端口和工作目录**: + - `EXPOSE 3000`:声明容器在运行时会监听 3000 端口。 + - `WORKDIR /data`:设置工作目录,应用可能会使用此目录来存储数据。 +- **设置入口点**: + - `ENTRYPOINT ["/one-api"]`:设置容器启动时执行的命令。 + +### 总结 + +此 Dockerfile 首先构建前端资源,然后构建后端服务,并将前端资源集成到后端服务中,最后在一个轻量级容器中运行编译好的二进制文件,实现前后端的自动化构建和部署。 From 11a6d6580efc8125174ff8b1f3a4b35a94804e60 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 24 May 2024 09:45:52 +0800 Subject: [PATCH 74/90] update vscode --- .DS_Store | Bin 0 -> 6148 bytes 08_vscode/.DS_Store | Bin 0 -> 6148 bytes 08_vscode/README.md | 76 ++++++++++++++++++ {08_pycharm => 99_pycharm_archive}/.DS_Store | Bin {08_pycharm => 99_pycharm_archive}/README.md | 0 .../pic/pycharm_activ.png | Bin .../pic/pycharm_git1.png | Bin .../pic/pycharm_git2.png | Bin .../pic/pycharm_remote1.png | Bin .../pic/pycharm_remote2.png | Bin .../pic/pycharm_remote3.png | Bin .../pic/pycharm_remote4.png | Bin .../pic/pycharm_remote5.png | Bin .../.DS_Store" | Bin .../jetbrains-agent.jar" | Bin .../\346\277\200\346\264\273\347\240\201.txt" | 0 ...\346\277\200\346\264\273\347\240\2011.txt" | 0 ...\346\277\200\346\264\273\347\240\2012.txt" | 0 ...\346\277\200\346\264\273\347\240\2013.txt" | 0 ...\347\240\201\346\261\207\346\200\273.docx" | Bin 20 files changed, 76 insertions(+) create mode 100644 .DS_Store create mode 100644 08_vscode/.DS_Store create mode 100644 08_vscode/README.md rename {08_pycharm => 99_pycharm_archive}/.DS_Store (100%) rename {08_pycharm => 99_pycharm_archive}/README.md (100%) rename {08_pycharm => 99_pycharm_archive}/pic/pycharm_activ.png (100%) rename {08_pycharm => 99_pycharm_archive}/pic/pycharm_git1.png (100%) rename {08_pycharm => 99_pycharm_archive}/pic/pycharm_git2.png (100%) rename {08_pycharm => 99_pycharm_archive}/pic/pycharm_remote1.png (100%) rename {08_pycharm => 99_pycharm_archive}/pic/pycharm_remote2.png (100%) rename {08_pycharm => 99_pycharm_archive}/pic/pycharm_remote3.png (100%) rename {08_pycharm => 99_pycharm_archive}/pic/pycharm_remote4.png (100%) rename {08_pycharm => 99_pycharm_archive}/pic/pycharm_remote5.png (100%) rename "08_pycharm/\346\277\200\346\264\273\347\240\201/.DS_Store" => "99_pycharm_archive/\346\277\200\346\264\273\347\240\201/.DS_Store" (100%) rename "08_pycharm/\346\277\200\346\264\273\347\240\201/jetbrains-agent.jar" => "99_pycharm_archive/\346\277\200\346\264\273\347\240\201/jetbrains-agent.jar" (100%) rename "08_pycharm/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\201.txt" => "99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\201.txt" (100%) rename "08_pycharm/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2011.txt" => "99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2011.txt" (100%) rename "08_pycharm/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2012.txt" => "99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2012.txt" (100%) rename "08_pycharm/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2013.txt" => "99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2013.txt" (100%) rename "08_pycharm/\346\277\200\346\264\273\347\240\201/\351\235\236\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/Pycharm\346\226\271\345\274\217\344\270\200\346\277\200\346\264\273\347\240\201\346\261\207\346\200\273.docx" => "99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\351\235\236\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/Pycharm\346\226\271\345\274\217\344\270\200\346\277\200\346\264\273\347\240\201\346\261\207\346\200\273.docx" (100%) diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..cd8207aa8514e6a2e27fe576e39f3bff0524d46f GIT binary patch literal 6148 zcmeHKUrWO<5Wmc+Eg}q2*ki!gfph*HzLYt?fE9gEsjV$qtj$;0eC%U(t&)6`}Pl>Sbv$Xg1$PWudybwCpT9E6%lluSWhL91M$2 z*uSLKnNnHwSr4Q0G#Lf8^<$L}!Zc6%Iv|Y`bh)}n^H_~KYM94`j`fYfaUD0P)yLyj zYo{Swd(BBhj@t+AhTPxTolIP3V{_~1GS5Z<*_w-vDm!5;VGt%sJXISC=wgEt|f2bDH4#Rg(hn$)7PlGo5T@(Fw$ zXLh$@u?J5gb_RC8nVp&4%m>*Y#u#_TL5r~(V@yCpww>0VnY_P8-Mck`=c<;n$35mtqV~V)y?X)J4hyO=4Ip5@kWofYxh$x`rTLMuU zv<(&-!2`l|Dxgl~=83^|I*dybXB#Xu>U74{$}o>vdG>hWYIPWwDx7g!BlW}pF)+_S zNt-o1|BvC9S@_7GPa%sKAO`*!1H9aEI}Q|O&em_`;aMx8^`N0(T!9J*=yR6 +```shell +# 第一步 创建容器 +nvidia-docker run -d --name myllm -p 8891:22 -v $PWD/llm:/workspace/llm -w /workspace/llm -it 10.xx.xx.xxx/zhoubin/llm:py311-cuda12.1.0-cudnn8-devel-ubuntu22.04 /bin/bash +注释: +[-p 8891:22]:把docker的端口号22映射到服务器的端口号8891。 +[-d]:容器后台运行,避免退出容器后容器自动关闭。 +[-v]:挂载和同步目录,服务器和docker内有一个文件夹保持同步。 +[-it]:确保docker后台交互运行。 +[10.xx.xx.xxx/zhoubin/llm:py311-cuda12.1.0-cudnn8-devel-ubuntu22.04]:镜像名。 +[/bin/bash]:docker内要运行的指令。 +``` +```shell +#第二步 在容器内安装ssh服务 +docker exec -it [容器ID] /bin/bash +# 更新apt-get +命令:apt-get update +# 安装vim +命令:apt-get install vim +# 安装openssh-server +命令:apt-get install openssh-server +# 设置root密码(docker里面的用户名和密码,我这边账号密码都是root/root) +命令:passwd +``` +```shell +# 第三步 配置/etc/ssh/sshd_config文件 +# 在文件/etc/ssh/sshd_config中添加下面的代码: +PubkeyAuthentication yes +PermitRootLogin yes + +# 第四步 重启ssh服务 +/etc/init.d/ssh restart +或 service ssh restart + +# 第五步 退出docker后,验证端口映射 +docker ps -a +docker port [容器ID] 22 +若结果输出“0.0.0.0:8891”,则说明端口映射正确。 +``` +```shell +# 第6步 本地电脑连接docker(见Termius dgx6_docker_llm) +ssh root@11.xx.xx.xxx -p 8891 ,密码是root +``` +```shell +# 使用VSCode连接远程主机上的docker container +# 打开VScode编辑器,按下快捷键“Ctrl+Shift+X”,查找安装“Remote Development”。安装完成后需要点击“reload”,然后按下快捷键“Ctrl+Shift+P”,输入“remote-ssh”,选择“open SSH Configuration file”,在文件xx/username/.ssh/config中添加如下内容: +Host llm_docker #Host随便起名字 + HostName 11.xxx.xx.x + User root + Port 8891 + +#保存后,按下快捷键"Ctrl+Shift+P",输入"remote-ssh",选择"Connect to Host...",然后点击"llm_docker",接着选择“Linux”,最后按提示输入第三步中设置的root连接密码,在左下角显示"SSH:llm_docker",说明已经成功连接docker。 +``` + +```shell +#内网环境远程如果出现连接不上,大概率是vscode-server无法下载导致,可以手动搞定 +https://update.code.visualstudio.com/commit:903b1e9d8990623e3d7da1df3d33db3e42d80eda/server-linux-x64/stable + +具体参考附录中的[VSCode连不上远程服务器] +``` + + + + + + +---- + +[vscode历史版本下载地址](https://code.visualstudio.com/updates/v1_86)
+[在VScode中添加Linux中的Docker容器中的Python解释器](https://blog.csdn.net/weixin_43268590/article/details/129244984)
+[VSCode连不上远程服务器](https://blog.csdn.net/qq_42610612/article/details/132782965)
+ diff --git a/08_pycharm/.DS_Store b/99_pycharm_archive/.DS_Store similarity index 100% rename from 08_pycharm/.DS_Store rename to 99_pycharm_archive/.DS_Store diff --git a/08_pycharm/README.md b/99_pycharm_archive/README.md similarity index 100% rename from 08_pycharm/README.md rename to 99_pycharm_archive/README.md diff --git a/08_pycharm/pic/pycharm_activ.png b/99_pycharm_archive/pic/pycharm_activ.png similarity index 100% rename from 08_pycharm/pic/pycharm_activ.png rename to 99_pycharm_archive/pic/pycharm_activ.png diff --git a/08_pycharm/pic/pycharm_git1.png b/99_pycharm_archive/pic/pycharm_git1.png similarity index 100% rename from 08_pycharm/pic/pycharm_git1.png rename to 99_pycharm_archive/pic/pycharm_git1.png diff --git a/08_pycharm/pic/pycharm_git2.png b/99_pycharm_archive/pic/pycharm_git2.png similarity index 100% rename from 08_pycharm/pic/pycharm_git2.png rename to 99_pycharm_archive/pic/pycharm_git2.png diff --git a/08_pycharm/pic/pycharm_remote1.png b/99_pycharm_archive/pic/pycharm_remote1.png similarity index 100% rename from 08_pycharm/pic/pycharm_remote1.png rename to 99_pycharm_archive/pic/pycharm_remote1.png diff --git a/08_pycharm/pic/pycharm_remote2.png b/99_pycharm_archive/pic/pycharm_remote2.png similarity index 100% rename from 08_pycharm/pic/pycharm_remote2.png rename to 99_pycharm_archive/pic/pycharm_remote2.png diff --git a/08_pycharm/pic/pycharm_remote3.png b/99_pycharm_archive/pic/pycharm_remote3.png similarity index 100% rename from 08_pycharm/pic/pycharm_remote3.png rename to 99_pycharm_archive/pic/pycharm_remote3.png diff --git a/08_pycharm/pic/pycharm_remote4.png b/99_pycharm_archive/pic/pycharm_remote4.png similarity index 100% rename from 08_pycharm/pic/pycharm_remote4.png rename to 99_pycharm_archive/pic/pycharm_remote4.png diff --git a/08_pycharm/pic/pycharm_remote5.png b/99_pycharm_archive/pic/pycharm_remote5.png similarity index 100% rename from 08_pycharm/pic/pycharm_remote5.png rename to 99_pycharm_archive/pic/pycharm_remote5.png diff --git "a/08_pycharm/\346\277\200\346\264\273\347\240\201/.DS_Store" "b/99_pycharm_archive/\346\277\200\346\264\273\347\240\201/.DS_Store" similarity index 100% rename from "08_pycharm/\346\277\200\346\264\273\347\240\201/.DS_Store" rename to "99_pycharm_archive/\346\277\200\346\264\273\347\240\201/.DS_Store" diff --git "a/08_pycharm/\346\277\200\346\264\273\347\240\201/jetbrains-agent.jar" "b/99_pycharm_archive/\346\277\200\346\264\273\347\240\201/jetbrains-agent.jar" similarity index 100% rename from "08_pycharm/\346\277\200\346\264\273\347\240\201/jetbrains-agent.jar" rename to "99_pycharm_archive/\346\277\200\346\264\273\347\240\201/jetbrains-agent.jar" diff --git "a/08_pycharm/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\201.txt" "b/99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\201.txt" similarity index 100% rename from "08_pycharm/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\201.txt" rename to "99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\201.txt" diff --git "a/08_pycharm/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2011.txt" "b/99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2011.txt" similarity index 100% rename from "08_pycharm/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2011.txt" rename to "99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2011.txt" diff --git "a/08_pycharm/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2012.txt" "b/99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2012.txt" similarity index 100% rename from "08_pycharm/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2012.txt" rename to "99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2012.txt" diff --git "a/08_pycharm/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2013.txt" "b/99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2013.txt" similarity index 100% rename from "08_pycharm/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2013.txt" rename to "99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/\346\277\200\346\264\273\347\240\2013.txt" diff --git "a/08_pycharm/\346\277\200\346\264\273\347\240\201/\351\235\236\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/Pycharm\346\226\271\345\274\217\344\270\200\346\277\200\346\264\273\347\240\201\346\261\207\346\200\273.docx" "b/99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\351\235\236\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/Pycharm\346\226\271\345\274\217\344\270\200\346\277\200\346\264\273\347\240\201\346\261\207\346\200\273.docx" similarity index 100% rename from "08_pycharm/\346\277\200\346\264\273\347\240\201/\351\235\236\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/Pycharm\346\226\271\345\274\217\344\270\200\346\277\200\346\264\273\347\240\201\346\261\207\346\200\273.docx" rename to "99_pycharm_archive/\346\277\200\346\264\273\347\240\201/\351\235\236\346\260\270\344\271\205\346\277\200\346\264\273\347\240\201/Pycharm\346\226\271\345\274\217\344\270\200\346\277\200\346\264\273\347\240\201\346\261\207\346\200\273.docx" From 3f3d074e63d09a6c280c42d08cc11b40e2422e9e Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 24 May 2024 09:47:42 +0800 Subject: [PATCH 75/90] delete ds --- .DS_Store | Bin 6148 -> 0 bytes .gitignore | 2 +- 08_vscode/.DS_Store | Bin 6148 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 .DS_Store delete mode 100644 08_vscode/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index cd8207aa8514e6a2e27fe576e39f3bff0524d46f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKUrWO<5Wmc+Eg}q2*ki!gfph*HzLYt?fE9gEsjV$qtj$;0eC%U(t&)6`}Pl>Sbv$Xg1$PWudybwCpT9E6%lluSWhL91M$2 z*uSLKnNnHwSr4Q0G#Lf8^<$L}!Zc6%Iv|Y`bh)}n^H_~KYM94`j`fYfaUD0P)yLyj zYo{Swd(BBhj@t+AhTPxTolIP3V{_~1GS5Z<*_w-vDm!5;VGt%sJXISC=wgEt|f2bDH4#Rg(hn$)7PlGo5T@(Fw$ zXLh$@u?J5gb_RC8nVp&4%m>*Y#u#_TL5r~(V@yCpww>0VnY_P8-Mck`=c<;n$35mtqV~V)y?X)J4hyO=4Ip5@kWofYxh$x`rTLMuU zv<(&-!2`l|Dxgl~=83^|I*dybXB#Xu>U74{$}o>vdG>hWYIPWwDx7g!BlW}pF)+_S zNt-o1|BvC9S@_7GPa%sKAO`*!1H9aEI}Q|O&em_`;aMx8^`N0(T!9J*=yR6 Date: Fri, 24 May 2024 10:29:56 +0800 Subject: [PATCH 76/90] update vscode vsix --- 08_vscode/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/08_vscode/README.md b/08_vscode/README.md index 1ede547..8006363 100644 --- a/08_vscode/README.md +++ b/08_vscode/README.md @@ -71,6 +71,7 @@ https://update.code.visualstudio.com/commit:903b1e9d8990623e3d7da1df3d33db3e42d8 ---- [vscode历史版本下载地址](https://code.visualstudio.com/updates/v1_86)
+[vscode扩展应用市场vsix文件手动下载安装](https://marketplace.visualstudio.com/search?target=VSCode&category=All%20categories&sortBy=Installs)
[在VScode中添加Linux中的Docker容器中的Python解释器](https://blog.csdn.net/weixin_43268590/article/details/129244984)
[VSCode连不上远程服务器](https://blog.csdn.net/qq_42610612/article/details/132782965)
- +[无网机的vscode中怎么使用jupyter notebook](https://www.bilibili.com/read/cv34411972/?jump_opus=1)
From 3e0c6cbe0d524a11df90fc0e3f260ee3e8578a37 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 24 May 2024 11:05:54 +0800 Subject: [PATCH 77/90] update vscode --- 08_vscode/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/08_vscode/README.md b/08_vscode/README.md index 8006363..c7d9474 100644 --- a/08_vscode/README.md +++ b/08_vscode/README.md @@ -72,6 +72,7 @@ https://update.code.visualstudio.com/commit:903b1e9d8990623e3d7da1df3d33db3e42d8 [vscode历史版本下载地址](https://code.visualstudio.com/updates/v1_86)
[vscode扩展应用市场vsix文件手动下载安装](https://marketplace.visualstudio.com/search?target=VSCode&category=All%20categories&sortBy=Installs)
+[vscode扩展应用市场vsix文件手动下载历史版本插件包](https://blog.csdn.net/qq_15054345/article/details/133884626)
[在VScode中添加Linux中的Docker容器中的Python解释器](https://blog.csdn.net/weixin_43268590/article/details/129244984)
[VSCode连不上远程服务器](https://blog.csdn.net/qq_42610612/article/details/132782965)
[无网机的vscode中怎么使用jupyter notebook](https://www.bilibili.com/read/cv34411972/?jump_opus=1)
From 33412ea2ef636dc85276f9982739df33c19357c4 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Fri, 24 May 2024 12:57:27 +0800 Subject: [PATCH 78/90] update vscode --- 08_vscode/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/08_vscode/README.md b/08_vscode/README.md index c7d9474..5787f3e 100644 --- a/08_vscode/README.md +++ b/08_vscode/README.md @@ -32,7 +32,7 @@ docker exec -it [容器ID] /bin/bash PubkeyAuthentication yes PermitRootLogin yes -# 第四步 重启ssh服务 +# 第四步 重启ssh服务(好像每次停止容器后重启都需要运行下) /etc/init.d/ssh restart 或 service ssh restart From 6377901fc49baf09b4308609a089967857a9d2c7 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Mon, 27 May 2024 17:20:31 +0800 Subject: [PATCH 79/90] update vscode debugging --- 08_vscode/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/08_vscode/README.md b/08_vscode/README.md index 5787f3e..63f8f97 100644 --- a/08_vscode/README.md +++ b/08_vscode/README.md @@ -64,8 +64,9 @@ https://update.code.visualstudio.com/commit:903b1e9d8990623e3d7da1df3d33db3e42d8 ``` +## 2.Debugging - +在Visual Studio Code(VSCode)中,[Debug Console](https://code.visualstudio.com/Docs/editor/debugging)是一个用于查看程序调试信息的窗口。它通常用于查看程序在调试过程中输出的日志信息、变量的值等。Debug Console提供了一个方便的方式来查看和分析程序的执行过程,帮助开发人员定位和解决代码中的问题。 ---- From acf3b72c26cd962a58540e5f5a9efce0da341824 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Mon, 27 May 2024 17:21:40 +0800 Subject: [PATCH 80/90] update vscode debugging --- 08_vscode/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/08_vscode/README.md b/08_vscode/README.md index 63f8f97..5856921 100644 --- a/08_vscode/README.md +++ b/08_vscode/README.md @@ -1,6 +1,6 @@ # vscode使用(版本1.86.2) -## 1.在VScode中添加远程Linux服务器中Docker容器中的Python解释器 +## 1. 在VScode中添加远程Linux服务器中Docker容器中的Python解释器 **以dgx.6机器为例**
```shell @@ -64,7 +64,7 @@ https://update.code.visualstudio.com/commit:903b1e9d8990623e3d7da1df3d33db3e42d8 ``` -## 2.Debugging +## 2. Debugging 在Visual Studio Code(VSCode)中,[Debug Console](https://code.visualstudio.com/Docs/editor/debugging)是一个用于查看程序调试信息的窗口。它通常用于查看程序在调试过程中输出的日志信息、变量的值等。Debug Console提供了一个方便的方式来查看和分析程序的执行过程,帮助开发人员定位和解决代码中的问题。 From 45d93dfa0cd477b888e725b6d653e01504e03603 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Mon, 27 May 2024 17:37:13 +0800 Subject: [PATCH 81/90] update vscode debugging --- 08_vscode/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/08_vscode/README.md b/08_vscode/README.md index 5856921..16cecbd 100644 --- a/08_vscode/README.md +++ b/08_vscode/README.md @@ -64,7 +64,7 @@ https://update.code.visualstudio.com/commit:903b1e9d8990623e3d7da1df3d33db3e42d8 ``` -## 2. Debugging +## 2. Debugging(自带,不需要额外安装插件) 在Visual Studio Code(VSCode)中,[Debug Console](https://code.visualstudio.com/Docs/editor/debugging)是一个用于查看程序调试信息的窗口。它通常用于查看程序在调试过程中输出的日志信息、变量的值等。Debug Console提供了一个方便的方式来查看和分析程序的执行过程,帮助开发人员定位和解决代码中的问题。 From beab51d6c61440cbcaa332abb7cf5407ca77be00 Mon Sep 17 00:00:00 2001 From: binzhouchn Date: Mon, 12 Aug 2024 15:57:28 +0800 Subject: [PATCH 82/90] update mysql --- 01_basic/arg_test.py | 1 + 03_pandas/README.md | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/01_basic/arg_test.py b/01_basic/arg_test.py index 0e65c6b..85f8a82 100644 --- a/01_basic/arg_test.py +++ b/01_basic/arg_test.py @@ -28,3 +28,4 @@ print(opt.dev_path) print('done.') + diff --git a/03_pandas/README.md b/03_pandas/README.md index 28ec9e1..f1c7f58 100644 --- a/03_pandas/README.md +++ b/03_pandas/README.md @@ -52,6 +52,8 @@ [**24. 2个pandas EDA插件**](#eda插件) +[**25. python批量插入mysql数据库**](#python批量插入mysql数据库) + --- ### 数据平行处理 @@ -398,4 +400,32 @@ pandas_profiling.ProfileReport(df) import sweetviz as sv report = sv.analyze(df) report.show_html() +``` + +### python批量插入mysql数据库 + +```python +df.to_numpy()[:5].tolist() +''' +[['25_B', 25, 'B', 0.6, '2024-08-12'], + ['23_C', 23, 'C', 2.2, '2024-08-12'], + ['24_D', 24, 'D', 3.8, '2024-08-12'], + ['29_E', 29, 'E', 1.5, '2024-08-12'], + ['22_F', 22, 'F', 4.1, '2024-08-12']] +''' + +import pymysql +MYSQL_W_CONFIG = {'host':'10.xx.xxx.xx', + 'port':3306, + 'user':'user', + 'password':'passwd', + 'database':'mydatabase', + 'charset':'utf8'} +conn = pymysql.connect(autocommit=True, **MYSQL_W_CONFIG) +cursor = conn.cursor() +sql = "insert into xx_table(id,cust_id,agcode,score,s_time) values(%s,%s,%s,%s,%s)" +cursor.executemany(sql, df_final.to_numpy().tolist()) +conn.commit() +conn.close() +#1w条数据批量插入大概0.45s左右 ``` \ No newline at end of file From 63ae7ad524f15b174f2e611160b5ca0b10498a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E5=BD=AC?= Date: Tue, 15 Apr 2025 15:41:03 +0800 Subject: [PATCH 83/90] update readme --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ba458d9..561cd7a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Analytics](https://ga-beacon.appspot.com/GA-80121379-2/notes-python)](https://github.com/binzhouchn/feature_engineering) # python笔记 -> 版本:0.4
+> 版本:0.5
> 作者:binzhou
> 邮件:binzhouchn@gmail.com
@@ -14,9 +14,9 @@ ## 简介 -默认安装了 `Python 3.9`,以及相关的第三方包 `gensim`, `tqdm`, `flask` +默认安装了 `Python 3.10`,以及相关的第三方包 `gensim`, `tqdm`, `flask` -anaconda 虚拟环境创建python版本降级命令:conda create -n tableqa python=3.8 +anaconda 虚拟环境创建python版本降级命令:conda create -n tableqa python=3.9 > life is short.use python. @@ -65,18 +65,18 @@ trusted-host = mirrors.aliyun.com ```
-## 使用conda升级到python3.8 +## 使用conda升级到python3.12 方法一
https://qa.1r1g.com/sf/ask/4099772281/)
```shell conda update -n base -c defaults conda -conda install -c anaconda python=3.8 +conda install -c anaconda python=3.12 #然后再重新安装下依赖包 ``` 方法二(或使用虚拟环境)
``` -$ conda create -p /your_path/env_name python=3.8 +$ conda create -p /your_path/env_name python=3.12 # 激活环境 $ source activate /your_path/env_name # 关闭环境 From 3d50672908b28f0000a6f0b3b37da3f033948477 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E5=BD=AC?= Date: Tue, 15 Apr 2025 15:46:04 +0800 Subject: [PATCH 84/90] update database --- 07_database/README.md | 2 ++ {16_databases => 07_database}/redis_pic.png | Bin 16_databases/README.md | 7 ------- 3 files changed, 2 insertions(+), 7 deletions(-) rename {16_databases => 07_database}/redis_pic.png (100%) delete mode 100644 16_databases/README.md diff --git a/07_database/README.md b/07_database/README.md index 11f962f..31a1c67 100644 --- a/07_database/README.md +++ b/07_database/README.md @@ -32,6 +32,8 @@ db.commit() ``` ## 2. Redis(docker version) + +![redis](redis_pic.png) ``` # 启动redis命令 docker run --name docker-redis-test -p 6379:6379 -d redis:latest --requirepass "123456" diff --git a/16_databases/redis_pic.png b/07_database/redis_pic.png similarity index 100% rename from 16_databases/redis_pic.png rename to 07_database/redis_pic.png diff --git a/16_databases/README.md b/16_databases/README.md deleted file mode 100644 index b00cd2d..0000000 --- a/16_databases/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# 各种存储数据库笔记 - -## redis - -![redis](redis_pic.png) - -## \ No newline at end of file From 0c9520fb840e0356c45dc609b133aeb7b80a78b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E5=BD=AC?= Date: Tue, 15 Apr 2025 15:47:24 +0800 Subject: [PATCH 85/90] update database --- 07_database/README.md | 2 +- 07_database/{ => imgs}/redis_pic.png | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename 07_database/{ => imgs}/redis_pic.png (100%) diff --git a/07_database/README.md b/07_database/README.md index 31a1c67..124cdb9 100644 --- a/07_database/README.md +++ b/07_database/README.md @@ -33,7 +33,7 @@ db.commit() ## 2. Redis(docker version) -![redis](redis_pic.png) +![redis](imgs/redis_pic.png) ``` # 启动redis命令 docker run --name docker-redis-test -p 6379:6379 -d redis:latest --requirepass "123456" diff --git a/07_database/redis_pic.png b/07_database/imgs/redis_pic.png similarity index 100% rename from 07_database/redis_pic.png rename to 07_database/imgs/redis_pic.png From 12df1fec9d74e2ab3bff405e1c5c28f386c65484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E5=BD=AC?= Date: Tue, 15 Apr 2025 16:12:04 +0800 Subject: [PATCH 86/90] add debugpy --- 01_basic/README.md | 73 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 65 insertions(+), 8 deletions(-) diff --git a/01_basic/README.md b/01_basic/README.md index d287bce..97b2a1a 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -86,19 +86,21 @@ [**43. joblib Parallel并行**](#joblib_parallel) -[**44. 调试神器 - 丢弃print**](#调试神器) +[**44. 调试神器pysnooper - 丢弃print**](#调试神器pysnooper) -[**45. 分组计算均值并填充**](#分组计算均值并填充) +[**45. 调试神器debugpy**](#调试神器debugpy) -[**46. python日期处理**](#python日期处理) +[**46. 分组计算均值并填充**](#分组计算均值并填充) -[**47. dataclass**](#dataclass) +[**47. python日期处理**](#python日期处理) -[**48. md5 sha256**](#md5_sha256) +[**48. dataclass**](#dataclass) -[**49. 查看内存**](#查看内存) +[**49. md5 sha256**](#md5_sha256) -[**50. __slots__用法**](#slots用法) +[**50. 查看内存**](#查看内存) + +[**51. __slots__用法**](#slots用法) ---
@@ -1325,7 +1327,7 @@ for i in range(10,7000): res = Parallel(n_jobs = -1, verbose = 1)(delayed(ff)(i) for i in range(10,7000)) ``` -### 调试神器 +### 调试神器pysnooper ```python #pip install pysnooper @@ -1343,6 +1345,61 @@ if os.environ['pysnooper'] == '0': return wrapper ``` +### 调试神器debugpy + +安装:pip install debugpy -U
+在python代码里面(最前面加上这句话)
+```python +import debugpy +try: + # 5678 is the default attach port in the VS Code debug configurations. Unless a host and port are specified, host defaults to 127.0.0.1 + debugpy.listen(("localhost", 9501)) + print("Waiting for debugger attach") + debugpy.wait_for_client() +except Exception as e: + pass + +``` + +在vscode软件中项目下新建一个.vscode目录,然后创建launch.json,看9501端口那个配置
+```python +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "torchr_ex2", + "type": "python", + "request": "launch", + "program": "/Users/zb/anaconda3/envs/rag/bin/torchrun", + "console": "integratedTerminal", + "justMyCode": true, + "args": [ + "--nnodes", + "1", + "--nproc-per-node", + "2", + "${file}", + "--model_name_or_path", + "my_model_bz" + ] + }, + { + "name": "sh_file_debug", + "type": "debugpy", + "request": "attach", + "connect": { + "host": "localhost", + "port": 9501 + } + }, + ] +} +``` + + ### 分组计算均值并填充 ```python From 52b87285c4147cc2bd43d69d0243a2d6357f4183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E5=BD=AC?= Date: Tue, 15 Apr 2025 16:13:50 +0800 Subject: [PATCH 87/90] add debugpy --- 01_basic/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/01_basic/README.md b/01_basic/README.md index 97b2a1a..54419b6 100644 --- a/01_basic/README.md +++ b/01_basic/README.md @@ -1399,6 +1399,7 @@ except Exception as e: } ``` +上面的端口号都写一样比如9501,别搞错了! ### 分组计算均值并填充 From 08ef71cc15f7a01bf9dcef334d1a17ab5c7281a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E4=BF=A1=E5=8F=B7?= Date: Fri, 15 Aug 2025 10:47:15 +0800 Subject: [PATCH 88/90] Update README.md update https://open-vsx.org/ --- 08_vscode/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/08_vscode/README.md b/08_vscode/README.md index 16cecbd..1118417 100644 --- a/08_vscode/README.md +++ b/08_vscode/README.md @@ -73,6 +73,7 @@ https://update.code.visualstudio.com/commit:903b1e9d8990623e3d7da1df3d33db3e42d8 [vscode历史版本下载地址](https://code.visualstudio.com/updates/v1_86)
[vscode扩展应用市场vsix文件手动下载安装](https://marketplace.visualstudio.com/search?target=VSCode&category=All%20categories&sortBy=Installs)
+[vscode插件历史版本下载https://open-vsx.org](https://open-vsx.org/)
[vscode扩展应用市场vsix文件手动下载历史版本插件包](https://blog.csdn.net/qq_15054345/article/details/133884626)
[在VScode中添加Linux中的Docker容器中的Python解释器](https://blog.csdn.net/weixin_43268590/article/details/129244984)
[VSCode连不上远程服务器](https://blog.csdn.net/qq_42610612/article/details/132782965)
From aa7e31570e2ef6f59944a4c46265aab4d5de7eae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E4=BF=A1=E5=8F=B7?= Date: Thu, 13 Nov 2025 21:24:51 +0800 Subject: [PATCH 89/90] Update README.md --- 07_database/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/07_database/README.md b/07_database/README.md index 124cdb9..67670a6 100644 --- a/07_database/README.md +++ b/07_database/README.md @@ -5,7 +5,7 @@ # 先下载镜像 docker pull mysql:5.5 # 运行容器 可以先把-v去掉 -docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.5 +docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.5 -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。 -v -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。 @@ -36,7 +36,7 @@ db.commit() ![redis](imgs/redis_pic.png) ``` # 启动redis命令 -docker run --name docker-redis-test -p 6379:6379 -d redis:latest --requirepass "123456" +docker run --name docker-redis-test -p 6379:6379 -v redis_data:/data -d redis:latest --requirepass "123456" # redis客户端连接命令 docker exec -it redis-cli # 进去以后的操作 From 16b66c80af57d29c3ab454a99a0daec14a1258c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E4=BF=A1=E5=8F=B7?= Date: Thu, 13 Nov 2025 21:25:44 +0800 Subject: [PATCH 90/90] Update README.md --- 07_database/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/07_database/README.md b/07_database/README.md index 67670a6..92f8bd9 100644 --- a/07_database/README.md +++ b/07_database/README.md @@ -36,7 +36,7 @@ db.commit() ![redis](imgs/redis_pic.png) ``` # 启动redis命令 -docker run --name docker-redis-test -p 6379:6379 -v redis_data:/data -d redis:latest --requirepass "123456" +docker run --name docker-redis-test -p 6379:6379 -v $PWD/redis_data:/data -d redis:latest --requirepass "123456" # redis客户端连接命令 docker exec -it redis-cli # 进去以后的操作