2018-12-23 15:00:54 yanghenpi 阅读数 113
  • Python数据挖掘实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 Python数据挖掘技术系列视频培训教程基于真实数据集进行案例实战,使用Python数据科学库从数据预处理开始一步步进行数据建模。对于每个案例首先进行流程解读与数据分析,建立特征工程,详细解读其中每一步原理与应用。该课程共有十一大章节,88课时,从泰坦尼克号获救预测进行数据分析作为第一章节,后边依次是用户画像、Xgboost实战、京东用户购买意向预测、Kaggle数据科学调查、房价预测、论文与BenchMark的意义、Python实现音乐推荐系统、fbprophet时间序列预测、用电敏感客户分类、数据特征。

    4693 人正在学习 去看看 唐宇迪

SQLyog 导出表中数据存为csv文件

  1.     选择数据库表 --> 右击属性 --> 备份/导出 --> 导出表数据作为 --> 选择cvs --> 选择下面的更改” --> 字段 --> 可变长度--> 字段终止与 -->输入逗号,(这是重点,否则导出的csv文件内容都在一列中,而不是分字段分列)
    下面两个选项框取消。

2.导出csv文件后,使用UE编辑器或者记事本打开,另存为,选择编码为utf-8格式,保存。

3.打开csv文件,这样中文为正确的显示,如果不转码保存的话,为中文乱码。

SQLyog csv文件数据导入mysql表中

1.      将数据文件存为csv文件,保存的时候选择逗号(\t)作为分隔符;

2.    选择数据库表 --> 导入 --> 导入本地可使用的CSV数据 --> 从文件导入,选择刚刚的csv文件,导入完成。

3.    选择cvs --> 选择下面的更改” --> 字段 --> 可变长度--> 字段终止与 -->输入逗号,(这是重点,否则导入的csv文件内容都在一列中,而不是分字段分列)
下面两个选项框取消。

Python Pandas处理亿级数据

  • 硬件环境
    • CPU:3.5 GHz Intel Core i7
    • 内存:32 GB HDDR 3 1600 MHz
    • 硬盘:3 TB Fusion Drive
    •  
  • 数据分析工具
    • Python:2.7.6
    • Pandas:0.15.0
    • IPython notebook:2.0.0
    •  

源数据如下表所示:

 

Table

Size

Desc

ServiceLogs

98,706,832 rows x 14 columns

8.77 GB

交易日志数据,每个交易会话可以有多条交易

ServiceCodes

286 rows × 8 columns

20 KB

交易分类的字典表

数据读取

启动IPython notebook,加载pylab环境:

ipython notebook --pylab=inline

1

ipython notebook --pylab=inline

Pandas提供了IO工具可以将大文件分块读取,测试了一下性能,完整加载9800万条数据也只需要263秒左右,还是相当不错了。

import pandas as pd reader = pd.read_csv('data/servicelogs', iterator=True) try: df = reader.get_chunk(100000000) except StopIteration: print "Iteration is stopped."

1

2

3

4

5

6

import pandas as pd

reader = pd.read_csv('data/servicelogs', iterator=True)

try:

    df = reader.get_chunk(100000000)

except StopIteration:

    print "Iteration is stopped."

 

 

1百万条

1千万条

1亿条

ServiceLogs

1 s

17 s

263 s

使用不同分块大小来读取再调用 pandas.concat 连接DataFramechunkSize设置在1000万条左右速度优化比较明显。

loop = True chunkSize = 100000 chunks = [] while loop: try: chunk = reader.get_chunk(chunkSize) chunks.append(chunk) except StopIteration: loop = False print "Iteration is stopped." df = pd.concat(chunks, ignore_index=True)

1

2

3

4

5

6

7

8

9

10

11

loop = True

chunkSize = 100000

chunks = []

while loop:

    try:

        chunk = reader.get_chunk(chunkSize)

        chunks.append(chunk)

    except StopIteration:

        loop = False

        print "Iteration is stopped."

df = pd.concat(chunks, ignore_index=True)

下面是统计数据,Read Time是数据读取时间,Total Time是读取和Pandas进行concat操作的时间,根据数据总量来看,对5~50DataFrame对象进行合并,性能表现比较好。

Chunk Size

