吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2293|回复: 12
收起左侧

[求助] 新学python和pandas,写了一堆屎码,我自己都要吐了

[复制链接]
13832811375 发表于 2020-11-22 19:56
请大神们给出个主意,我在代码后面写了目前存在的问题。我闷头儿写了两天,现在能跑通,可进一步的实在没力气,也没知识储备了。

[Asm] 纯文本查看 复制代码
import pandas as pd
import numpy as np
import datetime
import os
import re

fn = '食堂窗口售卖表.xlsx'
df0 = pd.DataFrame()
rW0 = ['序号','入库时间','商品ID','商品名称','原库存','入库数量','新库存','商品价格','本次金额','库存金额','说明备注']
rW2 = ['序号','入库时间','商品ID','商品名称','入库数量','商品价格','本次金额','说明备注']

if fn in os.listdir(r'd:/Temp'):    #   把已经存在的库存文件数据交给df0,并设置好列标签。
    df0 = pd.read_excel('d:/Temp/食堂窗口售卖表.xlsx')  #   加“header=1”只是便于观察,并不能建立列索引
    # df.reindex(columns=rW0)             #   不但没有inplace=True参数,还不能改列标签,却又不报错。
    # df0 = pd.DataFrame(df, columns=rW0)     #   这样才真正改了列标签
else:       #   这几句的目的是如果是第一次运行,没有食堂窗口售卖表.xlsx的话,就创建个DataFrame数据供调用
    df1 = pd.DataFrame([rW0])       #   其实可能没有这个必要。既然还没有,那新生成的就自己做主
    df0 = pd.DataFrame(df1, columns=rW0)
    df0['新库存'] = 0

df0['原库存'] = df0['新库存']     #   中间数据,为了数据拼接时省事
df0['新库存'] = 0                 #   中间数据,为了数据拼接时省事
df0['入库数量'] = 0

def inpt(*x):   #   收集需输入的内容
    nW = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')  #
    iDn = rvw1(str(input('请扫描商品条码:').strip()))      #   自定义函数处理扫码,不足规定长度重新扫
    # txt.insert('end',iDn)             #   将有效扫码结果输出给窗体
    nM = rvw2(str(input('请输入商品名称:').strip()))      #    自定义函数去除空格和回车,限定输入长度
    cNt = int(rvw3(rvw2(input('请输入入库数量:').strip())))    #   自定义函数判断是否为整数
    pRc = rvw4(input('请输入商品价格:').strip().replace('。','.'))  #   判断是否有浮点数,消除简单失误
    # pRc = re.sub(r"[^\w\s\b]+", '.', pRc0)    #   正则处理错输的复杂符号错误,未成功
    aMnt = float(int(cNt) * pRc)                #   计算本次入库物品金额,需转为浮点数
    rMk = str(input('说明:'))                     #   对输入内容无限制
    rW3 = [nW, iDn, nM, cNt, pRc, aMnt, rMk]      #    将以上内容组成个列表
    return rW3

def rvw1(x):
    while len(x) != 3:
        print('扫码失败,请重新扫码!')
        x = str(input('请扫描商品条码:').strip())
    return x

def rvw2(x):
    while len(x) < 1:
        print('此处不能为空!')
        x = str(input('请重新输入:').strip())
    return x

def rvw3(x):
    while not x.isnumeric():
        print('入库数量应为整数,请敲回车并重新输入!')
        x = rvw2(input('请输入入库数量:').strip())
    return x

def rvw4(x):
    while bool(re.search(r'\d', x)) != 1:
        print('请输入整数或小数,注意小数点是英文半角的“.”,不是中文的“。”')
        return rvw4(input('请重新输入商品价格:').strip().replace('。','.'))

    flt = re.findall("(\d+)(\.*\d*)", x)
    if len(flt[0][1]) == 0:
        return int(flt[0][0])
    else:
        return float(x)

# def ipt():
i = 1
dTs = []
while i > 0:
    dTs.append(inpt())       #   将通过自定义函数审核的输入内容逐次添加到二维列表中
    dTs[i - 1].insert(0,i)   #   在每个列表元素(也是个列表)的头部插入序号,为变量i-1
    eN = rvw2(input('是否继续入库:').strip())     #   过滤掉空格和回车
    if str(eN[0]) in ['y', 'Y', '是']:       #   根据输入内容的第一个字符判断是否结束
        i += 1
    else:
        i = 0

# def sv():
df2 = pd.DataFrame(dTs,columns = rW2)     #   把所有输入转换成DataFrame数据体
df2['原库存'] = 0          #   在df2中,均为新输入,df2['原库存']均视为0。如有和df0中的重复项,将专门调整
df2['新库存'] = 0
df2['库存金额'] = 0
df2 = df2[rW0]      #   各列重新排序
df = pd.concat([df2,df0],axis=0,ignore_index=True)  #   数据还是要拼接,不拼接,库存数据无法继承
df['新库存'] = df['入库数量'] + df['原库存']
df['库存金额'] = df['商品价格'] * df['新库存']  #   df2[df2['商品单价'] * df2['新库存']]会是啥?
# # df=df[df.groupby('商品ID')['新库存'].sum]    #   想得太简单,groupby还是不太会用
# # # df0.to_excel('d:/Temp/食堂窗口售卖表.xlsx',index=False,columns=False)
# # # df0.to_excel('d:/Temp/食堂窗口售卖表.xlsx',columns=False)    #   columns=True也不行,没这参数
df.to_excel('d:/Temp/食堂窗口售卖表.xlsx',index=False)

'''
目前问题:
    1、退出机制应该设计成按以“y”、“Y”、“是”开头儿的字符串即继续,按“n”、“N”、“不”开头儿的字符串退出,其它字符询问;
    2、当次输入有重值未解决;groupby还没学会。
    3、当次输入与原库存有相同项未解决;
    4、语音提示未解决;
    5、图形化鼠标操作未解决。
'''

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
ryg2080 + 1 + 1 用心讨论,共获提升!

查看全部评分

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

 楼主| 13832811375 发表于 2020-11-22 20:03
class类、面向对象编程、装饰器。。。。这都什么和什么啊?pandas也搞不明白,按groupby聚合的内容提取不出来。。。。我要休息一下了,偏头疼
1024987247 发表于 2020-11-22 20:06
ly9458216 发表于 2020-11-22 20:14
霞霞1212 发表于 2020-11-22 20:19
用python操作数据的读取么
培尔金特 发表于 2020-11-22 20:31
1.不是很简单的多分支判断吗?我看你在代码里已经实现了一大半了啊。还是说你不知道elif语句?就算不知道,直接嵌套一层if也可以啊?
2、3没大看懂你的需求
4.要用到第三方库,自己百度
5.也要第三方库,不过如果你只是自己用没有用户的话,其实图形界面没什么必要
dork 发表于 2020-11-22 20:50
确实思路可以再改变一下
头像被屏蔽
cnzb 发表于 2020-11-22 21:25
提示: 作者被禁止或删除 内容自动屏蔽
ryg2080 发表于 2020-11-22 22:02
你这样搞也不怕CPU挂喽
 楼主| 13832811375 发表于 2020-11-23 08:15
培尔金特 发表于 2020-11-22 20:31
1.不是很简单的多分支判断吗?我看你在代码里已经实现了一大半了啊。还是说你不知道elif语句?就算不知道, ...

昨天晚上想了想,确实如你所说。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-26 10:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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