在加载了,在加载了

【学习笔记】 第06章 数据加载、存储与文件格式

前言

早上起床迷迷糊糊的困得要死,本来打算去上最优化的,但是还是算了,留在宿舍继续学Numpy吧,等会自然辩证法再去(要点名),留都留了,好好学习吧!

读写文本格式的数据

pandas提供了一些用于将表格型数据读取为DataFrame对象的函数。
表6-1对它们进行了总结,其中read_csv和read_table可能会是今后用得最多的
表6-1 pandas中的解析函数
由于之前使用github上面下载的一个爬虫工具,可以爬下B站单个视频的弹幕,所以本章我直接使用之前爬过的弹幕(所爬视频是我自己剪辑的,有15w播放),转成csv格式后进行学习

In [3]: df=pd.read_csv('E:/我的文件/学习/硕士/研一下学期/numpy/unnatural.csv')

In [4]: df
Out[4]:
        出现时间  弹幕类型  字的大小        颜色  ...  unknown_6          unknown_7 unknown_8                          弹幕内容
0    212.321     1    25  16777215  ...   a395661f  33601096322646021        10       如果我可以拥有这么可爱的女朋友,我可以改变取向
1    180.129     1    25  16777215  ...   a395661f  33601079539662851        10               非常正能量的日剧,女主我太爱了
2     76.384     1    25  16777215  ...   9e55fb57  32005160809005059        10                     草到这里我憋不住了
3     21.641     1    25  16777215  ...   2cb234df  31925199932751877        10                      我以为我手机响了
4    219.637     1    25  16777215  ...    3436b8b  31290085198528519        10  如果十元这样和我说的话,我肯定回答:我可以为了你工作吗?
..       ...   ...   ...       ...  ...        ...                ...       ...                           ...
317   86.646     1    25  16777215  ...   b1cc5e9a  27873327088926722         1                           哭死了
318   63.151     1    25  16777215  ...   d1d65a5f  27742363752857604         1                            哭死
319   80.183     1    25  16777215  ...   6640e67d  27677135002402816         1                         我这集哭死
320   26.889     1    25  16777215  ...   24aeb8ec  27096032161562624         1                             歪
321   33.545     1    25  16777215  ...   52591e39  27036517693128708         1                             歪

[322 rows x 10 columns]

In [5]: pd.read_table('E:/我的文件/学习/硕士/研一下学期/numpy/unnatural.csv',sep='.')
Out[5]:
    出现时间,弹幕类型,字的大小,颜色,弹幕添加时间戳,unknown_5,unknown_6,unknown_7,unknown_8,弹幕内容
212  32100,1,25,16777215,1591231180,0,a395661f,3360...
180  12900,1,25,16777215,1591231148,0,a395661f,3360...
76   38400,1,25,16777215,1588187174,0,9e55fb57,3200...
21   64100,1,25,16777215,1588034661,0,2cb234df,3192...
219  63700,1,25,16777215,1586823276,0,3436b8b,31290...
..                                                 ...
86   64600,1,25,16777215,1580306327,0,b1cc5e9a,2787...
63   15100,1,25,16777215,1580056534,0,d1d65a5f,2774...
80   18300,1,25,16777215,1579932120,0,6640e67d,2767...
26   88900,1,25,16777215,1578823754,0,24aeb8ec,2709...
33   54500,1,25,16777215,1578710240,0,52591e39,2703...

[322 rows x 1 columns]

In [6]: pd.read_table('E:/我的文件/学习/硕士/研一下学期/numpy/unnatural.csv',sep=',')
Out[6]:
        出现时间  弹幕类型  字的大小        颜色     弹幕添加时间戳  unknown_5 unknown_6          unknown_7  unknown_8                          弹幕内容
0    212.321     1    25  16777215  1591231180          0  a395661f  33601096322646021         10       如果我可以拥有这么可爱的女朋友,我可以改变取向
1    180.129     1    25  16777215  1591231148          0  a395661f  33601079539662851         10               非常正能量的日剧,女主我太爱了
2     76.384     1    25  16777215  1588187174          0  9e55fb57  32005160809005059         10                     草到这里我憋不住了
3     21.641     1    25  16777215  1588034661          0  2cb234df  31925199932751877         10                      我以为我手机响了
4    219.637     1    25  16777215  1586823276          0   3436b8b  31290085198528519         10  如果十元这样和我说的话,我肯定回答:我可以为了你工作吗?
..       ...   ...   ...       ...         ...        ...       ...                ...        ...                           ...
317   86.646     1    25  16777215  1580306327          0  b1cc5e9a  27873327088926722          1                           哭死了
318   63.151     1    25  16777215  1580056534          0  d1d65a5f  27742363752857604          1                            哭死
319   80.183     1    25  16777215  1579932120          0  6640e67d  27677135002402816          1                         我这集哭死
320   26.889     1    25  16777215  1578823754          0  24aeb8ec  27096032161562624          1                             歪
321   33.545     1    25  16777215  1578710240          0  52591e39  27036517693128708          1                             歪

