duangsuse::Echo
716 subscribers
4.25K photos
130 videos
583 files
6.47K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
https://github.com/duangsuse-valid-projects/pr.py #github 一瞬结案
如果以后再继续,我肯定会选择支持直接匹配词类队列… 来删除掉不合适的组合和添加合适的词
以及提供基于句式学习的方法
duangsuse::Echo
https://github.com/duangsuse-valid-projects/pr.py #github 一瞬结案 如果以后再继续,我肯定会选择支持直接匹配词类队列… 来删除掉不合适的组合和添加合适的词 以及提供基于句式学习的方法
直播统计数据(Mean均值、50% 中位 的 Rect 和 Pie、总分的 Scatter1D、文/数、文/英的 Scatter2D)。 #Python #data

首先准备混淆处理人名,当然这个混淆不能保证最终的人名包含与原来不一样的字符
hancs = <<EOBJX
赵钱孙李周吴郑王…
EOBJX
hancs = hancs.lines.map(&:strip).join.chars


require 'csv'
scsv = CSV.open('周测8成绩.csv')
scsv.seek(0)
stud = scsv.read()
puts stud[0].join("\t")
stud = [stud[0]]+stud[1..-1].map { |rs| rs.each_with_index.map { |c, i| if i == 0 then (c.chars+hancs.sample(2)).sort.join[1..3] else c.to_i end } }


然后可以导出给 Python 了……

File.write('stat.csv', stud.map { |row| row.join(",") }.join("\n"))

姓名 语文1 语文2 英语1 英语2 英语3 英语4 数学 总分 周测8名次

from pandas import DataFrame
import pandas as pd
d=pd.read_csv('stat.csv')
因为名次是影响排行的,所以直接整合到表的 order 里即可
d.sort_values('周测8名次', ascending=True)
del d['周测8名次']
首先是平均分的 plot

>>> d.describe()
语文1 语文2 英语1 英语2 英语3 英语4 数学 总分
count 36.000000 36.000000 36.000000 36.000000 36.000000 36.000000 36.000000 36.000000
mean 46.083333 22.750000 96.888889 93.583333 112.083333 113.250000 86.527778 571.166667
std 2.771024 4.170474 4.055175 6.682066 19.824047 5.405685 12.847426 39.028561
min 35.000000 13.000000 83.000000 71.000000 0.000000 96.000000 47.000000 451.000000
25% 45.000000 19.750000 95.000000 91.250000 112.000000 112.000000 80.500000 557.500000
50% 47.000000 23.000000 98.000000 96.000000 117.000000 115.000000 91.000000 578.500000
75% 47.250000 27.000000 100.000000 98.000000 119.000000 117.000000 97.000000 599.250000
max 50.000000 29.000000 100.000000 105.000000 120.000000 120.000000 100.000000 616.000000
>>> d.head(3)
姓名 语文1 语文2 英语1 英语2 英语3 英语4 数学 总分
李煜胡 50 28 100 99 120 119 100 616
文王王 49 29 100 98 120 118 98 612
悦祺郑 47 29 99 98 119 119 100 611

……pandas 的人真是连动态规划都不会写,其实也不必要动态规划,
但是 matplotlib 的维护文档感觉很齐全,可配置性也很高,不过我还是通过搜索(而不是通过跟踪 GitHub 上的源代码)找到了设置中文字体的答案……

然后可以打开 IPython 了

import matplotlib as mp
import matplotlib.pyplot as p
mp.rcParams['font.family'] = 'WenQuanYi Zen Hei'
p.plot(d) # 测试一下……
d.plot(title='成绩折线图')

我感觉我的智商受到了侮辱,虽然它本身也没有高到哪里去……
所以要统计好数据必须把很多图做在一个图表里

