python,我去,PyCharm老是有不知道原因的警告,求解决方法
我去,PyCharm老是有不知道原因的警告,求解决方法(是符合pep8的规范写法,不是屏蔽警告)。告警内容:
应为类型 'function',但得到的是 '(x: Any) -> Any'
应为类型 'function',但得到的是 '(x: Any) -> str'
应为类型 'function',但得到的是 '(x: Any) -> Union'
应为类型 'function',但得到的是 '(x: Any) -> Union'
完整代码:
import os
# import re
# import datetime
# import numpy as np
# import jinja2
from collections import Counter
import pandas as pd
# from openpyxl import Workbook
from openpyxl import load_workbook
import warnings
# 忽略告警
warnings.filterwarnings("ignore")
# ######基础变量######
# 声明源数据路径
str_path_source_data = 'D:\\python\\playSignIn'
# 区域网格字典
dict_regions_grids = {'茂南': ['开发区', '茂北', '西城', '油城北', '油城东', '油城南'],
'电白': ['滨海', '林头', '麻岗', '南海', '沙琅', '水东'],
'高州': ['大井', '高城北', '高城南', '根子', '石鼓', '长坡'],
'化州': ['合江', '河东', '化北', '化河西', '同庆', '杨梅'],
'信宜': ['北界', '城北', '城南', '合水', '钱排', '朱砂']}
# ######函数######
# 获得人员分类
def func_get_class(x):
if '质控' in x:
return '质控人员'
elif '线路班' in x:
return '机动队人员'
else:
return '装维人员'
# 获得人员部门
def func_get_department(x):
if x['分类'] == '质控人员':
return '质控组'
elif '自建自维' in x['所属组织']:
return '自建自维'
else:
for str_region in dict_regions_grids:
if str_region in str(x):
return str_region
return '未知'
# 获得人员班组
def func_get_group(x):
if x['分类'] == '质控人员':
if x['姓名'] in dict_qc_personnel:
return dict_qc_personnel]
else:
return '未知'
elif x['分类'] == '机动队人员':
return '机动队'
elif x['部门'] == '自建自维':
return '自建自维组'
else:
for str_region in dict_regions_grids:
if str_region == str(x['部门']):
for str_grid in dict_regions_grids:
if str_grid in str(x['所属组织']):
return str_grid
# 获得签到天数
def func_sign_in_Days(x):
if x['姓名'] in dict_sign_in_days:
return dict_sign_in_days]
else:
return 0
# ######输入源数据######
# 获得源数据文件夹的全部文件名称
list_dir = os.listdir(str_path_source_data)
str_personnel = 0
str_sign_in = 0
str_qc_personnel = 0
# 循环文件
for str_file in list_dir:
if os.path.isfile(str_path_source_data + '\\' + str_file):
if '系统人员' in str_file:
str_personnel = str_file
elif '签到' in str_file:
str_sign_in = str_file
elif '质控人员' in str_file:
str_qc_personnel = str_file
# 判断文件是否存在,如果不存在,则提示错误并退出
if 'str_personnel' not in locals().keys():
print('[错误] 未找到文件名包含“系统人员”关键字的系统人员表')
exit()
elif 'str_sign_in' not in locals().keys():
print('[错误] 未找到文件名包含“签到”关键字的签到记录表')
exit()
elif 'str_qc_personnel' not in locals().keys():
print('[错误] 未找到文件名包含“质控人员”关键字的质控人员表')
exit()
# ===输入质控人员源数据===
print('[操作] 处理质控人员数据')
# 输入调研用户数据
xlsx_qc_personnel = load_workbook(str_path_source_data + '\\' + str_qc_personnel, read_only=False)
sheet_qc_personnel = xlsx_qc_personnel.active
# 转换为DataFrame
df_qc_personnel = pd.DataFrame(sheet_qc_personnel.values)
# 设置字段名
df_qc_personnel.columns = df_qc_personnel.iloc
df_qc_personnel = df_qc_personnel.drop(0)
# 清洗无效行
df_qc_personnel = df_qc_personnel.drop(df_qc_personnel)].index)
# 创建质控人员字典
dict_qc_personnel = {}
for n in range(df_qc_personnel.shape):
dict_qc_personnel] = df_qc_personnel['小组']
# ===输入签到源数据===
print('[操作] 处理签到数据')
# 输入调研用户数据
xlsx_sign_in = load_workbook(str_path_source_data + '\\' + str_sign_in, read_only=False)
sheet_sign_in = xlsx_sign_in.active
# 转换为DataFrame
df_sign_in = pd.DataFrame(sheet_sign_in.values)
# 设置字段名
df_sign_in.columns = df_sign_in.iloc
df_sign_in = df_sign_in.drop(0)
# 格式化日期
df_sign_in['打卡时间'] = pd.to_datetime(df_sign_in['打卡时间'])
# 新增[签到日期]列
df_sign_in['签到日期'] = df_sign_in.apply(lambda x: x['打卡时间'].strftime("%Y年%m月%d日"), axis=1)
# 获取关键字段,参加一个新DataFrame
df_sign_in_drop_duplicates = df_sign_in.loc[:, ['姓名', '签到日期']]
# 去重
df_sign_in_drop_duplicates = df_sign_in_drop_duplicates.drop_duplicates()
# 创建人员签到天数字典
dict_sign_in_days = dict(Counter(df_sign_in_drop_duplicates['姓名']))
# ===输入系统人员源数据===
print('[操作] 处理系统人员数据')
# 输入调研用户数据
xlsx_personnel = load_workbook(str_path_source_data + '\\' + str_personnel, read_only=False)
sheet_personnel = xlsx_personnel.active
# 转换为DataFrame
df_personnel = pd.DataFrame(sheet_personnel.values)
# 设置字段名
df_personnel.columns = df_personnel.iloc
df_personnel = df_personnel.drop(0)
# 清洗非家客人员
df_personnel = df_personnel.drop(df_personnel[~df_personnel['所属组织'].str.contains('家客')].index)
# 清洗离职人员
df_personnel = df_personnel.drop(df_personnel == '离职'].index)
# 获得人员分类
df_personnel['分类'] = df_personnel['所属组织'].apply(lambda x: func_get_class(x))
# 获得人员用工形式
df_personnel['用工形式'] = df_personnel['所属组织'].apply(lambda x: '兼职' if '支援' in x else '全职')
# 获得人员部门
df_personnel['部门'] = df_personnel.apply(lambda x: func_get_department(x), axis=1)
# 获得人员班组
df_personnel['班组'] = df_personnel.apply(lambda x: func_get_group(x), axis=1)
# 获得人员签到天数
df_personnel['签到天数'] = df_personnel.apply(lambda x: func_sign_in_Days(x), axis=1)
# 重置索引(index)
df_personnel = df_personnel.reset_index(drop=True)
# =====输出Excel文件=====
print('[操作] 输出Excel通报表')
# =====输出Excel文件=====
# 定义通报文件名
xlsx_notification = "通报.xlsx"
# 复制文件
os.popen('copy 通报模板.xlsx ' + xlsx_notification).read()
# 打开文件
bookResult = load_workbook(xlsx_notification)
# 删除原有数据
del bookResult['代维系统人员']
del bookResult['签到系统记录']
del bookResult['签到去重记录']
# 重命名通报标题
bookResult['通报']['B2'] = "阶段在途及归档情况通报"
print("[操作] 输出EXCEL文件")
writer = pd.ExcelWriter(xlsx_notification, engine='openpyxl')
writer.book = bookResult
df_personnel.to_excel(writer, sheet_name='代维系统人员', index=False)
df_sign_in.to_excel(writer, sheet_name='签到系统记录', index=False)
df_sign_in_drop_duplicates.to_excel(writer, sheet_name='签到去重记录', index=False)
writer.save()
writer.close()
lambda写的不规范吧,你看看错的几行都是lambda 本帖最后由 firstharbor 于 2021-1-18 09:11 编辑
晕,复制下来运行还有数据类型报错:
[操作] 处理质控人员数据
Traceback (most recent call last):
File "F:/Program Files/python/1.py", line 111, in <module>
xlsx_qc_personnel = load_workbook(str_path_source_data + '\\' + str_qc_personnel, read_only=False)
TypeError: must be str, not int
好吧,好像是因为我指定目录没文件,我调试下 lambda 函数包含的表达式好像不能超过1个 不建议使用lambda 4楼正解。 144行改成这个试试
df_sign_in['签到日期'] = df_sign_in['打卡时间'].apply(lambda x: x.strftime("%Y年%m月%d日"))
其他问题不懂了,等大神解答。
自己的理解,lambda 函数调用的是确定的值没有问题,在调用函数的话就会报错。
先把各函数运行之后的结果,添加到一列,然后在lambda 函数调用这个列的值。
个人理解,仅供参考。 firstharbor 发表于 2021-1-18 09:06
lambda 函数包含的表达式好像不能超过1个
应该怎么改,可否具体指教一下,谢谢。 xmy00000 发表于 2021-1-18 09:09
不建议使用lambda
应该怎么改,可否具体指教一下,谢谢。 本帖最后由 cqwcns 于 2021-1-18 17:08 编辑
我发现这样写就不告警了,不影响功能实现。
但不知道这样写是否规范,或者有没有更好的写法。
# 获得人员部门
df_personnel['部门'] = df_personnel[['所属组织', '分类']].apply(func_get_department, axis=1)
# 获得人员班组
df_personnel['班组'] = df_personnel[['分类', '姓名', '部门', '所属组织']].apply(func_get_group, axis=1)
# 获得人员签到天数
df_personnel['签到天数'] = df_personnel[['姓名']].apply(func_sign_in_Days, axis=1)
页:
[1]
2