[322 rows x 10 columns]

In [14]: pd.read_csv('E:/我的文件/学习/硕士/研一下学期/numpy/unnatural.csv',index_col='弹幕内容')
Out[14]:
                                 出现时间  弹幕类型  字的大小        颜色     弹幕添加时间戳  unknown_5 unknown_6          unknown_7  unknown_8
弹幕内容
如果我可以拥有这么可爱的女朋友,我可以改变取向       212.321     1    25  16777215  1591231180          0  a395661f  33601096322646021         10
非常正能量的日剧,女主我太爱了               180.129     1    25  16777215  1591231148          0  a395661f  33601079539662851         10
草到这里我憋不住了                      76.384     1    25  16777215  1588187174          0  9e55fb57  32005160809005059         10
我以为我手机响了                       21.641     1    25  16777215  1588034661          0  2cb234df  31925199932751877         10
如果十元这样和我说的话,我肯定回答:我可以为了你工作吗?  219.637     1    25  16777215  1586823276          0   3436b8b  31290085198528519         10
...                               ...   ...   ...       ...         ...        ...       ...                ...        ...
哭死了                            86.646     1    25  16777215  1580306327          0  b1cc5e9a  27873327088926722          1
哭死                             63.151     1    25  16777215  1580056534          0  d1d65a5f  27742363752857604          1
我这集哭死                          80.183     1    25  16777215  1579932120          0  6640e67d  27677135002402816          1
歪                              26.889     1    25  16777215  1578823754          0  24aeb8ec  27096032161562624          1
歪                              33.545     1    25  16777215  1578710240          0  52591e39  27036517693128708          1

[322 rows x 9 columns]

除此之外,在记录一些常见的用法
有些情况下,有些表格可能不是用固定的分隔符去分隔字段的(比如空白符或其它模式),虽然可以手动对数据进行规整,这里的字段是被数量不同的空白字符间隔开的。这种情况下,你可以传递一个正则表达式作为read_table的分隔符
这些解析器函数还有许多参数可以帮助你处理各种各样的异形文件格式(表6-2列出了一些)。比如说,你可以用skiprows跳过文件的第一行、第三行和第四行
缺失值处理是文件解析任务中的一个重要组成部分。缺失数据经常是要么没有(空字符串),要么用某个标记值表示。默认情况下,pandas会用一组经常出现的标记值进行识别,比如NA及NULL


逐块读取文本文件

如果只想读取几行(避免读取整个文件),通过nrows进行指定即可
要逐块读取文件,可以指定chunksize(行数)
read_csv所返回的这个TextParser对象使你可以根据chunksize对文件进行逐块迭代。比如说,我们可以迭代处理csv,将值计数聚合到某列中

In [21]: chunker = pd.read_csv('E:/我的文件/学习/硕士/研一下学期/numpy/unnatural.csv', chunksize=100)

In [22]: tot=pd.Series([])
<ipython-input-22-68aa5c24f913>:1: DeprecationWarning: The default dtype for empty Series will be 'object' instead of 'float64' in a future version. Specify a dtype explicitly to silence this warning.
  tot=pd.Series([])  
In [27]: tot
Out[27]:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    1.0
6                                                                                          1.0
Bgm是什么                                                                                     1.0
bgm是什么                                                                                     2.0
qqq                                                                                        1.0
                                                                                          ...
