Loading

python中常用库以及用法

python中常用库以及用法

vscodez中Data wrangler插件强烈推荐。

1. 安装卸载换源

1.1. Anaconda彻底卸载及重安装

Anconda彻底卸载及重安装

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. 解决乱码

决策树可视化-Graphviz中文乱码问题

​ 先把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模块

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. 当前时间是一年的第几周

Python当前时间是一年中第几周

>>> 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。

pyodps教程

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)
posted @ 2025-06-27 18:37  system_T  阅读(15)  评论(0)    收藏  举报