Read Time (s)

Total Time (s)

Performance

100,000

224.418173

261.358521

 

200,000

232.076794

256.674154

 

1,000,000

213.128481

234.934142

√ √

2,000,000

208.410618

230.006299

√ √ √

5,000,000

209.460829

230.939319

√ √ √

10,000,000

207.082081

228.135672

√ √ √ √

20,000,000

209.628596

230.775713

√ √ √

50,000,000

222.910643

242.405967

 

100,000,000

263.574246

263.574246

 

如果使用Spark提供的Python Shell,同样编写Pandas加载数据,时间会短25秒左右,看来SparkPython的内存使用都有优化。

数据清洗

Pandas提供了 DataFrame.describe 方法查看数据摘要,包括数据查看(默认共输出首尾60行数据)和行列统计。由于源数据通常包含一些空值甚至空列,会影响数据分析的时间和效率,在预览了数据摘要后,需要对这些无效数据进行处理。

首先调用 DataFrame.isnull() 方法查看数据表中哪些为空值,与它相反的方法是 DataFrame.notnull() Pandas会将表中所有数据进行null计算,以True/False作为结果进行填充,如下图所示:

Pandas的非空计算速度很快,9800万数据也只需要28.7秒。得到初步信息之后,可以对表中空列进行移除操作。尝试了按列名依次计算获取非空列,和 DataFrame.dropna() 两种方式,时间分别为367.0秒和345.3秒,但检查时发现 dropna() 之后所有的行都没有了,查了Pandas手册,原来不加参数的情况下, dropna() 会移除所有包含空值的行。如果只想移除全部为空值的列,需要加上 axis how 两个参数:

df.dropna(axis=1, how='all')

1

df.dropna(axis=1, how='all')

共移除了14列中的6列,时间也只消耗了85.9秒。

接下来是处理剩余行中的空值,经过测试,在 DataFrame.replace() 中使用空字符串,要比默认的空值NaN节省一些空间;但对整个CSV文件来说,空列只是多存了一个“,”,所以移除的9800 x 6列也只省下了200M的空间。进一步的数据清洗还是在移除无用数据和合并上。

对数据列的丢弃,除无效值和需求规定之外,一些表自身的冗余列也需要在这个环节清理,比如说表中的流水号是某两个字段拼接、类型描述等,通过对这些数据的丢弃,新的数据文件大小为4.73GB,足足减少了4.04G

数据处理

使用 DataFrame.dtypes 可以查看每列的数据类型,Pandas默认可以读出intfloat64,其它的都处理为object,需要转换格式的一般为日期时间。DataFrame.astype() 方法可对整个DataFrame或某一列进行数据格式转换,支持PythonNumPy的数据类型。

df['Name'] = df['Name'].astype(np.datetime64)

1

df['Name'] = df['Name'].astype(np.datetime64)

对数据聚合,我测试了 DataFrame.groupby DataFrame.pivot_table 以及 pandas.merge groupby 9800万行 x 3列的时间为99秒,连接表为26秒,生成透视表的速度更快,仅需5秒。

df.groupby(['NO','TIME','SVID']).count() # 分组 fullData = pd.merge(df, trancodeData)[['NO','SVID','TIME','CLASS','TYPE']] # 连接 actions = fullData.pivot_table('SVID', columns='TYPE', aggfunc='count') # 透视表

1

2

3

df.groupby(['NO','TIME','SVID']).count() # 分组

fullData = pd.merge(df, trancodeData)[['NO','SVID','TIME','CLASS','TYPE']] # 连接

actions = fullData.pivot_table('SVID', columns='TYPE', aggfunc='count') # 透视表

将日志时间加入透视表并输出每天的交易/查询比例图:

total_actions = fullData.pivot_table('SVID', index='TIME', columns='TYPE', aggfunc='count') total_actions.plot(subplots=False, figsize=(18,6), kind='area')

1

2

total_actions = fullData.pivot_table('SVID', index='TIME', columns='TYPE', aggfunc='count')

total_actions.plot(subplots=False, figsize=(18,6), kind='area')

除此之外,Pandas提供的DataFrame查询统计功能速度表现也非常优秀,7秒以内就可以查询生成所有类型为交易的数据子表:

