吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3217|回复: 10
收起左侧

[求助] python,我去,PyCharm老是有不知道原因的警告,求解决方法

[复制链接]
cqwcns 发表于 2021-1-18 08:26
我去,PyCharm老是有不知道原因的警告,求解决方法(是符合pep8的规范写法,不是屏蔽警告)。

告警内容:
应为类型 'function',但得到的是 '(x: Any) -> Any'
应为类型 'function',但得到的是 '(x: Any) -> str'
应为类型 'function',但得到的是 '(x: Any) -> Union[str, Any]'
应为类型 'function',但得到的是 '(x: Any) -> Union[int, Any]'
210118082108.png

完整代码:
[Python] 纯文本查看 复制代码
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[x['姓名']]
        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[str_region]:
                    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[x['姓名']]
    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[0]
df_qc_personnel = df_qc_personnel.drop(0)

# 清洗无效行
df_qc_personnel = df_qc_personnel.drop(df_qc_personnel[pd.isnull(df_qc_personnel['姓名'])].index)

# 创建质控人员字典
dict_qc_personnel = {}
for n in range(df_qc_personnel.shape[0]):
    dict_qc_personnel[df_qc_personnel['姓名'][n + 1]] = df_qc_personnel['小组'][n + 1]

# ===输入签到源数据===
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[0]
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[0]
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[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()



免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
chensweet + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

chen4321 发表于 2021-1-18 08:33
lambda写的不规范吧,你看看错的几行都是lambda
firstharbor 发表于 2021-1-18 08:59
本帖最后由 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
好吧,好像是因为我指定目录没文件,我调试下
firstharbor 发表于 2021-1-18 09:06
xmy00000 发表于 2021-1-18 09:09
不建议使用lambda
lvcaolhx 发表于 2021-1-18 09:32
4楼正解。
andrew2018 发表于 2021-1-18 10:23
144行改成这个试试
df_sign_in['签到日期'] = df_sign_in['打卡时间'].apply(lambda x: x.strftime("%Y年%m月%d日"))

其他问题不懂了,等大神解答。
自己的理解,lambda 函数调用的是确定的值没有问题,在调用函数的话就会报错。
先把各函数运行之后的结果,添加到一列,然后在lambda 函数调用这个列的值。
个人理解,仅供参考。
 楼主| cqwcns 发表于 2021-1-18 14:56
firstharbor 发表于 2021-1-18 09:06
lambda 函数包含的表达式好像不能超过1个

应该怎么改,可否具体指教一下,谢谢。
 楼主| cqwcns 发表于 2021-1-18 14:57

应该怎么改,可否具体指教一下,谢谢。
 楼主| cqwcns 发表于 2021-1-18 17:06
本帖最后由 cqwcns 于 2021-1-18 17:08 编辑

我发现这样写就不告警了,不影响功能实现。
但不知道这样写是否规范,或者有没有更好的写法。


[Python] 纯文本查看 复制代码
# 获得人员部门
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)
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 04:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表