这集哭死了                                                                                      1.0
这集真的                                                                                       1.0
这集真的唉:-(                                                                                   1.0
那是六郎啊                                                                                      1.0
都给我哭                                                                                       5.0
Length: 80, dtype: float64

将数据写出到文本格式

利用DataFrame的to_csv方法,我们可以将数据写到一个以逗号分隔的文件中
Series也有一个to_csv方法:

In [50]: dates = pd.date_range('1/1/2000', periods=7)

In [51]: ts = pd.Series(np.arange(7), index=dates)

In [52]: ts.to_csv('examples/tseries.csv')

In [53]: !cat examples/tseries.csv
2000-01-01,0
2000-01-02,1
2000-01-03,2
2000-01-04,3
2000-01-05,4
2000-01-06,5
2000-01-07,6

处理分隔符格式

读取Microsoft Excel文件

pandas的ExcelFile类或pandas.read_excel函数支持读取存储在Excel 2003(或更高版本)中的表格型数据。这两个工具分别使用扩展包xlrd和openpyxl读取XLS和XLSX文件。可以用pip或conda安装它们。
如果要将pandas数据写入为Excel格式,你必须首先创建一个ExcelWriter,然后使用pandas对象的to_excel方法将数据写入到其中

In [108]: writer = pd.ExcelWriter('examples/ex2.xlsx')

In [109]: frame.to_excel(writer, 'Sheet1')

In [110]: writer.save()

你还可以不使用ExcelWriter,而是传递文件的路径到to_excel:
In [111]: frame.to_excel('examples/ex2.xlsx')

Web APIs交互

(爬虫?)
许多网站都有一些通过JSON或其他格式提供数据的公共API。通过Python访问这些API的办法有不少。一个简单易用的办法(推荐)是requests包

In [31]: import requests

In [32]: url = 'https://api.github.com/repos/pandas-dev/pandas/issues'

In [33]:  resp = requests.get(url)

In [34]: resp
Out[34]: <Response [200]>

In [35]: data = resp.json()

In [36]: data[0]['title']
Out[36]: 'Parse start/end only if Index of type Datetime'

In [37]: issues = pd.DataFrame(data, columns=['number', 'title',
    ...:    .....:                                      'labels', 'state'])

In [38]: issues
Out[38]:
    number                                              title                                             labels state
0    46385     Parse start/end only if Index of type Datetime                                                 []  open
1    46384  BUG: Styler renders booleans True/False as dig...  [{'id': 76811, 'node_id': 'MDU6TGFiZWw3NjgxMQ=...  open
2    46383  BUG: subset parameter of DataFrameGroupBy.valu...  [{'id': 76811, 'node_id': 'MDU6TGFiZWw3NjgxMQ=...  open
3    46382                                      Bug gb cummax  [{'id': 233160, 'node_id': 'MDU6TGFiZWwyMzMxNj...  open
4    46381  BUG: pandas.io.formats.style.Styler.to_excel d...  [{'id': 76811, 'node_id': 'MDU6TGFiZWw3NjgxMQ=...  open
..     ...                                                ...                                                ...   ...
25   46353  DOC: Document that astype() for Series and Dat...  [{'id': 134699, 'node_id': 'MDU6TGFiZWwxMzQ2OT...  open
26   46352  ENH: read_excel should assume engine when pass...  [{'id': 76812, 'node_id': 'MDU6TGFiZWw3NjgxMg=...  open
27   46351                    Question: why use Azure for CI?  [{'id': 48070600, 'node_id': 'MDU6TGFiZWw0ODA3...  open
28   46348  Series.map Performance Improvement When Using ...  [{'id': 8935311, 'node_id': 'MDU6TGFiZWw4OTM1M...  open
29   46346                  WIP Use provision-with-micromamba  [{'id': 48070600, 'node_id': 'MDU6TGFiZWw0ODA3...  open

[30 rows x 4 columns]

数据库交互

在商业场景下,大多数数据可能不是存储在文本或Excel文件中。基于SQL的关系型数据库(如SQL Server、PostgreSQL和MySQL等)使用非常广泛,其它一些数据库也很流行。数据库的选择通常取决于性能、数据完整性以及应用程序的伸缩性需求。
将数据从SQL加载到DataFrame的过程很简单,此外pandas还有一些能够简化该过程的函数。例如,书中将使用SQLite数据库(通过Python内置的sqlite3驱动器)

总结

访问数据通常是数据分析的第一步。在本章中,我们已经学了一些有用的工具。在接下来的章节中,我们将深入研究数据规整、数据可视化、时间序列分析和其它主题。
等会自然辩证法课会将未读的JSON数据、XML和HTMLWeb信息收集、利用lxml.objectify解析XML、二进制数据格式部分补上

posted @ 2022-03-16 09:54  Lugendary  阅读(51)  评论(0编辑  收藏  举报