tranData = fullData[fullData['Type'] == 'Transaction']

1

tranData = fullData[fullData['Type'] == 'Transaction']

该子表的大小为 [10250666 rows x 5 columns]。在此已经完成了数据处理的一些基本场景。实验结果足以说明,在非“>5TB”数据的情况下,Python的表现已经能让擅长使用统计分析语言的数据分析师游刃有余。

 

2017-06-25 22:41:00 diaozhu1028 阅读数 7
  • Python数据挖掘实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 Python数据挖掘技术系列视频培训教程基于真实数据集进行案例实战,使用Python数据科学库从数据预处理开始一步步进行数据建模。对于每个案例首先进行流程解读与数据分析,建立特征工程,详细解读其中每一步原理与应用。该课程共有十一大章节,88课时,从泰坦尼克号获救预测进行数据分析作为第一章节,后边依次是用户画像、Xgboost实战、京东用户购买意向预测、Kaggle数据科学调查、房价预测、论文与BenchMark的意义、Python实现音乐推荐系统、fbprophet时间序列预测、用电敏感客户分类、数据特征。

    4693 人正在学习 去看看 唐宇迪

分享

知识要点:
lubridate包拆解时间 | POSIXlt
利用决策树分类,利用随机森林预测
利用对数进行fit,和exp函数还原

训练集来自Kaggle华盛顿自行车共享计划中的自行车租赁数据,分析共享自行车与天气、时间等关系。数据集共11个变量,10000多行数据。
https://www.kaggle.com/c/bike-sharing-demand

首先看一下官方给出的数据,一共两个表格,都是2011-2012年的数据,区别是Test文件是每个月的日期都是全的,但是没有注册用户和随意用户。而Train文件是每个月只有1-20天,但有两类用户的数量。
求解:补全Train文件里21-30号的用户数量。评价标准是预测与真实数量的比较。


1.png

首先加载文件和包

library(lubridate)
library(randomForest)

library(readr)
setwd("E:")
data<-read_csv("train.csv")
head(data)

这里我就遇到坑了,用r语言缺省的read.csv死活读不出来正确的文件格式,换成xlsx更惨,所有时间都变成43045这样的怪数字。本来之前试过as.Date可以正确转换,但这次因为有时分秒,就只能用时间戳,但结果也不行。
最后是下载了"readr"包,用read_csv语句,顺利解读。
因为test比train日期完整,但缺少用户数,所以要把train和test合并。

test$registered=0
test$casual=0
test$count=0
data<-rbind(train,test)

摘取时间:可以用时间戳,这里的时间比较简单,就是小时数,所以也可以直接截字符串。

data$hour1<-substr(data$datetime,12,13)
table(data$hour1)

统计一下每个小时的使用总数,是这样(为什么介么整齐):


6-hour1.png

接下来是运用箱线图,看一下使用者和时间,周几这些的关系。为什么用箱线图而不用hist直方图,因为箱线图有离散点表达,下面也因此运用对数求fit
从图中可以看出,在时间方面,注册用户和非注册用户的使用时间有很大不同。


5-hour-regestered.png

5-hour-casual.png

4-boxplot-day.png

接下来用相关系数cor检验用户,温度,体感温度,湿度,风速的关系。

相关系数:变量之间的线性关联度量,检验不同数据的相关程度。
取值范围[-1,1],越接近0越不相关。

从运算结果可以看出,使用人群与风速呈负相关,比温度影响还大。


cor.png

接下来就是将时间等因素用决策树分类,然后用随机森林来预测。随机森林和决策树的算法。听起来很高大上,其实现在也很常用了,所以一定要学会。

决策树模型是 一种简单易用的非参数分类器。它不需要对数据有任何的先验假设,计算速度较快,结果容易解释,而且稳健性强,不怕噪声数据和缺失数据。
决策树模型的基本计 算步骤如下:先从n个自变量中挑选一个,寻找最佳分割点,将数据划分为两组。针对分组后数据,将上述步骤重复下去,直到满足某种条件。
在决策树建模中需要解决的重要问题有三个:
如何选择自变量
如何选择分割点
确定停止划分的条件

做出注册用户和小时的决策树,

train$hour1<-as.integer(train$hour1)
d<-rpart(registered~hour1,data=train)
rpart.plot(d)

