-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdata.html
More file actions
371 lines (308 loc) · 36.3 KB
/
Copy pathdata.html
File metadata and controls
371 lines (308 loc) · 36.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>prms_python.data — PRMS-Python v1.0.0</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="shortcut icon" href="../../_static/prms-python-32x.png"/>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link href='https://fonts.googleapis.com/css?family=Ubuntu+Mono|Pacifico|Open+Sans|Metrophobic' rel='stylesheet' type='text/css'>
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for prms_python.data</h1><div class="highlight"><pre>
<span></span><span class="sd">'''</span>
<span class="sd">data.py -- holds ``Data`` class for standard PRMS climate input data.</span>
<span class="sd">'''</span>
<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
<span class="kn">from</span> <span class="nn">shutil</span> <span class="k">import</span> <span class="n">copyfile</span>
<div class="viewcode-block" id="Data"><a class="viewcode-back" href="../../api.html#prms_python.Data">[docs]</a><span class="k">class</span> <span class="nc">Data</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Object to access or create a PRMS data file with ability to load/assign it to a </span>
<span class="sd"> date-time indexed pandas.DataFrame for data management, analysis and visualization. </span>
<span class="sd"> It can be used to build a new PRMS data file from user defined metadata and a </span>
<span class="sd"> ``pandas.DataFrame`` of PRMS datetime-indexed climatic forcing and observation </span>
<span class="sd"> variables.</span>
<span class="sd"> The class properties ``metadata`` and ``data_frame`` can be later assigned if no</span>
<span class="sd"> ``base_file`` is given on initialization, allowing for the creation of PRMS climatic</span>
<span class="sd"> forcing file in a Python environment.</span>
<span class="sd"> Keyword Arguments:</span>
<span class="sd"> base_file (str, optional): path to standard PRMS data file </span>
<span class="sd"> na_rep (int, optional): how to represent missing values default = -999</span>
<span class="sd"> Attributes:</span>
<span class="sd"> date_header (list): date and time header for PRMS data file </span>
<span class="sd"> valid_input_variables (tuple): valid hydro-climate variables for PRMS data file</span>
<span class="sd"> Note:</span>
<span class="sd"> If using the ``Data`` class to create a new data file, it is up to the user</span>
<span class="sd"> to ensure that the metadata and :class:`pandas.DataFrame` assigned are correct </span>
<span class="sd"> and compatible. </span>
<span class="sd"> """</span>
<span class="c1">## data file constant attributes</span>
<span class="n">date_header</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'year'</span><span class="p">,</span>
<span class="s1">'month'</span><span class="p">,</span>
<span class="s1">'day'</span><span class="p">,</span>
<span class="s1">'hh'</span><span class="p">,</span>
<span class="s1">'mm'</span><span class="p">,</span>
<span class="s1">'sec'</span><span class="p">]</span>
<span class="n">valid_input_variables</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'gate_ht'</span><span class="p">,</span>
<span class="s1">'humidity'</span><span class="p">,</span>
<span class="s1">'lake_elev'</span><span class="p">,</span>
<span class="s1">'pan_evap'</span><span class="p">,</span>
<span class="s1">'precip'</span><span class="p">,</span>
<span class="s1">'rain_day'</span><span class="p">,</span>
<span class="s1">'runoff'</span><span class="p">,</span>
<span class="s1">'snowdepth'</span><span class="p">,</span>
<span class="s1">'solrad'</span><span class="p">,</span>
<span class="s1">'tmax'</span><span class="p">,</span>
<span class="s1">'tmin'</span><span class="p">,</span>
<span class="s1">'wind_speed'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">base_file</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">na_rep</span><span class="o">=-</span><span class="mi">999</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">base_file</span> <span class="o">=</span> <span class="n">base_file</span>
<span class="bp">self</span><span class="o">.</span><span class="n">na_rep</span> <span class="o">=</span> <span class="n">na_rep</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_metadata</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span> <span class="o">=</span> <span class="kc">None</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">metadata</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> :obj:`dict`:A property that gets and sets the header information from </span>
<span class="sd"> a standard PRMS climate input data file held in a Python dictionary. As </span>
<span class="sd"> a property it can be assigned directly to overwrite or create a new PRMS </span>
<span class="sd"> data file. As such the user is in control and must supply the correct </span>
<span class="sd"> syntax for PRMS standard data files, e.g. text lines before header should </span>
<span class="sd"> begin with "//". Here is an example of the information gathered and held in </span>
<span class="sd"> this attribute:</span>
<span class="sd"> Example:</span>
<span class="sd"> >>> data.metadata</span>
<span class="sd"> {</span>
<span class="sd"> 'data_startline' : 6,</span>
<span class="sd"> 'data_variables' : ['runoff 1', 'runoff 2', 'tmin', 'tmax', 'ppt']</span>
<span class="sd"> 'text_before_header' : "Title of data file \\n //some comments\\nrunoff 2</span>
<span class="sd"> \\ntmin 1\\ntmax 1\\nppt 1\\nrunoff 2\\ntmin 1</span>
<span class="sd"> \\ntmax 1\\nppt 1\\n</span>
<span class="sd"> ########################################\\n"</span>
<span class="sd"> } </span>
<span class="sd"> </span>
<span class="sd"> Note:</span>
<span class="sd"> When assigning or creating a new data file, the ``Data.write`` method will</span>
<span class="sd"> assign the appropriate date header that follows the line of number signs "#".</span>
<span class="sd"> Raises:</span>
<span class="sd"> ValueError: if data in metadata is accessed before data is assigned, </span>
<span class="sd"> e.g. if accessed to write a PRMS data file from a ``Data`` instance </span>
<span class="sd"> that was initialized without a valid PRMS data file.</span>
<span class="sd"> TypeError: if an object that is not a Python dictionary is assigned.</span>
<span class="sd"> </span>
<span class="sd"> """</span>
<span class="c1"># to avoid overwriting pre-assigned data, check if already exists</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_metadata</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_metadata</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_file</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'No data file was given on initialization'</span><span class="p">)</span>
<span class="c1">## starting list for variable names in data file</span>
<span class="n">input_data_names</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">text_before_header</span> <span class="o">=</span> <span class="nb">str</span><span class="p">()</span>
<span class="c1">## open data file and read header information</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">base_file</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">inf</span><span class="p">:</span>
<span class="k">for</span> <span class="n">idx</span><span class="p">,</span><span class="n">l</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">inf</span><span class="p">):</span>
<span class="n">text_before_header</span><span class="o">+=</span><span class="n">l</span>
<span class="k">if</span> <span class="n">idx</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="c1">## first line always string identifier of the file- may use later</span>
<span class="n">data_head</span> <span class="o">=</span> <span class="n">l</span><span class="o">.</span><span class="n">rstrip</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">l</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'/'</span><span class="p">):</span> <span class="c1">## comment lines</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">l</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">Data</span><span class="o">.</span><span class="n">valid_input_variables</span><span class="p">):</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">l</span><span class="o">.</span><span class="n">split</span><span class="p">()</span> <span class="c1">## split, first name and second number of columns</span>
<span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="n">h</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span> <span class="c1">## more than one input time series of a particular variable</span>
<span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">h</span><span class="p">[</span><span class="mi">1</span><span class="p">])):</span>
<span class="n">tmp</span> <span class="o">=</span> <span class="s1">'</span><span class="si">{var_name}</span><span class="s1"> </span><span class="si">{var_ind}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">var_name</span> <span class="o">=</span> <span class="n">h</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">var_ind</span> <span class="o">=</span> <span class="n">el</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
<span class="n">input_data_names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tmp</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">int</span><span class="p">(</span><span class="n">h</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">input_data_names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">h</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">if</span> <span class="n">l</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'#'</span><span class="p">):</span> <span class="c1">## end of header info and begin time series input data</span>
<span class="n">data_startline</span> <span class="o">=</span> <span class="n">idx</span><span class="o">+</span><span class="mi">1</span> <span class="c1">## 0 indexed line of first data entry</span>
<span class="k">break</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_metadata</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">([(</span><span class="s1">'data_startline'</span><span class="p">,</span><span class="n">data_startline</span><span class="p">),</span>
<span class="p">(</span><span class="s1">'data_variables'</span><span class="p">,</span><span class="n">input_data_names</span><span class="p">),</span>
<span class="p">(</span><span class="s1">'text_before_header'</span><span class="p">,</span><span class="n">text_before_header</span><span class="p">)])</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_metadata</span>
<span class="nd">@metadata</span><span class="o">.</span><span class="n">setter</span>
<span class="k">def</span> <span class="nf">metadata</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dic</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dic</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Must assign a Python dictionary for new Data object/file metadata'</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_metadata</span> <span class="o">=</span> <span class="n">dic</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">data_frame</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> A property that gets and sets the climatic forcing data for a standard PRMS </span>
<span class="sd"> climate input data file as a :class:`pandas.DataFrame`.</span>
<span class="sd"> Example:</span>
<span class="sd"> d is a Data instance, calling </span>
<span class="sd"> </span>
<span class="sd"> >>> d.data_frame </span>
<span class="sd"> input variables runoff 1 runoff 2 runoff 3 precip tmax tmin</span>
<span class="sd"> date </span>
<span class="sd"> 1996-12-27 0.54 1.6 NaN 0.0 46 32.0</span>
<span class="sd"> 1996-12-28 0.65 1.6 NaN 0.0 45 24.0</span>
<span class="sd"> 1996-12-29 0.80 1.6 NaN 0.0 44 28.0</span>
<span class="sd"> 1996-12-30 0.90 1.6 NaN 0.0 51 33.0</span>
<span class="sd"> 1996-12-31 1.00 1.7 NaN 0.0 47 32.0 </span>
<span class="sd"> </span>
<span class="sd"> shows the date-indexed ``pd.DataFrame`` of the input data that is created </span>
<span class="sd"> when a ``Data`` object is initiated if given a valid ``base_file``, i.e. </span>
<span class="sd"> file path to a PRMS climate data file. </span>
<span class="sd"> Raises:</span>
<span class="sd"> ValueError: if attribute is accessed before either assigning a PRMS data</span>
<span class="sd"> file on ``Data`` initialization or not assigning a compatabile </span>
<span class="sd"> date-indexed ``pandas.DataFrame`` of hydro-climate variables. </span>
<span class="sd"> TypeError: if a data type other than ``pandas.DataFrame`` is assigned. </span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_metadata</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">metadata</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span><span class="p">,</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_file</span> <span class="o">==</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'No data base_file given on initialization, '</span>\
<span class="s1">'therefore you must assign a DataFrame'</span>\
<span class="o">+</span><span class="s1">' before accessing the .data_frame attribute!'</span><span class="p">)</span>
<span class="c1"># to avoid overwriting pre-assigned data</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span><span class="p">,</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span>
<span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">base_file</span><span class="p">,</span> <span class="n">header</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">skiprows</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">metadata</span><span class="p">[</span><span class="s1">'data_startline'</span><span class="p">],</span>
<span class="n">delim_whitespace</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">na_values</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">na_rep</span><span class="p">])</span> <span class="c1">## read data file</span>
<span class="n">df</span><span class="o">.</span><span class="n">columns</span> <span class="o">=</span> <span class="n">Data</span><span class="o">.</span><span class="n">date_header</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">metadata</span><span class="p">[</span><span class="s1">'data_variables'</span><span class="p">]</span>
<span class="n">date</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">Series</span><span class="p">(</span><span class="n">pd</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="n">df</span><span class="o">.</span><span class="n">year</span> <span class="o">*</span> <span class="mi">10000</span> <span class="o">+</span> <span class="n">df</span><span class="o">.</span><span class="n">month</span> <span class="o">*</span> <span class="mi">100</span> <span class="o">+</span>\
<span class="n">df</span><span class="o">.</span><span class="n">day</span><span class="p">,</span> <span class="nb">format</span> <span class="o">=</span> <span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">'</span><span class="p">),</span> <span class="n">index</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">index</span><span class="p">)</span>
<span class="n">df</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="n">date</span><span class="p">)</span> <span class="c1">## assign datetime index</span>
<span class="n">df</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="n">Data</span><span class="o">.</span><span class="n">date_header</span><span class="p">,</span> <span class="n">axis</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">inplace</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="c1">## unneeded columns</span>
<span class="n">df</span><span class="o">.</span><span class="n">columns</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s1">'input variables'</span> <span class="p">;</span> <span class="n">df</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s1">'date'</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span> <span class="o">=</span> <span class="n">df</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span>
<span class="nd">@data_frame</span><span class="o">.</span><span class="n">setter</span>
<span class="k">def</span> <span class="nf">data_frame</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">df</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">df</span><span class="p">,</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"Must assign a Pandas.DataFrame object for PRMS data input"</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span> <span class="o">=</span> <span class="n">df</span>
<div class="viewcode-block" id="Data.modify"><a class="viewcode-back" href="../../api.html#prms_python.Data.modify">[docs]</a> <span class="k">def</span> <span class="nf">modify</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">vars_to_adjust</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Apply a user defined function to one or more variable(s) in the data file.</span>
<span class="sd"> The ``modify`` method allows for inplace modification of one or more </span>
<span class="sd"> time series inputs in the data file based on a user defined function. </span>
<span class="sd"> </span>
<span class="sd"> Arguments:</span>
<span class="sd"> func (function): function to apply to each variable in vars_to_adjust</span>
<span class="sd"> vars_to_adjust (list or tuple): collection of variable names to apply func to.</span>
<span class="sd"> Returns: </span>
<span class="sd"> None</span>
<span class="sd"> Example:</span>
<span class="sd"> Here is an example of loading a data file, modifying the temperature inputs </span>
<span class="sd"> (*tmin* and *tmax*) by adding two degrees to each element, and rewritting the </span>
<span class="sd"> modified data to disk,</span>
<span class="sd"> >>> d = Data('path_to_data_file')</span>
<span class="sd"> >>> def f(x):</span>
<span class="sd"> return x + 2</span>
<span class="sd"> >>> d.modify(f,['tmax','tmin'])</span>
<span class="sd"> >>> d.write('data_temp_plus_2')</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span><span class="p">,</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data_frame</span> <span class="c1"># will raise ValueError from data_frame property</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">vars_to_adjust</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span><span class="p">[</span><span class="n">v</span><span class="p">]</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="n">func</span><span class="p">)</span></div>
<div class="viewcode-block" id="Data.write"><a class="viewcode-back" href="../../api.html#prms_python.Data.write">[docs]</a> <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">out_path</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Writes the current state of the ``Data`` to PRMS text format</span>
<span class="sd"> utilizing the ``Data.metadata`` and ``Data.data_frame`` instance</span>
<span class="sd"> properties. If ``Data.data_frame`` was never accessed or assigned</span>
<span class="sd"> new values then this method simply copies the original PRMS</span>
<span class="sd"> data file to ``out_path``.</span>
<span class="sd"> Arguments:</span>
<span class="sd"> out_path (str): full path to save or copy the current PRMS data </span>
<span class="sd"> in PRMS text format.</span>
<span class="sd"> Returns:</span>
<span class="sd"> None</span>
<span class="sd"> Raises:</span>
<span class="sd"> ValueError: if the ``write`` method is called without assigning either </span>
<span class="sd"> an initial data (``base_file``) path or assigning correct ``metadata`` </span>
<span class="sd"> and ``data_frame`` properties. </span>
<span class="sd"> """</span>
<span class="c1"># if file data was never accessed- unchanged</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span><span class="p">,</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_file</span><span class="p">:</span>
<span class="n">copyfile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">base_file</span><span class="p">,</span> <span class="n">out_path</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span> <span class="c1"># if data not from original file and dataframe never assigned</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'No data base_file was given and'</span>\
<span class="o">+</span><span class="s1">' no data was assigned!'</span><span class="p">)</span>
<span class="c1">## reconstruct PRMS data file format, don't overwrite date-indexed</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">df</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">metadata</span><span class="p">[</span><span class="s1">'data_variables'</span><span class="p">]]</span>
<span class="n">df</span><span class="p">[</span><span class="s1">'year'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">year</span>
<span class="n">df</span><span class="p">[</span><span class="s1">'month'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">month</span>
<span class="n">df</span><span class="p">[</span><span class="s1">'day'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data_frame</span><span class="o">.</span><span class="n">index</span><span class="o">.</span><span class="n">day</span>
<span class="n">df</span><span class="p">[</span><span class="s1">'hh'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">'mm'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">'sec'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">df</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="n">Data</span><span class="o">.</span><span class="n">date_header</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_metadata</span><span class="p">[</span><span class="s1">'data_variables'</span><span class="p">]]</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">out_path</span><span class="p">,</span><span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">outf</span><span class="p">:</span> <span class="c1"># write comment header then data</span>
<span class="n">outf</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_metadata</span><span class="p">[</span><span class="s1">'text_before_header'</span><span class="p">])</span>
<span class="n">df</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="n">outf</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s1">' '</span><span class="p">,</span> <span class="n">header</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>\
<span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">na_rep</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">na_rep</span><span class="p">)</span></div></div>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo">
<a href="../../index.html">
<img class="logo" src="../../_static/prms-python-200x.png" alt="Logo"/>
</a>
</p>
<p>
<iframe src="https://ghbtns.com/github-btn.html?user=PRMS-Python&repo=docs&type=watch&count=true&size=large&v=2"
allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
</p>
<h3>Navigation</h3>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../tutorial.html">Tutorial and Recipes</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../tutorial.html#example-parameter-sensitivity">Example: Parameter sensitivity</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../cli.html">Command-Line Interface</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api.html">API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api.html#indices-and-tables">Indices and tables</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
<li><a href="../index.html">Module code</a><ul>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
©2016, John Volk and Matthew Turner.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.7.6</a>
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.11</a>
</div>
</body>
</html>