写了 2 天的 Python ,有点奇怪的感觉。。。

225 天前
 woodytang

听说 pandas 很好用,于是决定试一下

目的是这样的: user, amount, datetime A 10 2021-02-12 10:00:00 A 20 2021-03-12 10:00:00 B 30 2021-05-12 10:00:00 B 10 2021-06-12 10:00:00 C 5 2021-05-12 10:00:00 C 10 2021-06-12 10:00:00 C 20 2021-06-12 10:00:00 这是我们常见的数据库的表

最后要做成这样的效果 2021-02 2021-03 2021-05 2021-06 A 10 20 0 0 B 0 0 30 10 C 0 0 5 30


首先我想问一下,这样的需求,大家首先会想到用什么方案(语言,框架,库)做?

column_names = [desc[0] for desc in cursor.description] df = pd.DataFrame(rows, columns=column_names) df['datetime'] = pd.to_datetime(df['datetime']) df['归属年月'] =(df['datetime'].dt.year.astype(str)+ df['datetime'].dt.strftime('%m').astype(str)).astype(int)

到这里把时间字段理好了,变成数字,让它可以排序

grouped_data = df.groupby(['user', '归属年月'])['amount'].sum().reset_index() grouped_data = grouped_data.sort_values('归属年月') 来个二维分组,然后按照‘2021-05’这个来排序一下

df_pivot = pd.pivot_table(grouped_data, index=['user'], columns='归属年月', values='amount', aggfunc='sum').reset_index().fillna(0)

到这里就好了

代码十分简洁,但是这种代码真的有可读性吗?好维护吗?

如果我要算 A 用户所有金额汇总,可以这样写: df_pivot['余额'] = df_pivot.iloc[:, 1:].sum(axis=1)

这个= 让我震惊了,明明执行了函数操作,看上去像是一个赋值操作,这个 python 是怎么实现的?

我编辑器用的 vsc ,python 没有 type hint ,这个有解吗,难道一边写要一边查文档?

还有元组的简写法

a= 1,2,3

看到这个我也是懵了

有没有 pythoner 解答一下,这个语言真的适合写正经项目吗?


js 有 ts 就变得完美了,我很喜欢 python 的生态,有什么可以愉快写 python 的办法?

4484 次点击
所在节点    程序员
33 条回复
cmdOptionKana
225 天前
老生常谈了,越灵活的语言,越需要团队自己制定规范,否则很难维护。

以前 IDE 比较落后,Python 之类的动态语言很方便,但现在 IDE 先进了,优势就来到静态语言这边。

你可以想象一下(或者试一下),用记事本去写代码,你一定会更喜欢 Python 。可惜时代变了,Python 在现代确实没有特别优势。
woodytang
225 天前
我昨天用了一下 python 的 fast-api, 这个设计得真好,,但是我对 python 没信心,用 python 做大项目的感觉是怎样的?
woodytang
225 天前
另外很多 ai 的库都用 python 写的,听说很多搞 AI 的人都不怎么会编程,所以搞得效率很低下,是真的吗?
june4
225 天前
我虽然之前写了很多 python,但现在我更喜欢 js/ts 。js 保持了很好的语言简洁性/可读性/灵活性的平衡,ruby 简直可怕,python 搞得越来越复杂,但写起来体验不如 js
cmdOptionKana
225 天前
@woodytang 用 python 还是做小项目比较合适,大项目看团队擅长语言。