3-raprt-hour1.png


然后就是根据决策树的结果手动分类,所以还满占代码的...

train$hour1<-as.integer(train$hour1)
data$dp_reg=0
data$dp_reg[data$hour1<7.5]=1
data$dp_reg[data$hour1>=22]=2
data$dp_reg[data$hour1>=9.5 & data$hour1<18]=3
data$dp_reg[data$hour1>=7.5 & data$hour1<18]=4
data$dp_reg[data$hour1>=8.5 & data$hour1<18]=5
data$dp_reg[data$hour1>=20 & data$hour1<20]=6
data$dp_reg[data$hour1>=18 & data$hour1<20]=7

同理,做出 (小时 | 温度) X (注册 | 随意用户) 等决策树,继续手动分类....


3-raprt-temp.png

年份月份,周末假日等手动分类

data$year_part=0
data$month<-month(data$datatime)
data$year_part[data$year=='2011']=1
data$year_part[data$year=='2011' & data$month>3]=2
data$year_part[data$year=='2011' & data$month>6]=3
data$year_part[data$year=='2011' & data$month>9]=4
data$day_type=""
data$day_type[data$holiday==0 & data$workingday==0]="weekend"
data$day_type[data$holiday==1]="holiday"
data$day_type[data$holiday==0 & data$workingday==1]="working day"
data$weekend=0
data$weekend[data$day=="Sunday"|data$day=="Saturday"]=1

接下来用随机森林语句预测

在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。
随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,再在其中选取最优的特征。这样决策树都能够彼此不同,提升系统的多样性,从而提升分类性能。

ntree指定随机森林所包含的决策树数目,默认为500,通常在性能允许的情况下越大越好;
mtry指定节点中用于二叉树的变量个数,默认情况下数据集变量个数的二次方根(分类模型)或三分之一(预测模型)。一般是需要进行人为的逐次挑选,确定最佳的m值—摘自datacruiser笔记。这里我主要学习,所以虽然有10000多数据集,但也只定了500。就这500我的小电脑也跑了半天。

train<-data
set.seed(1234)
train$logreg<-log(train$registered+1)
test$logcas<-log(train$casual+1)

fit1<-randomForest(logreg~hour1+workingday+day+holiday+day_type+temp_reg+humidity+atemp+windspeed+season+weather+dp_reg+weekend+year+year_part,train,importance=TRUE,ntree=250)

pred1<-predict(fit1,train)
train$logreg<-pred1

这里不知道怎么回事,我的day和day_part加进去就报错,只有删掉这两个变量计算,还要研究修补。
然后用exp函数还原

train$registered<-exp(train$logreg)-1
train$casual<-exp(train$logcas)-1
train$count<-test$casual+train$registered

最后把20日后的日期截出来,写入新的csv文件上传。

train2<-train[as.integer(day(data$datetime))>=20,]
submit_final<-data.frame(datetime=test$datetime,count=test$count)
write.csv(submit_final,"submit_final.csv",row.names=F)

大功告成!
github代码加群

原来的示例是炼数成金网站的kaggle课程第二节,基本按照视频的思路。因为课程没有源代码,所以要自己修补运行完整。历时两三天总算把这个功课做完了。下面要修正的有:

好好理解三个知识点(lubridate包/POSIXlt,log线性,决策树和随机森林);
用WOE和IV代替cor函数分析相关关系;
用其他图形展现的手段分析
随机树变量重新测试

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群
626062078,我们一起学Python!

完成了一个“浩大完整”的数据分析,还是很有成就感的!

转载于:https://www.cnblogs.com/jiaoyu121/p/7078355.html

2019-09-21 23:24:46 dafeidouzi 阅读数 127
  • Python数据挖掘实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 Python数据挖掘技术系列视频培训教程基于真实数据集进行案例实战,使用Python数据科学库从数据预处理开始一步步进行数据建模。对于每个案例首先进行流程解读与数据分析,建立特征工程,详细解读其中每一步原理与应用。该课程共有十一大章节,88课时,从泰坦尼克号获救预测进行数据分析作为第一章节,后边依次是用户画像、Xgboost实战、京东用户购买意向预测、Kaggle数据科学调查、房价预测、论文与BenchMark的意义、Python实现音乐推荐系统、fbprophet时间序列预测、用电敏感客户分类、数据特征。

    4693 人正在学习 去看看 唐宇迪