一种情况是直接画在一个座标系,一种是放子图表……
就像这样,统计的对象是科目分值、集合是班级、x 轴是人(按照排名升序),其中总分是所有科目的 sum
其实本来不同的数据统计应该放不同的图表的…… Sum 和本来的 items 放一起很奇怪
Pandas 的快速 matplotlib 图表真是方便啊…… d.hist()
还能算点积… (reversed product) 🤔 argmin, argmax 是什么,cum 又是什么…
还能算单调性… is_monotonic
z.is_monotonic_decreasing (forall x0, x1. x0 < x1 => y(x0) < y(x1))
duangsuse::Echo
还能算点积… (reversed product) 🤔 argmin, argmax 是什么,cum 又是什么… 还能算单调性… is_monotonic z.is_monotonic_decreasing (forall x0, x1. x0 < x1 => y(x0) < y(x1))
虽然不会 matplotlib 和 pandas,也不会统计…… 首先看看平均分和中位数的 Pie/Rect(hist)

位值 = DataFrame()
位值['最大'] = d.max()
位值['中间'] = d.median()
位值['最小'] = d.min()
del 位值[位值['姓名']] # 不成!
位值 = 位值.aggregate(lambda xs: xs[1:-1]) # 绝望使用 修剪 seris

均值 = d.mean()
全班 = d.sum()


dt = DataFrame()
for col in 位值.columns:
dt[col] = 位值[col]
dt['平均'] = 均值
dt.plot(title='成绩概况')

然后是总分的一维分布图、语文/英语 文科/数学 的二维分布情况

语文=d['语文1']+d['语文2']
英语 = d['英语1']
for 号 in range(2,4):
英语 += d['英语'+str(号)]
数学 = d.数学


当然也可以使用 boxplot 什么的 🤔 居然还可以算 diff… 这样可以直接一些,不用把两个对象放一张图上比较看
kurt 是什么,d.melt() 好像是平铺的版本,d.stack() 是每个对象的元组
还可以用 aggerate, combine, groupby 什么的常用操作符
当然要减去就麻烦一点了

雷人的中文命名,不过没关系
s=d.stack()
(s['李煜胡'] - s['子王蒋']).plot(title='第一名和倒数第二的差距')
(刻意点名道姓)
折线
能拟合吧
平均, 中间 = d.mean(), d.median()
def pieOf(ser, *fps, **kwps):
return p.pie(ser, *fps, **kwps, labels=ser.index)

总分的 pie
zp = d.sum()
del zp['姓名'], zp['总分']
zp = zp.astype(int)
https://matplotlib.org/3.1.1/gallery/pyplots/pyplot_two_subplots.html#sphx-glr-gallery-pyplots-pyplot-two-subplots-py
https://matplotlib.org/3.1.1/gallery/subplots_axes_and_figures/align_labels_demo.html#sphx-glr-gallery-subplots-axes-and-figures-align-labels-demo-py

import numpy as n
import matplotlib.pyplot as p

def f(x): return n.cos(2* x*n.pi) *n.exp(-x)

xs0 = n.arange(0.0, 5.0, 0.1)
xs1 = n.arange(0.0, 5.0, 0.02)


p.figure()
p.subplot(211) # 2, r, c, ....
p.plot(xs0, f(xs0), marker='o', color='tab:blue')
p.plot(xs1, f(xs1), color='tab:red')

p.subplot(212)
p.plot(xs1, 2* xs1*n.pi, linestyle='--', color='tab:green')
p.show()
终于知道怎么画子图了……
语 = DataFrame()
语['A'] = d['语文1']
语['B'] = d['语文2']
外 = DataFrame()
for 号 in range(1,4):
外[chr(ord('A')+号)] = d['英语'+str(号)]
p.figure()
p.subplot(311)
pieOf(语.mean())
p.subplot(321)
pieOf(语.median())
p.subplot(331)
pieOf(语.sum())
🤔 发现不能这么用……
居然可以这么玩,xkcd 配置
IPython 真是太舒服了
过于生艹,Pie 和 bars 是失败了,而且我也不知道该放啥… 好像是全科成绩才对
艹 = DataFrame() # 其实本来用 Serie 就够了……
艹['外'] = [外.mean().mean()]
艹['语'] = [(语.A + 语.B).mean()]
艹['数'] = [d.数学.mean()]
pieOf(艹.sum())
XKCB 风格的 boxplot, hist, plot,我们可以看到,其实数学才是学生在竞争中失利最大的黑手!我们要好好…… 补习数学(绝望