res2df 1.2.3__py2.py3-none-any.whl → 1.3.1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
res2df/common.py CHANGED
@@ -10,6 +10,7 @@ import re
10
10
  import shlex
11
11
  import signal
12
12
  import sys
13
+ from collections import defaultdict
13
14
  from pathlib import Path
14
15
  from typing import Any, Dict, List, Optional, Set, Union
15
16
 
@@ -397,7 +398,7 @@ def merge_zones(
397
398
  zone_df.index.name = "K"
398
399
  zone_df.reset_index(inplace=True)
399
400
 
400
- df[zoneheader] = df[kname].map(zonedict)
401
+ df[zoneheader] = df[kname].map(defaultdict(lambda: None, zonedict))
401
402
  return df
402
403
 
403
404
 
@@ -476,7 +477,7 @@ def fill_reverse_parser(
476
477
  """
477
478
  parser.add_argument(
478
479
  "csvfile",
479
- help="Name of CSV file with " + modulename + " data with " "res2df format",
480
+ help="Name of CSV file with " + modulename + " data with res2df format",
480
481
  )
481
482
  parser.add_argument(
482
483
  "-o",
@@ -690,7 +691,7 @@ def generic_deck_table(
690
691
 
691
692
  # NaN or Nones are assumed to be defaulted, which in Eclipse terminology is
692
693
  # the string "1*":
693
- dframe.fillna(value="1*", inplace=True)
694
+ dframe = dframe.fillna(value="1*")
694
695
 
695
696
  if drop_trailing_columns:
696
697
  for col_name in reversed(relevant_columns):
@@ -709,9 +710,9 @@ def generic_deck_table(
709
710
  }
710
711
  for int_col in integer_cols.intersection(dframe.columns):
711
712
  defaulted_rows = dframe[int_col] == "1*"
712
- dframe.loc[~defaulted_rows, int_col] = (
713
- dframe.loc[~defaulted_rows, int_col].astype(int).astype(str)
714
- )
713
+ integer_values = dframe.loc[~defaulted_rows, int_col].astype(int)
714
+ dframe[int_col] = dframe[int_col].astype(str)
715
+ dframe.loc[~defaulted_rows, int_col] = integer_values
715
716
 
716
717
  # Quote all string data. This is not always needed, but needed
717
718
  # for some colums, for example well-names containing a slash.
@@ -826,9 +827,9 @@ def stack_on_colnames(
826
827
  dframe.columns = pd.MultiIndex.from_tuples(
827
828
  tuplecolumns, names=["dummy", stackcolname]
828
829
  )
829
- dframe = dframe.stack()
830
+ dframe = dframe.stack(future_stack=True)
830
831
  staticcols = [col[0] for col in tuplecolumns if len(col) == 1]
831
- dframe[staticcols] = dframe[staticcols].fillna(method="ffill")
832
+ dframe[staticcols] = dframe[staticcols].ffill()
832
833
  dframe.reset_index(inplace=True)
833
834
  # Drop rows stemming from the NaNs in the second tuple-element for
834
835
  # static columns:
res2df/compdat.py CHANGED
@@ -615,8 +615,7 @@ def expand_wlist(wlist_df: pd.DataFrame) -> pd.DataFrame:
615
615
  and wlist_record["NAME"] not in currentstate
616
616
  ):
617
617
  raise ValueError(
618
- "WLIST ADD/DEL only works on existing well lists: "
619
- f"{str(wlist_record)}"
618
+ f"WLIST ADD/DEL only works on existing well lists: {str(wlist_record)}"
620
619
  )
621
620
  if wlist_record["ACTION"] == "ADD":
622
621
  currentstate[wlist_record["NAME"]] = " ".join(
@@ -888,14 +887,12 @@ def applywelopen(
888
887
  ].drop_duplicates(subset=["I", "J", "K1", "K2"], keep="last")
889
888
  else:
890
889
  raise ValueError(
891
- "A WELOPEN keyword contains data that could not be parsed. "
892
- f"\n {row} "
890
+ f"A WELOPEN keyword contains data that could not be parsed. \n {row} "
893
891
  )
894
892
 
895
893
  if previous_state.empty:
896
894
  raise ValueError(
897
- "A WELOPEN keyword is not acting on any existing connection. "
898
- f"\n {row} "
895
+ f"A WELOPEN keyword is not acting on any existing connection. \n {row} "
899
896
  )
900
897
 
901
898
  new_state = previous_state
res2df/csv2res.py CHANGED
@@ -90,8 +90,7 @@ def get_parser() -> argparse.ArgumentParser:
90
90
  "satfunc",
91
91
  help="Write saturation function include files",
92
92
  description=(
93
- "Write saturation function include files from CSV files with "
94
- "res2df format."
93
+ "Write saturation function include files from CSV files with res2df format."
95
94
  ),
96
95
  )
97
96
  satfunc_fill_reverse_parser(satfunc_parser)
res2df/equil.py CHANGED
@@ -298,7 +298,7 @@ def fill_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
298
298
  "-o",
299
299
  "--output",
300
300
  type=str,
301
- help=("Name of output csv file. " "Use '-' for stdout."),
301
+ help=("Name of output csv file. Use '-' for stdout."),
302
302
  default="equil.csv",
303
303
  )
304
304
  parser.add_argument(
res2df/grid.py CHANGED
@@ -686,10 +686,7 @@ def df2res(
686
686
 
687
687
  if "GLOBAL_INDEX" not in grid_df:
688
688
  logger.warning(
689
- (
690
- "Global index not found in grid dataframe. "
691
- "Assumes all cells are active"
692
- )
689
+ ("Global index not found in grid dataframe. Assumes all cells are active")
693
690
  )
694
691
  # Drop NaN rows for columns to be used (triggered by stacked
695
692
  # dates and no global index, unlikely)
res2df/gruptree.py CHANGED
@@ -9,6 +9,7 @@ import sys
9
9
  import warnings
10
10
  from typing import Any, Dict, List, Optional, Tuple, Union
11
11
 
12
+ import numpy as np
12
13
  import pandas as pd
13
14
  import treelib
14
15
 
@@ -19,6 +20,7 @@ with contextlib.suppress(ImportError):
19
20
  import opm.io
20
21
 
21
22
  from .common import (
23
+ OPMKEYWORDS,
22
24
  parse_opmio_date_rec,
23
25
  parse_opmio_deckrecord,
24
26
  parse_opmio_tstep_rec,
@@ -91,7 +93,7 @@ def df(
91
93
  # Flags which will tell when a new network related keyword
92
94
  # has been encountered
93
95
  keywords = ["GRUPTREE", "BRANPROP", "WELSPECS", "GRUPNET", "NODEPROP"]
94
- found_keywords = {key: False for key in keywords}
96
+ found_keywords = dict.fromkeys(keywords, False)
95
97
  for kword in deck:
96
98
  if kword.name in ["DATES", "START", "TSTEP"]:
97
99
  # Whenever we encounter a new DATES, it means that
@@ -107,7 +109,7 @@ def df(
107
109
  edgerecords += _write_edgerecords(
108
110
  currentedges, nodedata, wellspecsedges, found_keywords, date
109
111
  )
110
- found_keywords = {key: False for key in keywords}
112
+ found_keywords = dict.fromkeys(keywords, False)
111
113
  # Done dumping the data for the previous date, parse the fresh
112
114
  # date:
113
115
  if kword.name in ["DATES", "START"]:
@@ -164,6 +166,17 @@ def df(
164
166
  currentedges, nodedata, wellspecsedges, found_keywords, date
165
167
  )
166
168
  dframe = pd.DataFrame(edgerecords)
169
+
170
+ string_cols = {"PARENT", "CHILD"}
171
+ for keyword in ["GRUPTREE", "BRANPROP", "NODEPROP", "GRUPNET", "WELSPECS"]:
172
+ string_cols |= {
173
+ item["name"]
174
+ for item in OPMKEYWORDS[keyword]["items"]
175
+ if item["value_type"] == "STRING"
176
+ }
177
+ for col in string_cols:
178
+ if col in dframe:
179
+ dframe[col] = dframe[col].replace(np.nan, None)
167
180
  if "DATE" in dframe:
168
181
  dframe["DATE"] = pd.to_datetime(dframe["DATE"])
169
182
 
res2df/pvt.py CHANGED
@@ -375,7 +375,7 @@ def df2res_rock(dframe: pd.DataFrame, comment: Optional[str] = None) -> str:
375
375
  return "-- No data!"
376
376
  string = "ROCK\n"
377
377
  string += comment_formatter(comment)
378
- string += "-- {'PRESSURE':^21} {'COMPRESSIBILITY':^21}\n"
378
+ string += f"-- {'PRESSURE':^21} {'COMPRESSIBILITY':^21}\n"
379
379
  # Use everything if KEYWORD not in dframe..
380
380
  subset = dframe if "KEYWORD" not in dframe else dframe[dframe["KEYWORD"] == "ROCK"]
381
381
  if "PVTNUM" not in subset:
res2df/rft.py CHANGED
@@ -90,8 +90,8 @@ def _rftrecords2df(rftfile: ResdataFile) -> pd.DataFrame:
90
90
  nav_df.loc[nav_df["recordname"] == "TIME", "timeindex"] = nav_df[
91
91
  nav_df["recordname"] == "TIME"
92
92
  ].index
93
- nav_df.fillna(
94
- method="ffill", inplace=True
93
+ nav_df.ffill(
94
+ inplace=True
95
95
  ) # forward fill (because any record is associated to the previous TIME record)
96
96
  nav_df["timeindex"] = nav_df["timeindex"].astype(int)
97
97
  logger.info(
@@ -242,7 +242,7 @@ def process_seg_topology(seg_data: pd.DataFrame) -> pd.DataFrame:
242
242
  seg_data = seg_data.sort_values("SEGIDX")
243
243
  # For the first segment, None is allowed as SEGNXT, which excludes
244
244
  # int as a Pandas type. Convert to 0 for the moment
245
- seg_data["SEGNXT"] = seg_data["SEGNXT"].fillna(value=0).astype(int)
245
+ seg_data["SEGNXT"] = seg_data["SEGNXT"].fillna(value="0").astype(int)
246
246
 
247
247
  # Outer merge first to add the upstream segment information to every row.
248
248
  merged = pd.merge(
@@ -481,14 +481,14 @@ def add_extras(dframe: pd.DataFrame, inplace: bool = True) -> pd.DataFrame:
481
481
  dframe = dframe.copy()
482
482
 
483
483
  if "CONPRES" in dframe and "SEGPRES" in dframe:
484
- dframe["COMPLETION_DP"] = 0
484
+ dframe["COMPLETION_DP"] = 0.0
485
485
  nonzero_pres = (dframe["CONPRES"] > 0) & (dframe["SEGPRES"] > 0)
486
486
  dframe.loc[nonzero_pres, "COMPLETION_DP"] = (
487
487
  dframe.loc[nonzero_pres, "CONPRES"] - dframe.loc[nonzero_pres, "SEGPRES"]
488
488
  )
489
489
 
490
490
  if not dframe.empty:
491
- dframe["DRAWDOWN"] = 0 # Set a default so that the column always exists
491
+ dframe["DRAWDOWN"] = 0.0 # Set a default so that the column always exists
492
492
 
493
493
  if "CONPRES" in dframe and "PRESSURE" in dframe:
494
494
  nonzero_conpres = dframe["CONPRES"] > 0
res2df/satfunc.py CHANGED
@@ -144,9 +144,9 @@ def interpolate_defaults(dframe: pd.DataFrame) -> pd.DataFrame:
144
144
  can consist of multiple SATNUMs.
145
145
  """
146
146
  sat_cols: set = {"SW", "SO", "SG", "SL"}.intersection(dframe.columns)
147
- assert (
148
- len(sat_cols) == 1
149
- ), f"Could not determine a single saturation column in {dframe.columns}"
147
+ assert len(sat_cols) == 1, (
148
+ f"Could not determine a single saturation column in {dframe.columns}"
149
+ )
150
150
  sat_col = list(sat_cols)[0]
151
151
 
152
152
  if dframe[sat_col].isna().any():
@@ -154,11 +154,12 @@ def interpolate_defaults(dframe: pd.DataFrame) -> pd.DataFrame:
154
154
 
155
155
  filled_frames = []
156
156
  for _, subframe in dframe.groupby("SATNUM"):
157
- filled_frames.append(
158
- subframe.set_index(sat_col)
159
- .interpolate(method="index", limit_area="inside")
160
- .reset_index()
157
+ subframe.set_index(sat_col, inplace=True)
158
+ numeric_columns = subframe.select_dtypes(include=["float", "int"]).columns
159
+ subframe[numeric_columns] = subframe[numeric_columns].interpolate(
160
+ method="index", limit_area="inside"
161
161
  )
162
+ filled_frames.append(subframe.reset_index())
162
163
  return pd.concat(filled_frames)
163
164
 
164
165
 
res2df/summary.py CHANGED
@@ -461,7 +461,9 @@ def _ensure_unique_datetime_index(dframe: pd.DataFrame) -> pd.DataFrame:
461
461
 
462
462
  if dframe.attrs["meta"]["TIMESTEP"]["unit"] == "DAYS":
463
463
  for idx in np.where(index_duplicates)[0]:
464
- index_as_list[idx] += dt.timedelta(days=dframe["TIMESTEP"][idx])
464
+ index_as_list[idx] += dt.timedelta(
465
+ days=dframe["TIMESTEP"].iloc[idx]
466
+ )
465
467
  elif dframe.attrs["meta"]["TIMESTEP"]["unit"] == "HOURS":
466
468
  for idx in np.where(index_duplicates)[0]:
467
469
  index_as_list[idx] += dt.timedelta(hours=dframe["TIMESTEP"][idx])
@@ -761,9 +763,7 @@ def fill_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
761
763
  "-o",
762
764
  "--output",
763
765
  type=str,
764
- help=(
765
- "Name of output file. Use '-' to write to stdout. " "Default 'summary.csv'"
766
- ),
766
+ help=("Name of output file. Use '-' to write to stdout. Default 'summary.csv'"),
767
767
  default="summary.csv",
768
768
  )
769
769
  parser.add_argument("--arrow", action="store_true", help="Write to pyarrow format")
res2df/version.py CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.2.3'
16
- __version_tuple__ = version_tuple = (1, 2, 3)
15
+ __version__ = version = '1.3.1'
16
+ __version_tuple__ = version_tuple = (1, 3, 1)
@@ -1,12 +1,12 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: res2df
3
- Version: 1.2.3
3
+ Version: 1.3.1
4
4
  Summary: Convert reservoir simulator input and output to DataFrames
5
5
  Home-page: http://github.com/equinor/res2df
6
6
  Author: Håvard Berland
7
7
  Author-email: havb@equinor.com
8
8
  License: GPLv3
9
- Requires-Python: >=3.8
9
+ Requires-Python: >=3.11
10
10
  Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
12
  Requires-Dist: resdata>=5.0.0-b0
@@ -17,34 +17,44 @@ Requires-Dist: pandas
17
17
  Requires-Dist: pyarrow
18
18
  Requires-Dist: pyyaml>=5.1
19
19
  Requires-Dist: treelib
20
- Provides-Extra: docs
21
- Requires-Dist: autoapi; extra == "docs"
22
- Requires-Dist: ipython; extra == "docs"
23
- Requires-Dist: rstcheck; extra == "docs"
24
- Requires-Dist: setuptools; extra == "docs"
25
- Requires-Dist: sphinx<7; extra == "docs"
26
- Requires-Dist: sphinx-argparse; extra == "docs"
27
- Requires-Dist: sphinx-autodoc-typehints; extra == "docs"
28
- Requires-Dist: sphinx-rtd-theme; extra == "docs"
29
- Provides-Extra: ert
30
- Requires-Dist: ert>=10.2.0b13; extra == "ert"
31
- Provides-Extra: style
32
- Requires-Dist: pre-commit; extra == "style"
33
20
  Provides-Extra: tests
34
21
  Requires-Dist: networkx; extra == "tests"
35
22
  Requires-Dist: pytest; extra == "tests"
36
23
  Requires-Dist: pytest-cov; extra == "tests"
37
24
  Requires-Dist: pytest-mock; extra == "tests"
38
25
  Requires-Dist: pytest-timeout; extra == "tests"
26
+ Provides-Extra: style
27
+ Requires-Dist: pre-commit; extra == "style"
39
28
  Provides-Extra: types
40
29
  Requires-Dist: mypy; extra == "types"
41
30
  Requires-Dist: types-PyYAML; extra == "types"
42
31
  Requires-Dist: types-python-dateutil; extra == "types"
43
32
  Requires-Dist: types-setuptools; extra == "types"
33
+ Provides-Extra: docs
34
+ Requires-Dist: autoapi; extra == "docs"
35
+ Requires-Dist: ipython; extra == "docs"
36
+ Requires-Dist: rstcheck; extra == "docs"
37
+ Requires-Dist: setuptools; extra == "docs"
38
+ Requires-Dist: sphinx<7; extra == "docs"
39
+ Requires-Dist: sphinx-argparse; extra == "docs"
40
+ Requires-Dist: sphinx-autodoc-typehints; extra == "docs"
41
+ Requires-Dist: sphinx_rtd_theme; extra == "docs"
42
+ Provides-Extra: ert
43
+ Requires-Dist: ert>=10.2.0b13; extra == "ert"
44
+ Dynamic: author
45
+ Dynamic: author-email
46
+ Dynamic: description
47
+ Dynamic: description-content-type
48
+ Dynamic: home-page
49
+ Dynamic: license
50
+ Dynamic: provides-extra
51
+ Dynamic: requires-dist
52
+ Dynamic: requires-python
53
+ Dynamic: summary
44
54
 
45
55
  [![Build Status](https://img.shields.io/github/workflow/status/equinor/res2df/res2df)](https://github.com/equinor/res2df/actions?query=workflow%3Ares2df)
46
56
  [![codecov](https://codecov.io/gh/equinor/res2df/graph/badge.svg?token=3sZBGGu5VG)](https://codecov.io/gh/equinor/res2df)
47
- [![Python 3.8-3.12](https://img.shields.io/badge/python-3.8%20|%203.9%20|%203.10%20|%203.11%20|%203.12-blue.svg)](https://www.python.org)
57
+ [![Python 3.11-3.12](https://img.shields.io/badge/python-3.11%20|%203.12-blue.svg)](https://www.python.org)
48
58
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
49
59
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
50
60
 
@@ -1,28 +1,28 @@
1
1
  res2df/__init__.py,sha256=M4U5Q5zJ-W0ni3YcDBs_ZobKVW6ZLAmQXspbZEOqkwo,601
2
2
  res2df/__version__.py,sha256=UtExCuqQ29NY2we1bzLXvNkP21JU7hx1wXM4G1uPvts,128
3
- res2df/common.py,sha256=ebxkV5rFzOGOaaX9J5bm-OeLJd27PtvY14pRVt-GTj0,34772
4
- res2df/compdat.py,sha256=YSKSY65OsJhl0I8TDd0PHvboGBngpkUMzWCIITYcTmo,36853
3
+ res2df/common.py,sha256=9hK4g-0PDVb9HUv96DJ0Spx-yYCGT8ceL_huDjP-UDE,34887
4
+ res2df/compdat.py,sha256=TVIXdK8HKYfbOQX2TnI63Xt0UNPjI3E9mFC1_Vb0AAc,36796
5
5
  res2df/constants.py,sha256=0W-ZYlm3Bbe9MONrRhA0c4yLXfJlqGX5apFN64i8RU0,258
6
- res2df/csv2res.py,sha256=rKVHWIoQ6yLRlq22747jKP9XbunJ791F7emBS2N8xNA,4033
7
- res2df/equil.py,sha256=Ifg4hGZ72w1NDStcWyq5KB9VNgLUvSKheBHO7bAo23c,17178
6
+ res2df/csv2res.py,sha256=f_27wjKXMUWnsYVBF1cFxSe4ePOGntZmUP7VDoZ9N7w,4018
7
+ res2df/equil.py,sha256=NIJwAgbpjJg0pxsqfxPB86d2rdAVMNJBKsJsoG6ExxU,17175
8
8
  res2df/faults.py,sha256=5v4cWcEmIQwG8TXBBsiteT_3kCNO0noNiAiOZ6JC-80,3163
9
9
  res2df/fipreports.py,sha256=msZgrUfpQaZppboQgAwVOtReQHKepdsgwJ9lNAcrt0Y,7631
10
- res2df/grid.py,sha256=t630kJk_rWGdbNZBcuGeT74q7zPHOSrSJP1sYmZG5RI,27729
11
- res2df/gruptree.py,sha256=7S_ecXQkCzIJNik3Iz049ZRZ2Zq6eK2_tRnJkODRuBU,16498
10
+ res2df/grid.py,sha256=wlwwsRSfxFAI8YV8x6_VyKXKwnmC1376RtCTNb51wvs,27680
11
+ res2df/gruptree.py,sha256=JXLacbT2CNADOIVuh1NkeOmmXYLY_09TzDsoGUGr8To,16923
12
12
  res2df/inferdims.py,sha256=ur0GE1ASzfzoXPgUjaow46NWBlBCgiX6qfAmn8HJatg,7329
13
13
  res2df/nnc.py,sha256=qEPuAhTFwmZuClxaKsrBh28HlLquE0-XH7ams4ylt50,9346
14
14
  res2df/parameters.py,sha256=pkgmW5tVtyMav1T43RxdYHnoejvnZarFhKfhhgp028U,6277
15
15
  res2df/pillars.py,sha256=NXFZhcd4L0pRFLH3B3ip_3ClVuy8Dgz13m4QW4mZDfA,16174
16
- res2df/pvt.py,sha256=3PfsQst6Nz3LUvMPZOha5sdwdu7U7leZQRrgcFMf_uE,22645
16
+ res2df/pvt.py,sha256=JNmCUvaNBnq-SUdmnxkt9n3rkR-HUneiHJBfINACVfU,22646
17
17
  res2df/res2csv.py,sha256=aKqSHNTNXxMb3Ahwh1Cx2BSx7bXV3dSGxhjuPznDABA,12080
18
18
  res2df/res2csvlogger.py,sha256=rsg1IweNsOiP2zHoYqpipQxW2FbvSIN5XNOlQHXfUqo,2328
19
19
  res2df/resdatafiles.py,sha256=xBW3GewottrdFqpj4LxGKjCbfLEPC0H7Odw1Mn1ls_U,10093
20
- res2df/rft.py,sha256=cA-D4wNLj_YbriOsr2CEGZHvwBWxr2VS5mdEXj5x2Go,28093
21
- res2df/satfunc.py,sha256=ms1SMMg2XqE5SbGyf1ot_dxEzChbGgVfRkq6n9Gj778,13658
22
- res2df/summary.py,sha256=ikn--zBfC-CBpBs2JV5h5kDu1h4iAwpvZGjm258Gl9c,31685
20
+ res2df/rft.py,sha256=ptf-tqc10tpYN2B7W-onC-s20Ct2GRK65oD9ojG0O4w,28082
21
+ res2df/satfunc.py,sha256=sxoqXsORI5xijD0RSybr6unm-sQNpUckXFNwHEtVdv8,13808
22
+ res2df/summary.py,sha256=sa0OH9Nle1uaTRMN33XL69Lyl66876OX01ZJ_kISxSI,31711
23
23
  res2df/svg_color_keyword_names.txt,sha256=yiI2Ohv3NxxEAJC5OjVERZi7MLi2-bk7okyI5-xFDr8,1456
24
24
  res2df/trans.py,sha256=fWlelN74QPnxm5krWYXIGxhRZKVJA2r1lHXE-Ac1DuI,10880
25
- res2df/version.py,sha256=VUBVzEBuW57s195P22MF-rLGH7GWx3G_z5nV-l_8MBE,411
25
+ res2df/version.py,sha256=cOVPCvD2h2G_2KB6G3ddreYkIQfAnS6WqgAkF_qgGOQ,411
26
26
  res2df/wcon.py,sha256=67A2qtqokaefLyI5mdTaGkTlkSkDIRhVNVYA-8TE9oE,3376
27
27
  res2df/wellcompletiondata.py,sha256=s4PvMNYBcgSJzPE6_so6suxgeI_fzHbDzA8kHxen-AA,10990
28
28
  res2df/wellconnstatus.py,sha256=KPteMgwomDpp11rAkmN5GTLMEdS79Ah0QEFdG0VSu-E,4055
@@ -81,9 +81,9 @@ res2df/vfp/_vfpcommon.py,sha256=0no9r1jwGaABXexZ6WoKrOl2fFq87RMmcRZLE640cnk,7053
81
81
  res2df/vfp/_vfpdefs.py,sha256=yvi5nCkJ2UZxVx0LuVbBHLNjn0e0UCSZudmzvTk689A,7028
82
82
  res2df/vfp/_vfpinj.py,sha256=-QgT0hKBd7mW9VcEaROtwOdxJlZlutRHCNp9wiED6jM,23594
83
83
  res2df/vfp/_vfpprod.py,sha256=0ar8v1JUFy3f4ezofdwCsq5Xricg6tQArre9rjI5Ol0,36743
84
- res2df-1.2.3.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
85
- res2df-1.2.3.dist-info/METADATA,sha256=QFpFKjFTeGtuTDiLnR_7RsdK34HAZ-h2BkhqvAhmGE4,3150
86
- res2df-1.2.3.dist-info/WHEEL,sha256=OpXWERl2xLPRHTvd2ZXo_iluPEQd8uSbYkJ53NAER_Y,109
87
- res2df-1.2.3.dist-info/entry_points.txt,sha256=MEFyOYIu-X3ZCgqZIE6t8EnmZ3xGvMAj8VMkJdi_lZY,164
88
- res2df-1.2.3.dist-info/top_level.txt,sha256=U8AZBqrFHm9PMXg0toCfHJ817VfFtdKQpc8JuS5qToM,7
89
- res2df-1.2.3.dist-info/RECORD,,
84
+ res2df-1.3.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
85
+ res2df-1.3.1.dist-info/METADATA,sha256=6jgXWz_jzV8ApovvFVMzJm75RLfcuCmAy3gJ_Df9R8c,3339
86
+ res2df-1.3.1.dist-info/WHEEL,sha256=9Hm2OB-j1QcCUq9Jguht7ayGIIZBRTdOXD1qg9cCgPM,109
87
+ res2df-1.3.1.dist-info/entry_points.txt,sha256=MEFyOYIu-X3ZCgqZIE6t8EnmZ3xGvMAj8VMkJdi_lZY,164
88
+ res2df-1.3.1.dist-info/top_level.txt,sha256=U8AZBqrFHm9PMXg0toCfHJ817VfFtdKQpc8JuS5qToM,7
89
+ res2df-1.3.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any