AI 领域 python 只是作为胶水语言而已,涉及性能的部分都是 C++之类的去实现,python 调用。
woodytang
225 天前
js 是在这些老 语言里面,一个沙盒脚本语言,感觉设计很合理的了,有 ts 后,感觉非常和谐,但是生态大多都是界面交互一类的,没啥意思,
python 功能强大多了,但是这个写起来蛋疼,可能是我不懂的缘故
FYFX
225 天前
好久没用过 pandas 了,不过感觉你这是写法问题。。。
而且我记得 pandas 的里面坑挺多的,不过听说好像[Polars]( https://docs.pola.rs/) 不错?
Donahue
224 天前
python 有 type hint 的, 类型注解啊
比如 a:int = 10,
def add(a:int, b:int) -> int:
跟 ts 差不多
mumbler
224 天前
python 正经项目还少吗
flyqie
224 天前
@cmdOptionKana #1

静态语言确实好维护,但有些需求不太需要特别好的维护性,追求速度的话,这样就很合适。

原型我一般会尽可能用动态语言写,但上线肯定还是静态语言优先。
fatigue
224 天前
你懵是因为你用的少见得少,习惯了就好了,可读性是建立在大家都有基本共识的前提下的,你用上一年你就觉得太顺手了
musi
224 天前
@woodytang js 生态在 ai 后端都有吧,虽然 npm 设计的有问题,但是 npm 生态是一点都不弱啊
sunzhuo
224 天前
python 不觉得容易,就是因为库多而已
zhzy
224 天前
1. 可能还是不熟悉吧, 首先那一大堆生成归属年月的代码其实直接格式化成字符串就行了, groupby 和 pivot_table 都是支持字符串的, 而且你也不需要先 groupby 再 pivot_table.



2. 至于 df_pivot['余额'] = df_pivot.iloc[:, 1:].sum(axis=1), 不就是把 sum 函数的返回值赋值给余额那一列么. 只是说它帮你处理了一下, 如果不存在这一列的话就新创建一列. 具体来说这是一个语法糖, 在类的 __setitem__ 方法里实现.

3. Python 有 type hint. 3.6 就有了, 不过要到好用的程度的话至少要到 3.9 和 3.10 吧.

4. 不要这样创建元组. 格式化工具会帮你加上括号的. 这个地方确实容易踩坑, 特别是只有一个元素的时候. 我是这样理解的, 在 Python 里 tuple 实际上是逗号定义而不是括号定义的.



5. 如果你是团队的话, 是会有规范的. 至于正经项目怎么说呢, 要写肯定能写, 毕竟 Instagram 也在用 (虽然是魔改的). 而且所有的语言都或多或少有一些黑魔法, 为了工程化不用就是了. 真要变成 Go 那样说实话有的时候也挺难受的.
xingfa
224 天前
NoOneNoBody
224 天前
主要是你不懂 pandas/numpy ,所以觉得难读,用惯了的人,一眼就看得懂

1. df_pivot['余额'] = df_pivot.iloc[:, 1:].sum(axis=1)
这个确实是赋值,是整列批量赋值,用的是向量化函数,当数据量很大时,你就知道向量化计算的作用了
没有向量化函数,都不知道要写多少个 for

2. 可读性问题
在 pandas 的计算,一般不会太考究如何实现计算,更重视的是输入输出格式,以及值的类型和逻辑准确性,以及性能
因为 pandas 一般都是处理大量数据的,很难逐个值考究,只要保证格式、类型、逻辑准确性
例如有三百个白色乒乓球要变成红色,原生写法是逐个刷红色,pandas/numpy 是全部扔进红色颜料池,搅匀后捞上来就是了。所以需要搞清楚的是:扔进去的是否乒乓球、是否白色、多少个,颜料是否红色,池子是否容得下,以及捞起来后乒乓球有没有破损,数量够不够……至于中间如何染色搅匀,就只能相信这个操作搅匀的机器不会打烂乒乓球了
所以最好是函数加上 __doc__描述,便于以后查阅

np.lib.stride_tricks.as_strided(s, (len(s) - (window - 1), window), (s.values.strides * 2))
这句我从别人那里抄过来的,至今都没搞清其中原理,但我知道 numpy 模拟实现 pandas.rolling 需要用到这句,且值和 pandas.roolling 的结果一致,这就够了

numpy 和 pandas 的手册很庞大,个人读不完,就算读完了也记不全,目前最好方案是借助 gpt 帮我查某个函数的意义

3.你这段代码并没有“规律时间序”,目的只是 groupby 分组,其实没必要用时间函数那么复杂,直接按字符串提取前 7 个字符,再 groupby 就可以了

vsc 有支持 hint 的扩展,如 pyright ,但如果代码没有写指定类型,也是按默认类型提示,所以想全程提示,需要自己在代码中指定 types hint
vituralfuture
224 天前
元组一定要加括号,千万别省,可以配置格式化工具,每次格式化自动加上。
曾经在某行赋值语句末尾不小心按了逗号按键,刚好位置比较边缘,debug 半天,最后发现怎么值是个元组,才发现是这种无聊的原因
Jirajine
224 天前
R with tidyverse https://www.tidyverse.org/
这实质上是一个专为 dataframe 设计的基于 R 的 dsl ,可以说是单独这类需求理论上最适合的工具。
如果是一般语言的话,julia 也是非常适合数据分析的。
YsHaNg
224 天前
pandas/numpy 都算是 array oriented 类似的还有 Matlab 觉得懵你要不看看 apl
arischow
224 天前
你都这么想了,那肯定是不合适,用 Java 重写啦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1027882

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX