python中常用库以及用法
python中常用库以及用法
vscodez中Data wrangler插件强烈推荐。
1. 安装卸载换源
1.1. Anaconda彻底卸载及重安装
1.2. Pycharm激活
直接淘宝弄个专业版。
1.3. 换源
pip3 config set global.index-url https://pypi.mirrors.ustc.edu.cn/simple/
2. vscode调试终端传参的程序
在vscode界面找到RUN AND DEBUG RUN,然后create a launch.json file.在配置其中的指令。
例如我在终端运行如下指令,并且nohup和&` 用于后台管理进程,但在调试模式下可以省略这些部分。
nohup python /root/data/ai/llama2/langchain.py >langchain_dingtalk_server.log 2>&1
--embedding_path /root/data/ai/bce-embedding-base_v1
--model_path /root/data/ai/path_to_output_dir_2_hf
--file_path /root/data/ai/llama2/data_1229.txt
--chain_type refine
--client_id xxxxxx
--client_secret xxxxxxxxxxxxxxxxxxxxxxxxxx
那么json文件的配置如下:其中name、program可以进行更改。
{
"version": "0.2.0",
"configurations": [
{
"name": "llm_dingtalk",
"type": "python",
"request": "launch",
"program": "/root/data/ai/llama2/langchain.py",
"console": "integratedTerminal",
"args": [
"--embedding_path", "/root/data/ai/bce-embedding-base_v1",
"--model_path", "/root/data/ai/path_to_output_dir_2_hf",
"--file_path", "/root/data/ai/llama2/data_1229.txt",
"--chain_type", "refine",
"--client_id", "xxxxxxxxxxxxxxxxxxx",
"--client_secret", "xxxxxxxxxxxxxxxxxxxxxxxxx"
],
"redirectOutput": true,
"cwd": "${workspaceFolder}",
"env": {
"PYTHONUNBUFFERED": "1"
},
"justMyCode": false
}
]
}
3. 用graphviz画树状图
3.1. 如何绘图
python字典画分形树,所遇问题及解决办法 解决遇到的FileNotFoundError问题
先把要绘制的对象转成嵌套字典的形式。在调用这个类的函数。
import pydot
menu = {'dinner':
{'chicken': 'good',
'beef': 'average',
'vegetarian': {
'tofu': 'good',
'salad': {
'caeser': 'bad',
'italian': 'average'}
},
'pork': 'bad'}
}
class grammer_tree:
graph = None
def __init__(self):
self.graph = pydot.Dot(graph_type='graph')
def draw(self, parent_name, child_name):
edge = pydot.Edge(parent_name, child_name)
self.graph.add_edge(edge)
def visit(self, node, parent=None): ## 运用了递归
for k, v in node.items():
if isinstance(v, dict): ## 是否是叶子节点
## We start with the root node whose parent is None
## we don't want to graph the None node
if parent:
self.draw(parent, k)
self.visit(v, k)
else:
if k != '$': ## 只画非空元素 $代表一个空节点,可删去,或修改为其他
self.draw(parent, k)
## drawing the label using a distinct name
## self.draw(k, k+'_'+v) 子结点为空 不用画
def start(self, dic):
self.visit(dic)
## 下面二者根据自己需求使用
self.graph.write_png('tree.png') ## 最后结果生成png图片格式
## graph.write_pdf('tree.pdf') ##最后结果生成pdf
if __name__ == "__main__":
photo_draw = grammer_tree()
photo_draw.start(menu)
3.2. 解决乱码
先把pydot生成的文件保存成dot文件,再将dot文件的编码格式转成UTF-8,再通过终端使用命令
node [shape=box, style="filled, rounded", color="black", fontname="FangSong"]
dot -Tpdf dot_data.dot -o dot_data.pdf
4. 用chinese_calendar获取日期特征
import os
import time
import datetime
from datetime import timedelta
import pandas as pd
from chinese_calendar import is_holiday,get_holiday_detail
## 获取日期范围
def get_DateRange():
start_time = datetime.datetime.strptime("2020-01-01","%Y-%m-%d")
now = datetime.datetime.now()
next_month_end = datetime.datetime(now.year, now.month + 2, 1) - timedelta(days=1) ## 下月最后一天
date_range = pd.date_range(
start=start_time, ## 开始日期
end=next_month_end, ## 结束日期
freq="D",
)
return pd.DataFrame(index=date_range)
## 判断节假日
def Get_is_holiday(date):
'''
获取节假日
'''
date = pd.to_datetime(date)
IsHoliday = is_holiday(date) ## 是否节假日
OnHoliday, HolidayName = get_holiday_detail(date) ## 是否节假日、节假日名称
if IsHoliday == True:
return HolidayName
else:
return "Work Day"
## 获取日期特征
def get_Feature_day(df):
## 年、月、季度、星期
df['year'] = [str(i.year) for i in df.index] ## 年
df['month'] = [str(i.month) for i in df.index] ## 月
df['quarter'] = [str((int(i) - 1) // 3 + 1) for i in df.month] ## 季度
df['week'] = [str(i.isoweekday()) for i in df.index] ## 星期
## 节假日、调休日
list_ = [[i, Get_is_holiday(i)] for i in df.index]
day_type = pd.DataFrame(list_, columns=['day', 'day_type'])
df['day_type'] = day_type.day_type.fillna("Week Day & Change Holiday").tolist()
df.day_type = ["双11" if i.day == 11 and m == "11" else t for i,m,t in zip(df.index,df.month,df.day_type)] ## 双12
df.day_type = ["双12" if i.day == 12 and m == "12" else t for i, m, t in zip(df.index, df.month, df.day_type)] ## 双11
df.day_type = ["618" if i.day == 18 and m == "6" else t for i, m, t in zip(df.index, df.month, df.day_type)] ## 618
df.day_type = ["818" if i.day == 18 and m == "8" else t for i, m, t in zip(df.index, df.month, df.day_type)] ## 818
dict_day_type_chinese = {
"New Year's Day":"元旦",
"Spring Festival": "春节",
"Tomb-sweeping Day": "清明节",
"Labour Day": "劳动节",
"Dragon Boat Festival": "端午节",
"Mid-autumn Festival": "中秋节",
"National Day": "国庆节",
"Week Day & Change Holiday": "周末&调休",
"Work Day": "工作日",
"618": "618",
"818": "818",
"双11": "双11",
"双12": "双12"
}
df['day_type_chinese'] = [dict_day_type_chinese[i] for i in df.day_type]
columns = ['year', 'month', 'quarter', 'week', 'day_type','day_type_chinese']
return df[columns]
if __name__ == "__main__":
dir_ = os.getcwd()
df_date_range = get_DateRange()
feature_day = get_Feature_day(df_date_range)
feature_day.to_excel("日期特征_{}.xlsx".format(datetime.datetime.now().strftime("%Y-%m-%d")))
print("程序运行完成")
time.sleep(10)
5. matplotlib使用
5.1. 不指定x坐标直接绘图
plt.plot(y)
plt.show()
5.2. 用matplotlib绘制以日期为x轴的数据
import matplotlib.pyplot as plt
from datetime import datetime
import pandas as pd
import numpy as np
## 从已经写好的csv文件中读取数据
mydata = pd.read_csv("data.csv")
print(data) ## 查看数据
## 将数据提取出作为坐标,将数值转化为int型,datetime类型转化为string类型
count = np.array(mydata['Count'].astype(str).astype(int))
date = np.array(mydata['Time'].astype(str))
## X坐标,将str类型的数据转换为datetime.date类型的数据,作为x坐标
xs = [datetime.strptime(d, '%Y-%m-%d').date() for d in date]
## 图表格式
## 设置图形格式
plt.title('地铁人数',fontsize=25) ## 字体大小设置为25
plt.xlabel('日期',fontsize=10) ## x轴显示“日期”,字体大小设置为10
plt.ylabel('人数',fontsize=10) ## y轴显示“人数”,字体大小设置为10
plt.plot(xs, count, 'o-',label='客流量')
plt.tick_params(axis='both',which='both',labelsize=10)
## 显示折线图
plt.gcf().autofmt_xdate() ## 自动旋转日期标记
plt.show()
5.3. 中文乱码
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] ## 用来正常显示中文标签SimHei
plt.rcParams['axes.unicode_minus'] = False ## 用来正常显示负号
## 黑体(宋体?) SimHei
## 微软雅黑 Microsoft YaHei
## 微软正黑体 Microsoft JHengHei
## 新宋体 NSimSun
6. logging 的用法
Python logging 的用法:从概念、场景到三种配置方式
def setup_logger():
## 获取一个根日志记录器
logger = logging.getLogger()
## 创建一个日志处理器,日志将输出到控制台(即标准输出)
handler = logging.StreamHandler()
## 设置日志的格式,包括时间戳、日志名称、日志级别、日志消息、文件名和行号
handler.setFormatter(
logging.Formatter('%(asctime)s %(name)-8s %(levelname)-8s %(message)s [%(filename)s:%(lineno)d]')
)
## 将处理器添加到日志记录器中,使日志可以通过该处理器输出
logger.addHandler(handler)
## 设置日志记录器的级别为 INFO,记录 INFO 及以上级别的日志
logger.setLevel(logging.INFO)
## 返回配置好的日志记录器
return logger
7. argparse模块
def define_options():
## 创建一个 ArgumentParser 对象,用于处理命令行参数
parser = argparse.ArgumentParser()
## 添加一个必需的命令行参数 --client_id,帮助信息指向指定的开发平台 URL
parser.add_argument(
'--client_id', dest='client_id', required=True,
help='app_key or suite_key from https://xxxxx.xxxxxxxx.com'
)
## 添加一个必需的命令行参数 --client_secret,帮助信息指向指定的开发平台 URL
parser.add_argument(
'--client_secret', dest='client_secret', required=True,
help='app_secret or suite_secret from https://xxxxx.xxxxxx.com'
)
## 添加必需的命令行参数 --file_path,用于指定文件路径,参数类型为字符串
parser.add_argument('--file_path', required=True, type=str)
## 添加必需的命令行参数 --embedding_path,用于指定嵌入路径,参数类型为字符串
parser.add_argument('--embedding_path', required=True, type=str)
## 添加必需的命令行参数 --model_path,用于指定模型路径,参数类型为字符串
parser.add_argument('--model_path', required=True, type=str)
## 添加可选的命令行参数 --gpu_id,默认为 "0",用于指定 GPU ID,参数类型为字符串
parser.add_argument('--gpu_id', default="0", type=str)
## 添加可选的命令行参数 --chain_type,默认为 "refine",用于指定链类型,参数类型为字符串
parser.add_argument('--chain_type', default="refine", type=str)
## 解析命令行参数并返回解析后的参数对象
options = parser.parse_args()
## 返回解析后的选项
return options
8. re库
9. split函数
在进行关键词提取时,将所有关键词放一起。会出现空格,
import re
## 示例文本
combined_text = "这是 一段 文本"
## 使用正则表达式分割,不捕获空格
split_str = re.split(r'\s+', combined_text)
## 使用正则表达式分割,不捕获空格
split_str = re.split(r'\s+', combined_text, maxsplit=0)
## 使用正则表达式分割,保留所有空格
split_str = re.split(r'(\s+)', combined_text)
print(split_str)
10. 词云WordCloud
from collections import Counter
from wordcloud import WordCloud
import matplotlib.pyplot as plt
## 提取特定标签的文本,比如标签1
label = 4
texts_for_label = train_df[train_df['主题标签'] == label]['预处理访客问题']
## 将所有文本合并为一个字符串
combined_text = ' '.join(texts_for_label)
## 根据空格进行拆分
split_str = re.split(r'\s+', combined_text)
## 统计词频
word_counts = Counter(split_str)
## 输出最高频的关键词
print(word_counts.most_common(20))
## 生成词云
wordcloud = WordCloud(font_path='simhei.ttf', ## 设置字体为支持中文的字体
width=800,
height=400,
background_color='white').generate_from_frequencies(word_counts)
## 显示词云
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off') ## 不显示坐标轴
plt.show()
11. 格式化输出format()
在 Python中,format 方法是一种用于字符串格式化的强大工具。它允许你将变量或表达式插入到字符串中,并根据需要进行格式化。下面是对 format 方法的详细介绍
name = "John"
age = 30
message = "My name is {}, and I'm {} years old.".format(name, age)
message = "My name is {0}, and I'm {1} years old.".format(name, age)
print(message)
还可以使用格式化字符串%s
print('str1%s' % 'str2')
>> str1str2
## 意思是%作为一个替代,将后面的‘str2’字符串加到str1后面
12. time
12.1. 当前时间是一年的第几周
>>> from datetime import datetime
>>> datetime.now().isocalendar() ## 今年2018年;第26周; 周6; 今天2018年06月30日
(2018, 26, 6)
>>> datetime.now().isocalendar()[1] ## 索引为[1],就可以求出一年的第多少周
26
>>> datetime(2018,6,30).isocalendar()[1] ## 或者填好今天具体日期来获取第多少周
26
12.2. 时间戳格式转为str
from datetime import datetime
## 创建一个示例的日期时间对象
date_time_obj = datetime.now()
## 将日期时间对象转换为字符串
date_str = date_time_obj.strftime('%Y-%m-%d %H:%M:%S')
## 打印转换后的字符串
print(date_str)
13. pyODPS
MaxCompute是数据仓库,负责存储数据或对数据进行一系列的开发和运算。DataWorks为MaxCompute提供了可视化开发和节点流程管理等功能,结合MaxCompute完成一站式数据开发、数据治理等。pyODPS是maxcompute的接口,通过pyodps可以使用python脚本使用maxcompute。
14. os库
使用os在已经建立的文件夹中 在建立子文件夹。
os主要是5个函数os.getcwd()、os.path.basename、os.path.dirname、os.path.join、os.makedirs
import os
#### step1:获取当前脚本路径
path = os.path.basename(os.getcwd())
#### step2:上一级目录
floder_name = os.path.dirname(path)
## step3:合并路径
main_folder = 'path/to/your/folder' ## 替换为你的主文件夹路径
sub_folder = 'new_sub_folder'
sub_folder_path = os.path.join(main_folder, sub_folder)
## step4:合并路径创建子文件夹
os.makedirs(sub_folder_path, exist_ok=True)
print(f"子文件夹已创建: {sub_folder_path}")
若还需要再子文件夹的基础上,再建立新的二级子文件夹,该如何操作。
import os
## 定义主文件夹路径
main_folder = 'path/to/your/folder' ## 替换为你的主文件夹路径
sub_folder = 'new_sub_folder' ## 定义第一级子文件夹名称
second_sub_folder = 'new_second_sub_folder' ## 定义第二级子文件夹名称
## 组合路径并创建第一级子文件夹
sub_folder_path = os.path.join(main_folder, sub_folder)
os.makedirs(sub_folder_path, exist_ok=True)
## 在第一级子文件夹内创建第二级子文件夹
second_sub_folder_path = os.path.join(sub_folder_path, second_sub_folder)
os.makedirs(second_sub_folder_path, exist_ok=True)
print(f"子文件夹已创建: {second_sub_folder_path}")
15. datetime用法
from datetime import datetime
now = datetime.now()
#### strftime 时间转str
formatted_time = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted_time)
#### strptime str转时间
date_string = "2025-04-21 14:30:15"
datetime_object = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(datetime_object)
16. tqdm用法
from tqdm import tqdm
import time
## 创建一个简单的进度条
for i in tqdm(range(100)):
time.sleep(0.01) ## 模拟耗时操作
17. 虚拟环境迁移
17.1. 使用requirments.txt
pip freeze > requirements.txt
17.2. windows下的conda环境复制到linux环境
使用conda env export --no-build >env.yaml 命令用于将当前 Conda 环境导出为一个 YAML 文件,并排除构建信息。这个命令将当前环境的所有软件包及其依赖项写入 YAML 文件中,并删除构建相关的信息。因此,生成的 YAML 文件可以在不同操作系统、不同架构之间共享。
conda env create -f env.yaml
这将在 Linux 上创建一个名为 env 的新 Conda 环境,其中包含与 Windows 上相同版本的软件包
conda env create -f environment.yml
17.3. 使用conda-pack
pip install conda-pack
conda pack -n env_name
env_name 是 你需要移植的环境名
该命令会在你当前所在的目录产生一个环境包的压缩文件 env_name.tar.gz
首先在 /home/pc/anaconda3/envs/ 下新建mkdir一个文件夹 ,文件夹的名字就是压缩包的名称即可(当然也可以自定义一个新的名称)
然后使用以下命令解压环境压缩包到新建的文件夹中:
tar -xzf env_name.tar.gz -C ~/anaconda3/envs/env_name/
18. 跨文件调用脚本中的函数
A文件夹下的a脚本,调用B文件夹下的,C文件夹中的,c脚本里的add函数。应该如何操作?
import sys
import os
from pathlib import Path
## 获取当前脚本所在目录的父目录,即 project_root
current_folder_path = Path(__file__).resolve().parent.parent
b_folder_path = os.path.join(current_folder_path, 'B')
## 将 B 文件夹添加到 sys.path 中
if b_folder_path not in sys.path:
sys.path.append(b_folder_path)
## 从 C.c 中导入 add 函数
from C.testc import add
print(b_folder_path)

浙公网安备 33010602011771号