pandas: powerful Python data analysis toolkit, Release 0.18.1
9
NaN
NaN
0.0
NaN
NaN
NaN
0.0
1.0
1.0
NaN
In [57]: pd.set_option('max_info_rows'11)
In [58]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 10 columns):
0
8 non-null float64
1
5 non-null float64
2
8 non-null float64
3
7 non-null float64
4
5 non-null float64
5
7 non-null float64
6
6 non-null float64
7
6 non-null float64
8
8 non-null float64
9
3 non-null float64
dtypes: float64(10)
memory usage: 872.0 bytes
In [59]: pd.set_option('max_info_rows'5)
In [60]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 10 columns):
0
float64
1
float64
2
float64
3
float64
4
float64
5
float64
6
float64
7
float64
8
float64
9
float64
dtypes: float64(10)
memory usage: 872.0 bytes
In [61]: pd.reset_option('max_info_rows')
display.precision sets the output display precision in terms ofdecimal places. This is only a suggestion.
In [62]: df pd.DataFrame(np.random.randn(5,5))
In [63]: pd.set_option('precision',7)
In [64]: df
Out[64]:
0
1
2
3
4
0 -2.0490276
2.8466122 -1.2080493 -0.4503923
2.4239054
1
0.1211080
0.2669165
0.8438259 -0.2225400
2.0219807
2 -0.7167894 -2.2244851 -1.0611370 -0.2328247
0.4307933
3 -0.6654779
1.8298075 -1.4065093
1.0782481
0.3227741
4
0.2003243
0.8900241
0.1948132
0.3516326
0.4488815
In [65]: pd.set_option('precision',4)
12.4. Frequently Used Options
461
Pdf signature stamp - C# PDF File Permission Library: add, remove, update PDF file permission in C#.net, ASP.NET, MVC, WPF
Tell C# users how to set PDF file permissions, like printing, copying, modifying, extracting, annotating, form filling, etc
add jpeg signature to pdf; pdf sign
Pdf signature stamp - VB.NET PDF File Permission Library: add, remove, update PDF file permission in vb.net, ASP.NET, MVC, WPF
VB.NET Tutorial for How to Set PDF File Access Permissions Using XDoc.PDF for .NET
pdf will signature; pdf signature stamp
pandas: powerful Python data analysis toolkit, Release 0.18.1
In [66]: df
Out[66]:
0
1
2
3
4
0 -2.0490
2.8466 -1.2080 -0.4504
2.4239
1
0.1211
0.2669
0.8438 -0.2225
2.0220
2 -0.7168 -2.2245 -1.0611 -0.2328
0.4308
3 -0.6655
1.8298 -1.4065
1.0782
0.3228
4
0.2003
0.8900
0.1948
0.3516
0.4489
display.chop_threshold sets at what level pandas rounds to zero when it displays a Series of DataFrame.
Note,this does not effect the precision at which the number is stored.
In [67]: df pd.DataFrame(np.random.randn(6,6))
In [68]: pd.set_option('chop_threshold'0)
In [69]: df
Out[69]:
0
1
2
3
4
5
0 -0.1979
0.9657 -1.5229 -0.1166
0.2956 -1.0477
1
1.6406
1.9058
2.7721
0.0888 -1.1442 -0.6334
2
0.9254 -0.0064 -0.8204 -0.6009 -1.0393
0.8248
3 -0.8241 -0.3377 -0.9278 -0.8401
0.2485 -0.1093
4
0.4320 -0.4607
0.3365 -3.2076 -1.5359
0.4098
5 -0.6731 -0.7411 -0.1109 -2.6729
0.8645
0.0609
In [70]: pd.set_option('chop_threshold'.5)
In [71]: df
Out[71]:
0
1
2
3
4
5
0
0.0000
0.9657 -1.5229
0.0000
0.0000 -1.0477
1
1.6406
1.9058
2.7721
0.0000 -1.1442 -0.6334
2
0.9254
0.0000 -0.8204 -0.6009 -1.0393
0.8248
3 -0.8241
0.0000 -0.9278 -0.8401
0.0000
0.0000
4
0.0000
0.0000
0.0000 -3.2076 -1.5359
0.0000
5 -0.6731 -0.7411
0.0000 -2.6729
0.8645
0.0000
In [72]: pd.reset_option('chop_threshold')
display.colheader_justify controls the justification of the headers. Options are ‘right’, and ‘left’.
In [73]: df pd.DataFrame(np.array([np.random.randn(6), np.random.randint(1,9,6)
*
.1, np.zeros(6)]).T,
....:
columns=['A''B''C'], dtype='float')
....:
In [74]: pd.set_option('colheader_justify''right')
In [75]: df
Out[75]:
A
B
C
0
0.9331
0.3
0.0
1
0.2888
0.2
0.0
2
1.3250
0.2
0.0
3
0.5892
0.7
0.0
4
0.5314
0.1
0.0
5 -1.1987
0.7
0.0
462
Chapter 12. Options and Settings
VB.NET TIFF: Make Custom Annotations on TIFF Image File in VB.NET
merge them into one image that can be output as a PDF or any has the functionality that enables users to add annotation, drawing, signature, stamp or sticky
add signature to pdf acrobat reader; add signature image to pdf
C#: XDoc.HTML5 Viewer for .NET Online Help Manual
Click to convert PDF document to Word (.docx). PDF and Word (.docx). Annotation Tab. 6. RubberStamp. Click to draw a rubber stamp annotation. Signature Tab. Item.
pdf to word converter sign in; adding signature to pdf
pandas: powerful Python data analysis toolkit, Release 0.18.1
In [76]: pd.set_option('colheader_justify''left')
In [77]: df
Out[77]:
A
B
C
0
0.9331
0.3
0.0
1
0.2888
0.2
0.0
2
1.3250
0.2
0.0
3
0.5892
0.7
0.0
4
0.5314
0.1
0.0
5 -1.1987
0.7
0.0
In [78]: pd.reset_option('colheader_justify')
12.5 Available Options
Option
Default
Function
display.chop_threshold
None
If set to a float value,all float values smaller then the given threshold will be displayed as exactly 0 by repr and friends.
display.colheader_justify
right
Controls the justification of column headers. used by DataFrameFormatter.
display.column_space
12
No description available.
display.date_dayfirst
False
When True,prints and parses dates with the day first, eg 20/01/2005
display.date_yearfirst
False
When True,prints and parses dates with the yearfirst, eg 2005/01/20
display.encoding
UTF-8
Defaults to the detected encoding ofthe console. Specifies the encoding to be used for strings returned by to_string, these are generally strings meant to be displayed onthe console.
display.expand_frame_repr
True
Whether to print out the full DataFrame repr for wide DataFrames across multiple lines,max_columns is still respected, but the output will wrap-around across multiple “pages” if its width exceeds display.width.
display.float_format
None
The callable should accept a floating point numberand return a string with the desired format of the number. This is used in some places like SeriesFormatter. See core.format.EngFormatter for an example.
display.height
60
Deprecated. Use display.max_rows instead.
display.large_repr
truncate
For DataFrames exceeding max_rows/max_cols,the repr (and HTML repr) can showa truncated table (the default from 0.13), orswitch to the viewfrom df.info() (the behaviour in earlier versions ofpandas). allowable settings, [’truncate’,‘info’]
display.latex.repr
False
Whether to produce a latex DataFrame representation for jupyter frontends that support it.
display.latex.escape
True
Escapes special caracters in Dataframes,when using the to_latex method.
display.latex.longtable
False
Specifies if the to_latex method of a Dataframe uses the longtable format.
display.line_width
80
Deprecated. Use display.width instead.
display.max_columns
20
max_rows and max_columns are used in __repr__() methods to decide if to_string() or info() is used to renderan object to a string. In case python/IPython is running in a terminal this canbe set to 0 and pandas will correctly auto-detect the width the terminal and swap to a smaller format in case all columns would not fit vertically. The IPython notebook, IPython qtconsole, or IDLE do not run in a terminal and hence it is not possible to do correct auto-detection. ‘None’ value means unlimited.
display.max_colwidth
50
The maximumwidth incharacters of a column in the reprof a pandas data structure. When the column overflows, a ”...” placeholder is embedded in the output.
display.max_info_columns
100
max_info_columns is used in DataFrame.info method to decide if per column information will be printed.
display.max_info_rows
1690785
df.info() will usually show null-counts for each column. For large frames this can be quite slow. max_info_rows andmax_info_cols limit this null check only to frames with smallerdimensions then specified.
display.max_rows
60
This sets the maximum number ofrows pandas should output when printing out various output. For example, this value determines whether the repr() for a dataframe prints out fully or just a summary repr. ‘None’value means unlimited.
display.max_seq_items
100
when pretty-printing a long sequence,no more then max_seq_items will be printed. Ifitems are omitted,they will be denoted by the addition of ”...” to the resulting string. If set to None, the numberof items to be printed is unlimited.
display.memory_usage
True
This specifies if the memory usage of a DataFrame should be displayed when the df.info() method is invoked.
display.multi_sparse
True
“Sparsify” MultiIndex display (don’t display repeated elements in outerlevels withingroups)
display.notebook_repr_html
True
When True,IPython notebook will use html representation for pandas objects (if it is available).
display.pprint_nest_depth
3
Controls the number of nested levels to process when pretty-printing
display.precision
6
Floating point output precision in terms ofnumberof places after the decimal,for regular formatting as well as scientific notation. Similar tonumpy’s precision print option
display.show_dimensions
truncate
Whether to print out dimensions at the end of DataFrame repr. If‘truncate’ is specified,only print out the dimensions if the frame is truncated (e.g. not display all rows and/or columns)
display.width
80
Width ofthe display in characters. In case python/IPython is running in a terminal this can be set to None and pandas will correctly auto-detect the width. Note that the IPython notebook, IPython qtconsole,or IDLE do not run in a terminal and hence it is not possible to correctly detect the width.
io.excel.xls.writer
xlwt
The default Excel writer engine for‘xls’ files.
io.excel.xlsm.writer
openpyxl
The default Excel writer engine for‘xlsm’files. Available options: ‘openpyxl’ (the default).
io.excel.xlsx.writer
openpyxl
The default Excel writer engine for‘xlsx’ files.
io.hdf.default_format
None
default format writing format, if None,then put will default to ‘fixed’ and append will default to ‘table’
io.hdf.dropna_table
True
drop ALL nan rows when appending to a table
mode.chained_assignment
warn
Raise an exception, warn, orno action if trying to use chainedassignment, The default is warn
mode.sim_interactive
False
Whether to simulate interactive mode for purposes of testing
12.5. Available Options
463
C# Image: How to Add Image or Document Rubber Stamp Annotation
Stamp Annotation Introduction. Have you ever thought of adding a digital signature or custom rubber stamp to source document image file using Visual C# code?
adding a signature to a pdf; create pdf signature
XDoc.HTML5 Viewer for .NET, All Mature Features Introductions
developers to search text-based documents, like PDF, Microsoft Office freehand, line(s), highlight, ellipse, rectangle, rubber stamp, polygon, arrow Signature.
pdf create signature; adding a signature to a pdf document
pandas: powerful Python data analysis toolkit, Release 0.18.1
Option
Default
Function
mode.use_inf_as_null
False
True means treat None, NaN,-INF, INFas null (old way), False means None and NaN are null, but INF, -INF are not null (new way).
12.6 Number Formatting
pandas also allows you to set how numbers are displayed in the console. This option is not set through the
set_options API.
Use the set_eng_float_format function to alter the floating-point formatting of pandas objects to produce a
particular format.
For instance:
In [79]: import numpy as np
In [80]: pd.set_eng_float_format(accuracy=3, use_eng_prefix=True)
In [81]: pd.Series(np.random.randn(5), index=['a''b''c''d''e'])
In [82]: s/1.e3
Out[82]:
a
-236.866u
b
846.974u
c
-685.597u
d
609.099u
e
-303.961u
dtype: float64
In [83]: s/1.e6
Out[83]:
a
-236.866n
b
846.974n
c
-685.597n
d
609.099n
e
-303.961n
dtype: float64
To round floats on a case-by-case basis, you can also useround() andround().
12.7 Unicode Formatting
Warning: Enabling this option will affect the performance for printing of DataFrame and Series (about 2 times
slower). Use only when it is actually required.
Some East Asian countries use Unicode characters its width is corresponding to 2 alphabets. If DataFrame or Series
contains these characters, default output cannot be aligned properly.
Note: Screen captures are attached for each outputs to show the actual results.
In [84]: df pd.DataFrame({u'': ['UK'u''], u'': ['Alice'u'']})
In [85]: df;
464
Chapter 12. Options and Settings
How to C#: Basic SDK Concept of XDoc.PDF for .NET
To be specific, you can edit PDF password and digital signature, and set PDF file permission. Class: PasswordSetting. Class: PDFDigitalSignatureHandler.
adding a signature to a pdf file; pdf export sign in
VB.NET Image: How to Generate Freehand Annotation Through VB.NET
simply drawn as an annotation on documents, like PDF. annotation control enables you to insert stamp (user-specific electronic signature) on documents
add jpg signature to pdf; create transparent signature stamp for pdf
pandas: powerful Python data analysis toolkit, Release 0.18.1
Enable display.unicode.east_asian_width allows pandas to check each character’s “East Asian Width”
property. These characters can be aligned properly by checking this property, but it takes longer time than standard
len function.
In [86]: pd.set_option('display.unicode.east_asian_width'True)
In [87]: df;
In addition, Unicode contains characters which width is “Ambiguous”. These character’s width should be ei-
ther 1 or 2 depending on terminal setting or encoding. Because this cannot be distinguished from Python,
display.unicode.ambiguous_as_wide option is added tohandle this.
By default,“Ambiguous” character’s width, “¡” (inverted exclamation) in below example, is regarded as 1.
In [88]: df pd.DataFrame({'a': ['xxx'u'¡¡'], 'b': ['yyy'u'¡¡']})
In [89]: df;
Enabling display.unicode.ambiguous_as_wide lets pandas to figurethesecharacter’s width as 2. Note that
this option will be effective only when display.unicode.east_asian_width is enabled. Confirm starting
position has been changed,but is not aligned properly because the setting is mismatched with this environment.
In [90]: pd.set_option('display.unicode.ambiguous_as_wide'True)
In [91]: df;
12.7. Unicode Formatting
465
C# PowerPoint - Annotate PowerPoint Page in C#.NET
VB.NET How-to, VB.NET PDF, VB.NET Word, VB.NET Excel, VB.NET PowerPoint, VB.NET Tiff, VB.NET Imaging, VB.NET OCR, VB.NET Twain, VB.NET Rubber Stamp. Signature.
add signature block to pdf; adding signature to pdf document
C# Word - Annotate Word Page in C#.NET
VB.NET How-to, VB.NET PDF, VB.NET Word, VB.NET Excel, VB.NET PowerPoint, VB.NET Tiff, VB.NET Imaging, VB.NET OCR, VB.NET Twain, VB.NET Rubber Stamp. Signature.
pdf secure signature; sign pdf online
pandas: powerful Python data analysis toolkit, Release 0.18.1
466
Chapter 12. Options and Settings
XDoc.Excel for .NET, Comprehensive .NET Excel Imaging Features
Convert Excel to PDF; Convert Excel to HTML5; Convert Excel embedded image, referenced image, polygon, lines, rubber stamp, callout, arrow, signature, etc.
pdf sign in; add signature pdf preview
XDoc.PowerPoint for .NET, All Mature Features Introductions
Convert PowerPoint to PDF; Convert PowerPoint to HTML5; Convert Image, Referenced Image, Polygon, Lines, Rubber Stamp, Callout, Arrow, Signature, etc.
pdf signatures; add signature to preview pdf
CHAPTER
THIRTEEN
INDEXING AND SELECTING DATA
The axis labeling information in pandas objects serves many purposes:
• Identifies data (i.e. provides metadata)using known indicators, important foranalysis, visualization, and inter-
active console display
• Enables automatic and explicit data alignment
• Allows intuitive getting and setting of subsets of the data set
In this section, we will focus on the final point: namely, how to slice, dice, and generally get andset subsets ofpandas
objects. The primary focus will be on Series and DataFrame as they have received more development attention in
this area. Expect more work to be invested in higher-dimensional data structures (including Panel) in the future,
especially in label-based advanced indexing.
Note: The Python and NumPy indexing operators [] and attribute operator . provide quick and easy access to
pandas data structures across a wide range ofuse cases. This makes interactive work intuitive, as there’s little new to
learn if you already know howto deal withPython dictionaries andNumPy arrays. However,since the type of the data
to be accessed isn’t known in advance, directly using standard operators has some optimization limits. Forproduction
code, we recommended that you take advantage of the optimized pandas data access methods exposed in this chapter.
Warning: Whether a copy or a reference is returned for a setting operation, may depend on the context. This is
sometimes calledchained assignment and should be avoided. SeeReturningaViewversusCopy
Warning: In 0.15.0 Index has internally been refactored to no longer subclass ndarray but instead subclass
PandasObject, similarly to the rest of the pandas objects. This should be a transparent change with only very
limited API implications (See theInternalRefactoring)
Warning: Indexing on an integer-based Index with floats has been clarified in 0.18.0, for a summary of the
changes, seehere.
See theMultiIndex/AdvancedIndexingforMultiIndex and more advanced indexing documentation.
See thecookbook forsome advanced strategies
13.1 Different Choices for Indexing
New in version 0.11.0.
Object selection has had a number of user-requested additions in order to support more explicit location based index-
ing. pandas nowsupports three types ofmulti-axis indexing.
467
pandas: powerful Python data analysis toolkit, Release 0.18.1
• .loc is primarily label based, but may also be used with a boolean array. .loc will raise KeyError when
the items are not found. Allowed inputs are:
– A single label,e.g. 5 or ’a’, (note that 5 is interpreted as a label of the index. This use is not an integer
position along the index)
– A list orarray oflabels [’a’, ’b’, ’c’]
– A slice object with labels ’a’:’f’,(note that contrary to usual python slices, both the start and the stop
are included!)
– A boolean array
– A callable function with one argument (the calling Series, DataFrame or Panel) and that returns valid
output for indexing (one ofthe above)
New in version 0.18.1.
See more atSelectionbyLabel
• .iloc is primarily integer position based (from 0 to length-1 of the axis), but may also be used with a
boolean array. .iloc will raise IndexError if a requested indexer is out-of-bounds, except slice indexers
which allowout-of-bounds indexing. (this conforms with python/numpy slice semantics). Allowed inputs are:
– An integer e.g. 5
– A list orarray ofintegers [4, 3, 0]
– A slice object with ints 1:7
– A boolean array
– A callable function with one argument (the calling Series, DataFrame or Panel) and that returns valid
output for indexing (one ofthe above)
New in version 0.18.1.
See more atSelectionbyPosition
• .ix supports mixed integer and label based access. It is primarily label based, but will fall back to integer
positional access unless the corresponding axis is of integer type. .ix is the most general and will support any
of the inputs in.loc and .iloc. .ix also supports floating point label schemes. .ix is exceptionally useful
when dealing with mixed positional and label based hierarchical indexes.
However, when an axis is integer based,ONLY label based access and not positional access is supported. Thus,
in such cases,it’s usuallybetter to be explicit and use .iloc or .loc.
See more atAdvancedIndexingandAdvancedHierarchical.
• .loc, .iloc, .ix and also [] indexing can accept a callable as indexer. See more atSelectionBy
Callable.
Getting values from an object with multi-axes selection uses the following notation (using .loc as an example, but
applies to.iloc and .ixas well). Any of theaxesaccessors maybe the nullslice:. Axes left outofthe specification
are assumed to be :. (e.g. p.loc[’a’] is equiv to p.loc[’a’, :, :])
Object Type
Indexers
Series
s.loc[indexer]
DataFrame
df.loc[row_indexer,column_indexer]
Panel
p.loc[item_indexer,major_indexer,minor_indexer]
468
Chapter 13. Indexing and Selecting Data
pandas: powerful Python data analysis toolkit, Release 0.18.1
13.2 Basics
As mentioned when introducing the data structures inthelastsection, the primary functionofindexing with[] (a.k.a.
__getitem__ for those familiar with implementing class behavior in Python) is selecting out lower-dimensional
slices. Thus,
Object Type
Selection
Return Value Type
Series
series[label]
scalar value
DataFrame
frame[colname]
Series corresponding to colname
Panel
panel[itemname]
DataFrame corresponding to the itemname
Here we construct a simple time series data set to use forillustrating the indexing functionality:
In [1]: dates pd.date_range('1/1/2000', periods=8)
In [2]: df pd.DataFrame(np.random.randn(84), index=dates, columns=['A''B''C''D'])
In [3]: df
Out[3]:
A
B
C
D
2000-01-01
0.469112 -0.282863 -1.509059 -1.135632
2000-01-02
1.212112 -0.173215
0.119209 -1.044236
2000-01-03 -0.861849 -2.104569 -0.494929
1.071804
2000-01-04
0.721555 -0.706771 -1.039575
0.271860
2000-01-05 -0.424972
0.567020
0.276232 -1.087401
2000-01-06 -0.673690
0.113648 -1.478427
0.524988
2000-01-07
0.404705
0.577046 -1.715002 -1.039268
2000-01-08 -0.370647 -1.157892 -1.344312
0.844885
In [4]: panel pd.Panel({'one' : df, 'two' : df df.mean()})
In [5]: panel
Out[5]:
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 8 (major_axis) x 4 (minor_axis)
Items axis: one to two
Major_axis axis: 2000-01-01 00:00:00 to 2000-01-08 00:00:00
Minor_axis axis: A to D
Note: None of the indexing functionality is time series specific unless specifically stated.
Thus,as per above, we have the most basic indexing using []:
In [6]: df['A']
In [7]: s[dates[5]]
Out[7]: -0.67368970808837059
In [8]: panel['two']
Out[8]:
A
B
C
D
2000-01-01
0.409571
0.113086 -0.610826 -0.936507
2000-01-02
1.152571
0.222735
1.017442 -0.845111
2000-01-03 -0.921390 -1.708620
0.403304
1.270929
2000-01-04
0.662014 -0.310822 -0.141342
0.470985
2000-01-05 -0.484513
0.962970
1.174465 -0.888276
2000-01-06 -0.733231
0.509598 -0.580194
0.724113
2000-01-07
0.345164
0.972995 -0.816769 -0.840143
13.2. Basics
469
pandas: powerful Python data analysis toolkit, Release 0.18.1
2000-01-08 -0.430188 -0.761943 -0.446079
1.044010
You can pass a list of columns to [] to select columns in that order. If a column is not contained in the DataFrame,an
exception will be raised. Multiple columns can also be set in this manner:
In [9]: df
Out[9]:
A
B
C
D
2000-01-01
0.469112 -0.282863 -1.509059 -1.135632
2000-01-02
1.212112 -0.173215
0.119209 -1.044236
2000-01-03 -0.861849 -2.104569 -0.494929
1.071804
2000-01-04
0.721555 -0.706771 -1.039575
0.271860
2000-01-05 -0.424972
0.567020
0.276232 -1.087401
2000-01-06 -0.673690
0.113648 -1.478427
0.524988
2000-01-07
0.404705
0.577046 -1.715002 -1.039268
2000-01-08 -0.370647 -1.157892 -1.344312
0.844885
In [10]: df[['B''A']] df[['A''B']]
In [11]: df
Out[11]:
A
B
C
D
2000-01-01 -0.282863
0.469112 -1.509059 -1.135632
2000-01-02 -0.173215
1.212112
0.119209 -1.044236
2000-01-03 -2.104569 -0.861849 -0.494929
1.071804
2000-01-04 -0.706771
0.721555 -1.039575
0.271860
2000-01-05
0.567020 -0.424972
0.276232 -1.087401
2000-01-06
0.113648 -0.673690 -1.478427
0.524988
2000-01-07
0.577046
0.404705 -1.715002 -1.039268
2000-01-08 -1.157892 -0.370647 -1.344312
0.844885
You may find this useful for applying a transform (in-place) to a subset of the columns.
13.3 Attribute Access
You may access an index on a Series, column on a DataFrame,and an item on a Panel directly as an attribute:
In [12]: sa pd.Series([1,2,3],index=list('abc'))
In [13]: dfa df.copy()
In [14]: sa.b
Out[14]: 2
In [15]: dfa.A
Out[15]:
2000-01-01
-0.282863
2000-01-02
-0.173215
2000-01-03
-2.104569
2000-01-04
-0.706771
2000-01-05
0.567020
2000-01-06
0.113648
2000-01-07
0.577046
2000-01-08
-1.157892
Freq: D, Name: A, dtype: float64
In [16]: panel.one
470
Chapter 13. Indexing and Selecting Data
Documents you may be interested
Documents you may be interested