关于数据处理案例有两个,第一个案例是我整理到有道云上的,就直接剪切下来了,下面直接进入正题~

案例1:快餐数据

案例2:欧洲杯数据

先进行数据探索 

data.info()


data.describe()

查看数据集是否有缺失值且哪个字段存在缺失值?可以用下面的代码,也可以用前面案例1缺失值那里提到的前两种方法

for i in range(data.shape[1]):
    if data.iloc[:,i].notnull().sum() != data.shape[0]:
         print('第%d列:字段%s 存在缺失值'%(i+1,data.columns[i]))

代码运行结果是

对Clearances off line进行缺失值处理

首先查看Clearances off line字段

统计其数字组成

data['Clearances off line'].value_counts()

从统计结果可以看到,在Clearances off line这个字段中有11个值为0,3个值为1,1个值为2,故考虑采用众数(mode)填充缺失值

mode=data['Clearances off line'].mode()
data['Clearances off line']=data['Clearances off line'].fillna(mode)

描述性统计

统计有多少球队参加了欧洲杯?

data.Team.count()

将数据集中的列Team, Yellow Cards和Red Cards单独存为一个名叫discipline的数据框

discipline=data[['Team','Yellow Cards','Red Cards']]

按照先Red Cards再Yellow Cards进行降序排序

discipline.sort_values(by=['Red Cards','Yellow Cards'])

计算每个球队拿到黄牌的平均值

data['Yellow Cards'].mean()

找出进球数大于6个的球队的数据

data[data['Goals']>6]

对比英格兰(England)、意大利(Italy)和俄罗斯(Russia)的射正率(Shooting Accuracy)

data['Shooting Accuracy'].[data.Team.isin(['England','ltaly','Russia'])]

 

2018-06-12 18:11:12 jianghuming 阅读数 404
  • Python数据挖掘实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 Python数据挖掘技术系列视频培训教程基于真实数据集进行案例实战,使用Python数据科学库从数据预处理开始一步步进行数据建模。对于每个案例首先进行流程解读与数据分析,建立特征工程,详细解读其中每一步原理与应用。该课程共有十一大章节,88课时,从泰坦尼克号获救预测进行数据分析作为第一章节,后边依次是用户画像、Xgboost实战、京东用户购买意向预测、Kaggle数据科学调查、房价预测、论文与BenchMark的意义、Python实现音乐推荐系统、fbprophet时间序列预测、用电敏感客户分类、数据特征。

    4693 人正在学习 去看看 唐宇迪

Python大数据分析_开篇

目前在网上看了很多博客,都是一些关于数据处理的,且都浅尝辄止,没有形成一个系列,只言片语,不能给人以更深层次的启发。加之,最近在用python做金融大数据这块的分析,故写博客以记之,以供他人阅,相互交流。

大数据分析的意义,我自不用多述。众多金融公司,无不在挖掘其价值。但是公开的,没有任何一个模型是成功的,私下赚钱的算法系统,也不会公开。这便是我们的目标之一。

不仅金融公司在做大数据分析,众多其它类别的公司,也都在数据分析,房地产(如某壳),餐饮,电力等等,各行各业,都在做数据分析。提取有价值的信息,便可以给公司指明道路,给领导以决策。

接下来,本人会把自己的研究,分享给大家,欢迎批评指正。


2018-05-24 19:50:48 qq_39343820 阅读数 165
  • Python数据挖掘实战

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 Python数据挖掘技术系列视频培训教程基于真实数据集进行案例实战,使用Python数据科学库从数据预处理开始一步步进行数据建模。对于每个案例首先进行流程解读与数据分析,建立特征工程,详细解读其中每一步原理与应用。该课程共有十一大章节,88课时,从泰坦尼克号获救预测进行数据分析作为第一章节,后边依次是用户画像、Xgboost实战、京东用户购买意向预测、Kaggle数据科学调查、房价预测、论文与BenchMark的意义、Python实现音乐推荐系统、fbprophet时间序列预测、用电敏感客户分类、数据特征。

    4693 人正在学习 去看看 唐宇迪

学习完《利用python进行数据分析》之后,看到R语言案例中的定位算法一章时,试着用python进行分析一下。

一、数据准备

原始数据有两份:offline.final.trace.txt和online.final.trace.txt

原始数据:


最后处理完成的结果:


二、python处理

在ipython notebook里面进行分析

首先对一行数据进行处理:

预处理,去除带有#的行,这是无用数据

with open('G:\Positioning\online.final.trace.txt','r') as r:
    lines = r.readlines()
with open('G:\Positioning\online.final.trace.txt','w') as w:
    for l in lines:
        if '#' not in l:
            w.write(l)  #去除带有‘#’字符的行

打开文件,这里是测试数据,就只有一行

f = open('G:\Positioning\Positioning.txt')
data = f.read()

利用正则表达式,分离数据

import re
tokens = re.split('[=;,]',data) #正则表达式,分离各个元素,根据‘=’,‘;’,‘,’这三个字符对数据进行分离出来放在一个列表中

将数据分成2个部分,一部分是前面的测量单元,另一部分是后面的读数

import pandas as pd
import numpy as np
from pandas import Series, DataFrame #引入约定 
columns1 = [tokens[0],tokens[2],'posX','posY','posZ',tokens[8]] #得到第一部分数据的列表名
data1 = [tokens[1],tokens[3],tokens[5],tokens[6],tokens[7],tokens[9]] #得到第一部分的数据
s = Series(data1, index = columns1) #第一部分的Series
df1 = DataFrame(s).T #第一部分数据的DataFrame

a = tokens[10:] #第二部分的数据
columns2 = ['MAC','signal','frequency','mode']  #第二部分数据的列名
def chunks(s, step):
    return [s[i:i+step] for i in  range(0, len(s), step)] #函数:遍历列表,取n个元素为一个新元素
data2 = chunks(a, 4) #每四个一组
df2 = DataFrame(data2, columns = columns2 ) #第二部分数据的DataFrame

合并两个DataFrame,完成对一行数据的处理

df1['key'] ='1' #增添一个公共键
df2['key'] ='1'
df=pd.merge(df1,df2) #合并

对数据集进行处理(多行):

预处理:

with open('G:\Positioning\online.final.trace.txt','r') as r:
    lines = r.readlines()
with open('G:\Positioning\online.final.trace.txt','w') as w:
    for l in lines:
        if '#' not in l:
            w.write(l) 
#删除含有#的行

编写函数,根据单行的步骤来编写:

import pandas as pd
import numpy as np
from pandas import Series, DataFrame 

def function(x): #编写函数
    import re
    import pandas as pd
    import numpy as np
    from pandas import Series, DataFrame 
    tokens = re.split('[=;,]',x) #分离各个元素
    
    columns1 = [tokens[0],tokens[2],'posX','posY','posZ',tokens[8]] #得到第一部分的列表名
    data1 = [tokens[1],tokens[3],tokens[5],tokens[6],tokens[7],tokens[9]] #得到第一部分的数据
    s = Series(data1, index = columns1) #第一部分的Series
    df1 = DataFrame(s).T #第一部分的DataFrame
    
    a = tokens[10:] #第二部分的数据
    columns2 = ['MAC','signal','frequency','mode'] 
    def chunks(s, step):
         return [s[i:i+step] for i in  range(0, len(s), step)]
    data2 = chunks(a, 4) #每四个一组
    df2 = DataFrame(data2, columns = columns2 )
    
    df1['key'] ='1' #增添公共键
    df2['key'] ='1'
    
    df=pd.merge(df1,df2) #合并
    
    return df

打开文件,进行数据处理

f = open('G:\Positioning\online.final.trace.txt')
lines = [line.strip('\n') for line in f] #去掉换行符
frames=[] #先设置空的列表
for i in lines:
    frames.append(function(i)) #将lines中每个元素进行应用函数后添加到列表中
df = pd.concat(frames, ignore_index = True) #无视索引,重新编号

对原始数据的处理目前到这里以及完成的差不多了。大家如果还有更加节省资源的代码,欢迎指教指教,小白一枚,不胜感激。







Python数据处理实例

阅读数 949

没有更多推荐了,返回首页