py2ls 0.1.10.26__py3-none-any.whl → 0.1.10.27__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.
py2ls/ips.py
CHANGED
@@ -46,7 +46,7 @@ from collections import Counter
|
|
46
46
|
from fuzzywuzzy import fuzz, process
|
47
47
|
from langdetect import detect
|
48
48
|
from duckduckgo_search import DDGS
|
49
|
-
|
49
|
+
from typing import List, Optional, Union
|
50
50
|
from bs4 import BeautifulSoup
|
51
51
|
|
52
52
|
from . import netfinder
|
@@ -1250,6 +1250,119 @@ def get_encoding(fpath, alternative_encodings=None, verbose=False):
|
|
1250
1250
|
return None
|
1251
1251
|
|
1252
1252
|
|
1253
|
+
def unzip(dir_path, output_dir=None):
|
1254
|
+
"""
|
1255
|
+
Unzips or extracts various compressed file formats (.gz, .zip, .7z, .tar, .bz2, .xz, .rar).
|
1256
|
+
If the output directory already exists, it will be replaced.
|
1257
|
+
|
1258
|
+
Parameters:
|
1259
|
+
dir_path (str): Path to the compressed file.
|
1260
|
+
output_dir (str): Directory where the extracted files will be saved.
|
1261
|
+
If None, it extracts to the same directory as the file, with the same name.
|
1262
|
+
|
1263
|
+
Returns:
|
1264
|
+
str: The path to the output directory where files are extracted.
|
1265
|
+
"""
|
1266
|
+
|
1267
|
+
# Set default output directory to the same as the input file
|
1268
|
+
if output_dir is None:
|
1269
|
+
output_dir = os.path.splitext(dir_path)[0]
|
1270
|
+
|
1271
|
+
# If the output directory already exists, remove it and replace it
|
1272
|
+
if os.path.exists(output_dir):
|
1273
|
+
if os.path.isdir(output_dir): # check if it is a folder
|
1274
|
+
shutil.rmtree(output_dir) # remove folder
|
1275
|
+
else:
|
1276
|
+
os.remove(output_dir) # remove file
|
1277
|
+
|
1278
|
+
# Handle .tar.gz files
|
1279
|
+
if dir_path.endswith(".tar.gz"):
|
1280
|
+
import tarfile
|
1281
|
+
|
1282
|
+
with tarfile.open(dir_path, "r:gz") as tar_ref:
|
1283
|
+
tar_ref.extractall(output_dir)
|
1284
|
+
return output_dir
|
1285
|
+
# Handle .gz files
|
1286
|
+
if dir_path.endswith(".gz"):
|
1287
|
+
import gzip
|
1288
|
+
|
1289
|
+
output_file = os.path.splitext(dir_path)[0] # remove the .gz extension
|
1290
|
+
with gzip.open(dir_path, "rb") as gz_file:
|
1291
|
+
with open(output_file, "wb") as out_file:
|
1292
|
+
shutil.copyfileobj(gz_file, out_file)
|
1293
|
+
return output_file
|
1294
|
+
|
1295
|
+
# Handle .zip files
|
1296
|
+
elif dir_path.endswith(".zip"):
|
1297
|
+
import zipfile
|
1298
|
+
|
1299
|
+
with zipfile.ZipFile(dir_path, "r") as zip_ref:
|
1300
|
+
zip_ref.extractall(output_dir)
|
1301
|
+
return output_dir
|
1302
|
+
|
1303
|
+
# Handle .7z files (requires py7zr)
|
1304
|
+
elif dir_path.endswith(".7z"):
|
1305
|
+
import py7zr
|
1306
|
+
|
1307
|
+
with py7zr.SevenZipFile(dir_path, mode="r") as z:
|
1308
|
+
z.extractall(path=output_dir)
|
1309
|
+
return output_dir
|
1310
|
+
|
1311
|
+
# Handle .tar files
|
1312
|
+
elif dir_path.endswith(".tar"):
|
1313
|
+
import tarfile
|
1314
|
+
|
1315
|
+
with tarfile.open(dir_path, "r") as tar_ref:
|
1316
|
+
tar_ref.extractall(output_dir)
|
1317
|
+
return output_dir
|
1318
|
+
|
1319
|
+
# Handle .tar.bz2 files
|
1320
|
+
elif dir_path.endswith(".tar.bz2"):
|
1321
|
+
import tarfile
|
1322
|
+
|
1323
|
+
with tarfile.open(dir_path, "r:bz2") as tar_ref:
|
1324
|
+
tar_ref.extractall(output_dir)
|
1325
|
+
return output_dir
|
1326
|
+
|
1327
|
+
# Handle .bz2 files
|
1328
|
+
elif dir_path.endswith(".bz2"):
|
1329
|
+
import bz2
|
1330
|
+
|
1331
|
+
output_file = os.path.splitext(dir_path)[0] # remove the .bz2 extension
|
1332
|
+
with bz2.open(dir_path, "rb") as bz_file:
|
1333
|
+
with open(output_file, "wb") as out_file:
|
1334
|
+
shutil.copyfileobj(bz_file, out_file)
|
1335
|
+
return output_file
|
1336
|
+
|
1337
|
+
# Handle .xz files
|
1338
|
+
elif dir_path.endswith(".xz"):
|
1339
|
+
import lzma
|
1340
|
+
|
1341
|
+
output_file = os.path.splitext(dir_path)[0] # remove the .xz extension
|
1342
|
+
with lzma.open(dir_path, "rb") as xz_file:
|
1343
|
+
with open(output_file, "wb") as out_file:
|
1344
|
+
shutil.copyfileobj(xz_file, out_file)
|
1345
|
+
return output_file
|
1346
|
+
|
1347
|
+
# Handle .rar files (requires rarfile)
|
1348
|
+
elif dir_path.endswith(".rar"):
|
1349
|
+
import rarfile
|
1350
|
+
|
1351
|
+
with rarfile.RarFile(dir_path) as rar_ref:
|
1352
|
+
rar_ref.extractall(output_dir)
|
1353
|
+
return output_dir
|
1354
|
+
|
1355
|
+
else:
|
1356
|
+
raise ValueError(f"Unsupported file format: {os.path.splitext(dir_path)[1]}")
|
1357
|
+
|
1358
|
+
|
1359
|
+
# Example usage:
|
1360
|
+
# output_dir = unzip('data.tar.gz')
|
1361
|
+
# output_file = unzip('file.csv.gz')
|
1362
|
+
# output_dir_zip = unzip('archive.zip')
|
1363
|
+
# output_dir_7z = unzip('archive.7z')
|
1364
|
+
|
1365
|
+
|
1253
1366
|
def fload(fpath, kind=None, **kwargs):
|
1254
1367
|
"""
|
1255
1368
|
Load content from a file with specified file type.
|
@@ -1398,11 +1511,26 @@ def fload(fpath, kind=None, **kwargs):
|
|
1398
1511
|
"pdf",
|
1399
1512
|
"ipynb",
|
1400
1513
|
]
|
1401
|
-
|
1514
|
+
zip_types = ["gz", "zip", "7z", "tar", "tar.gz", "tar.bz2", "bz2", "xz", "rar"]
|
1515
|
+
supported_types = [*doc_types, *img_types, *zip_types]
|
1402
1516
|
if kind not in supported_types:
|
1403
|
-
|
1404
|
-
|
1405
|
-
|
1517
|
+
print(f'Error:\n"{kind}" is not in the supported list {supported_types}')
|
1518
|
+
# if os.path.splitext(fpath)[1][1:].lower() in zip_types:
|
1519
|
+
# keep=kwargs.get("keep", False)
|
1520
|
+
# ifile=kwargs.get("ifile",(0,0))
|
1521
|
+
# kwargs.pop("keep",None)
|
1522
|
+
# kwargs.pop("ifile",None)
|
1523
|
+
# fpath_unzip=unzip(fpath)
|
1524
|
+
# if isinstance(fpath_unzip,list):
|
1525
|
+
# fpath_unzip=fpath_unzip[ifile[0]]
|
1526
|
+
# if os.path.isdir(fpath_unzip):
|
1527
|
+
# fpath_selected=listdir(fpath_unzip,kind=kind).fpath[ifile[1]]
|
1528
|
+
# fpath_unzip=fpath_selected
|
1529
|
+
# content_unzip=fload(fpath_unzip, **kwargs)
|
1530
|
+
# if not keep:
|
1531
|
+
# os.remove(fpath_unzip)
|
1532
|
+
# return content_unzip
|
1533
|
+
|
1406
1534
|
if kind == "docx":
|
1407
1535
|
return load_docx(fpath)
|
1408
1536
|
elif kind == "txt" or kind == "md":
|
@@ -1427,10 +1555,21 @@ def fload(fpath, kind=None, **kwargs):
|
|
1427
1555
|
elif kind.lower() in img_types:
|
1428
1556
|
print(f'Image ".{kind}" is loaded.')
|
1429
1557
|
return load_img(fpath)
|
1558
|
+
elif kind.lower() in zip_types:
|
1559
|
+
keep = kwargs.get("keep", False)
|
1560
|
+
fpath_unzip = unzip(fpath)
|
1561
|
+
content_unzip = fload(fpath_unzip, **kwargs)
|
1562
|
+
if not keep:
|
1563
|
+
os.remove(fpath_unzip)
|
1564
|
+
return content_unzip
|
1430
1565
|
else:
|
1431
|
-
|
1432
|
-
|
1433
|
-
|
1566
|
+
try:
|
1567
|
+
with open(fpath, "r") as f:
|
1568
|
+
content = f.readlines()
|
1569
|
+
except:
|
1570
|
+
with open(fpath, "r") as f:
|
1571
|
+
content = f.read()
|
1572
|
+
return content
|
1434
1573
|
|
1435
1574
|
|
1436
1575
|
# Example usage
|
@@ -2030,10 +2169,10 @@ def mkdir(*args, **kwargs):
|
|
2030
2169
|
if isinstance(arg, (str, list)):
|
2031
2170
|
if "/" in arg or "\\" in arg:
|
2032
2171
|
pardir = arg
|
2033
|
-
print(f"
|
2172
|
+
print(f'pardir: "{pardir}"')
|
2034
2173
|
else:
|
2035
2174
|
chdir = arg
|
2036
|
-
print(f"
|
2175
|
+
print(f'chdir:"{chdir}"')
|
2037
2176
|
elif isinstance(arg, bool):
|
2038
2177
|
overwrite = arg
|
2039
2178
|
print(overwrite)
|
@@ -2049,6 +2188,13 @@ def mkdir(*args, **kwargs):
|
|
2049
2188
|
pardir = os.path.normpath(pardir)
|
2050
2189
|
# Get the slash type: "/" or "\"
|
2051
2190
|
stype = "/" if "/" in pardir else "\\"
|
2191
|
+
if "mac" in get_os().lower() or "lin" in get_os().lower():
|
2192
|
+
stype = "/"
|
2193
|
+
elif "win" in get_os().lower():
|
2194
|
+
stype = "\\"
|
2195
|
+
else:
|
2196
|
+
stype = "/"
|
2197
|
+
|
2052
2198
|
# Check if the parent directory exists and is a directory path
|
2053
2199
|
if os.path.isdir(pardir):
|
2054
2200
|
os.chdir(pardir) # Set current path
|
@@ -4046,3 +4192,235 @@ def preview(var):
|
|
4046
4192
|
# preview("# This is a Markdown header")
|
4047
4193
|
# preview(pd.DataFrame({"Name": ["Alice", "Bob"], "Age": [25, 30]}))
|
4048
4194
|
# preview({"key": "value", "numbers": [1, 2, 3]})
|
4195
|
+
|
4196
|
+
|
4197
|
+
# ! DataFrame
|
4198
|
+
def df_as_type(
|
4199
|
+
df: pd.DataFrame,
|
4200
|
+
columns: Optional[Union[str, List[str]]] = None,
|
4201
|
+
astype: str = "datetime",
|
4202
|
+
format: Optional[str] = None,
|
4203
|
+
inplace: bool = False,
|
4204
|
+
errors: str = "coerce", # Can be "ignore", "raise", or "coerce"
|
4205
|
+
**kwargs,
|
4206
|
+
) -> Optional[pd.DataFrame]:
|
4207
|
+
"""
|
4208
|
+
Convert specified columns of a DataFrame to a specified type (e.g., datetime, float, int, numeric, timedelta).
|
4209
|
+
If columns is None, all columns in the DataFrame will be converted.
|
4210
|
+
|
4211
|
+
Parameters:
|
4212
|
+
- df: DataFrame containing the columns to convert.
|
4213
|
+
- columns: Either a single column name, a list of column names, or None to convert all columns.
|
4214
|
+
- astype: The target type to convert the columns to ('datetime', 'float', 'int', 'numeric', 'timedelta', etc.).
|
4215
|
+
- format: Optional; format to specify the datetime format (only relevant for 'datetime' conversion).
|
4216
|
+
- inplace: Whether to modify the DataFrame in place or return a new one. Defaults to False.
|
4217
|
+
- errors: Can be "ignore", "raise", or "coerce"
|
4218
|
+
- **kwargs: Additional keyword arguments to pass to the conversion function (e.g., errors='ignore' for pd.to_datetime or pd.to_numeric).
|
4219
|
+
|
4220
|
+
Returns:
|
4221
|
+
- If inplace=False: DataFrame with the specified columns (or all columns if columns=None) converted to the specified type.
|
4222
|
+
- If inplace=True: The original DataFrame is modified in place, and nothing is returned.
|
4223
|
+
"""
|
4224
|
+
astypes = [
|
4225
|
+
"datetime",
|
4226
|
+
"timedelta",
|
4227
|
+
"numeric",
|
4228
|
+
"int",
|
4229
|
+
"int8",
|
4230
|
+
"int16",
|
4231
|
+
"int32",
|
4232
|
+
"int64",
|
4233
|
+
"uint8",
|
4234
|
+
"uint16",
|
4235
|
+
"uint32",
|
4236
|
+
"uint64",
|
4237
|
+
"float",
|
4238
|
+
"float16",
|
4239
|
+
"float32",
|
4240
|
+
"float64",
|
4241
|
+
"complex",
|
4242
|
+
"complex64",
|
4243
|
+
"complex128",
|
4244
|
+
"str",
|
4245
|
+
"string",
|
4246
|
+
"bool",
|
4247
|
+
"datetime64",
|
4248
|
+
"datetime64[ns]",
|
4249
|
+
"timedelta64",
|
4250
|
+
"timedelta64[ns]",
|
4251
|
+
"category",
|
4252
|
+
"object",
|
4253
|
+
"Sparse",
|
4254
|
+
"hour",
|
4255
|
+
"minute",
|
4256
|
+
"second",
|
4257
|
+
"time",
|
4258
|
+
"week",
|
4259
|
+
"date",
|
4260
|
+
"month",
|
4261
|
+
"year",
|
4262
|
+
]
|
4263
|
+
# correct the astype input
|
4264
|
+
astype = strcmp(astype, astypes)[0]
|
4265
|
+
print(f"converting {columns} as type: {astype}")
|
4266
|
+
# If inplace is False, make a copy of the DataFrame
|
4267
|
+
if not inplace:
|
4268
|
+
df = df.copy()
|
4269
|
+
# If columns is None, apply to all columns
|
4270
|
+
if columns is None:
|
4271
|
+
columns = df.columns
|
4272
|
+
|
4273
|
+
# Ensure columns is a list
|
4274
|
+
if isinstance(columns, (str, int)):
|
4275
|
+
columns = [columns]
|
4276
|
+
|
4277
|
+
# Convert specified columns
|
4278
|
+
for column in columns:
|
4279
|
+
try:
|
4280
|
+
if astype in [
|
4281
|
+
"datetime",
|
4282
|
+
"hour",
|
4283
|
+
"minute",
|
4284
|
+
"second",
|
4285
|
+
"time",
|
4286
|
+
"week",
|
4287
|
+
"date",
|
4288
|
+
"month",
|
4289
|
+
"year",
|
4290
|
+
]:
|
4291
|
+
kwargs.pop("errors", None)
|
4292
|
+
# convert it as type: datetime
|
4293
|
+
if isinstance(column, int):
|
4294
|
+
df.iloc[:, column] = pd.to_datetime(
|
4295
|
+
df.iloc[:, column], format=format, errors=errors, **kwargs
|
4296
|
+
)
|
4297
|
+
# further convert:
|
4298
|
+
if astype == "time":
|
4299
|
+
df.iloc[:, column] = df.iloc[:, column].dt.time
|
4300
|
+
elif astype == "month":
|
4301
|
+
df.iloc[:, column] = df.iloc[:, column].dt.month
|
4302
|
+
elif astype == "year":
|
4303
|
+
df.iloc[:, column] = df.iloc[:, column].dt.year
|
4304
|
+
elif astype == "date":
|
4305
|
+
df.iloc[:, column] = df.iloc[:, column].dt.date
|
4306
|
+
elif astype == "hour":
|
4307
|
+
df.iloc[:, column] = df.iloc[:, column].dt.hour
|
4308
|
+
elif astype == "minute":
|
4309
|
+
df.iloc[:, column] = df.iloc[:, column].dt.minute
|
4310
|
+
elif astype == "second":
|
4311
|
+
df.iloc[:, column] = df.iloc[:, column].dt.second
|
4312
|
+
elif astype == "week":
|
4313
|
+
df.iloc[:, column] = df.iloc[:, column].dt.day_name()
|
4314
|
+
else:
|
4315
|
+
df[column] = (
|
4316
|
+
pd.to_datetime(
|
4317
|
+
df[column], format=format, errors=errors, **kwargs
|
4318
|
+
)
|
4319
|
+
if format
|
4320
|
+
else pd.to_datetime(df[column], errors=errors, **kwargs)
|
4321
|
+
)
|
4322
|
+
# further convert:
|
4323
|
+
if astype == "time":
|
4324
|
+
df[column] = df[column].dt.time
|
4325
|
+
elif astype == "month":
|
4326
|
+
df[column] = df[column].dt.month
|
4327
|
+
elif astype == "year":
|
4328
|
+
df[column] = df[column].dt.year
|
4329
|
+
elif astype == "date":
|
4330
|
+
df[column] = df[column].dt.date
|
4331
|
+
elif astype == "hour":
|
4332
|
+
df[column] = df[column].dt.hour
|
4333
|
+
elif astype == "minute":
|
4334
|
+
df[column] = df[column].dt.minute
|
4335
|
+
elif astype == "second":
|
4336
|
+
df[column] = df[column].dt.second
|
4337
|
+
elif astype == "week":
|
4338
|
+
df[column] = df[column].dt.day_name()
|
4339
|
+
|
4340
|
+
elif astype == "numeric":
|
4341
|
+
kwargs.pop("errors", None)
|
4342
|
+
df[column] = pd.to_numeric(df[column], errors=errors, **kwargs)
|
4343
|
+
# print(f"Successfully converted '{column}' to numeric.")
|
4344
|
+
elif astype == "timedelta":
|
4345
|
+
kwargs.pop("errors", None)
|
4346
|
+
df[column] = pd.to_timedelta(df[column], errors=errors, **kwargs)
|
4347
|
+
# print(f"Successfully converted '{column}' to timedelta.")
|
4348
|
+
else:
|
4349
|
+
# Convert to other types (e.g., float, int)
|
4350
|
+
df[column] = df[column].astype(astype)
|
4351
|
+
# print(f"Successfully converted '{column}' to {astype}.")
|
4352
|
+
except Exception as e:
|
4353
|
+
print(f"Error converting '{column}' to {astype}: {e}")
|
4354
|
+
|
4355
|
+
# Return the modified DataFrame if inplace is False
|
4356
|
+
if not inplace:
|
4357
|
+
return df
|
4358
|
+
|
4359
|
+
|
4360
|
+
# ! DataFrame
|
4361
|
+
def df_sort_values(df, column, by=None, ascending=True, inplace=False, **kwargs):
|
4362
|
+
"""
|
4363
|
+
Sort a DataFrame by a specified column based on a custom order.
|
4364
|
+
|
4365
|
+
Parameters:
|
4366
|
+
- df: DataFrame to be sorted.
|
4367
|
+
- column: The name of the column to sort by.
|
4368
|
+
- by: List specifying the custom order for sorting.
|
4369
|
+
- ascending: Boolean or list of booleans, default True.
|
4370
|
+
Sort ascending vs. descending.
|
4371
|
+
- inplace: If True, perform operation in place and return None.
|
4372
|
+
- **kwargs: Additional arguments to pass to sort_values.
|
4373
|
+
|
4374
|
+
Returns:
|
4375
|
+
- Sorted DataFrame if inplace is False, otherwise None.
|
4376
|
+
"""
|
4377
|
+
if column not in df.columns:
|
4378
|
+
raise ValueError(f"Column '{column}' does not exist in the DataFrame.")
|
4379
|
+
|
4380
|
+
if not isinstance(by, list):
|
4381
|
+
raise ValueError("custom_order must be a list.")
|
4382
|
+
|
4383
|
+
try:
|
4384
|
+
# Convert the specified column to a categorical type with the custom order
|
4385
|
+
df[column] = pd.Categorical(df[column], categories=by, ordered=True)
|
4386
|
+
if inplace: # replace the original
|
4387
|
+
df.sort_values(column, ascending=ascending, inplace=True, **kwargs)
|
4388
|
+
print(f"Successfully sorted DataFrame by '{column}'")
|
4389
|
+
return None
|
4390
|
+
else:
|
4391
|
+
sorted_df = df.sort_values(column, ascending=ascending, **kwargs)
|
4392
|
+
print(f"Successfully sorted DataFrame by '{column}' using custom order.")
|
4393
|
+
return sorted_df
|
4394
|
+
except Exception as e:
|
4395
|
+
print(f"Error sorting DataFrame by '{column}': {e}")
|
4396
|
+
return df
|
4397
|
+
|
4398
|
+
|
4399
|
+
# # Example usage:
|
4400
|
+
# # Sample DataFrame
|
4401
|
+
# data = {
|
4402
|
+
# "month": ["March", "January", "February", "April", "December"],
|
4403
|
+
# "Amount": [200, 100, 150, 300, 250],
|
4404
|
+
# }
|
4405
|
+
# df_month = pd.DataFrame(data)
|
4406
|
+
|
4407
|
+
# # Define the month order
|
4408
|
+
# month_order = [
|
4409
|
+
# "January",
|
4410
|
+
# "February",
|
4411
|
+
# "March",
|
4412
|
+
# "April",
|
4413
|
+
# "May",
|
4414
|
+
# "June",
|
4415
|
+
# "July",
|
4416
|
+
# "August",
|
4417
|
+
# "September",
|
4418
|
+
# "October",
|
4419
|
+
# "November",
|
4420
|
+
# "December",
|
4421
|
+
# ]
|
4422
|
+
# display(df_month)
|
4423
|
+
# sorted_df_month = df_sort_values(df_month, "month", month_order, ascending=True)
|
4424
|
+
# display(sorted_df_month)
|
4425
|
+
# df_sort_values(df_month, "month", month_order, ascending=True, inplace=True)
|
4426
|
+
# display(df_month)
|
py2ls/plot.py
CHANGED
@@ -17,6 +17,96 @@ from .stats import *
|
|
17
17
|
logging.getLogger("fontTools").setLevel(logging.WARNING)
|
18
18
|
|
19
19
|
|
20
|
+
def df_corr(
|
21
|
+
df,
|
22
|
+
columns="all",
|
23
|
+
tri="u",
|
24
|
+
mask=True,
|
25
|
+
k=1,
|
26
|
+
annot=True,
|
27
|
+
cmap="coolwarm",
|
28
|
+
fmt=".2f",
|
29
|
+
cluster=False, # New parameter for clustermap option
|
30
|
+
figsize=(10, 8),
|
31
|
+
row_cluster=True, # Perform clustering on rows
|
32
|
+
col_cluster=True, # Perform clustering on columns
|
33
|
+
dendrogram_ratio=(0.2, 0.1), # Adjust size of dendrograms
|
34
|
+
cbar_pos=(0.02, 0.8, 0.03, 0.2), # Adjust colorbar position
|
35
|
+
xticklabels=True, # Show column labels
|
36
|
+
yticklabels=True, # Show row labels
|
37
|
+
**kwargs,
|
38
|
+
):
|
39
|
+
# Select numeric columns or specific subset of columns
|
40
|
+
if columns == "all":
|
41
|
+
df_numeric = df.select_dtypes(include=[float, int])
|
42
|
+
else:
|
43
|
+
df_numeric = df[columns]
|
44
|
+
|
45
|
+
# Compute the correlation matrix
|
46
|
+
correlation_matrix = df_numeric.corr()
|
47
|
+
|
48
|
+
# Generate mask for the upper triangle if mask is True
|
49
|
+
if mask:
|
50
|
+
if "u" in tri.lower(): # upper => np.tril
|
51
|
+
mask_array = np.tril(np.ones_like(correlation_matrix, dtype=bool), k=k)
|
52
|
+
else: # lower => np.triu
|
53
|
+
mask_array = np.triu(np.ones_like(correlation_matrix, dtype=bool), k=k)
|
54
|
+
else:
|
55
|
+
mask_array = None
|
56
|
+
|
57
|
+
# Remove conflicting kwargs
|
58
|
+
kwargs.pop("mask", None)
|
59
|
+
kwargs.pop("annot", None)
|
60
|
+
kwargs.pop("cmap", None)
|
61
|
+
kwargs.pop("fmt", None)
|
62
|
+
|
63
|
+
kwargs.pop("clustermap", None)
|
64
|
+
kwargs.pop("row_cluster", None)
|
65
|
+
kwargs.pop("col_cluster", None)
|
66
|
+
kwargs.pop("dendrogram_ratio", None)
|
67
|
+
kwargs.pop("cbar_pos", None)
|
68
|
+
kwargs.pop("xticklabels", None)
|
69
|
+
kwargs.pop("col_cluster", None)
|
70
|
+
|
71
|
+
# Plot the heatmap or clustermap
|
72
|
+
if cluster:
|
73
|
+
# Create a clustermap
|
74
|
+
cluster_obj = sns.clustermap(
|
75
|
+
correlation_matrix,
|
76
|
+
mask=mask_array,
|
77
|
+
annot=annot,
|
78
|
+
cmap=cmap,
|
79
|
+
fmt=fmt,
|
80
|
+
figsize=figsize, # Figure size, adjusted for professional display
|
81
|
+
row_cluster=row_cluster, # Perform clustering on rows
|
82
|
+
col_cluster=col_cluster, # Perform clustering on columns
|
83
|
+
dendrogram_ratio=dendrogram_ratio, # Adjust size of dendrograms
|
84
|
+
cbar_pos=cbar_pos, # Adjust colorbar position
|
85
|
+
xticklabels=xticklabels, # Show column labels
|
86
|
+
yticklabels=yticklabels, # Show row labels
|
87
|
+
**kwargs, # Pass any additional arguments to sns.clustermap
|
88
|
+
)
|
89
|
+
|
90
|
+
return (
|
91
|
+
cluster_obj.ax_row_dendrogram,
|
92
|
+
cluster_obj.ax_col_dendrogram,
|
93
|
+
cluster_obj.ax_heatmap,
|
94
|
+
)
|
95
|
+
else:
|
96
|
+
# Create a standard heatmap
|
97
|
+
plt.figure(figsize=(10, 8))
|
98
|
+
ax = sns.heatmap(
|
99
|
+
correlation_matrix,
|
100
|
+
mask=mask_array,
|
101
|
+
annot=annot,
|
102
|
+
cmap=cmap,
|
103
|
+
fmt=fmt,
|
104
|
+
**kwargs, # Pass any additional arguments to sns.heatmap
|
105
|
+
)
|
106
|
+
# Return the Axes object for further customization if needed
|
107
|
+
return ax
|
108
|
+
|
109
|
+
|
20
110
|
def catplot(data, *args, **kwargs):
|
21
111
|
"""
|
22
112
|
catplot(data, opt=None, ax=None)
|
@@ -207,15 +207,15 @@ py2ls/doc.py,sha256=xN3g1OWfoaGUhikbJ0NqbN5eKy1VZVvWwRlhHMgyVEc,4243
|
|
207
207
|
py2ls/export_requirements.py,sha256=x2WgUF0jYKz9GfA1MVKN-MdsM-oQ8yUeC6Ua8oCymio,2325
|
208
208
|
py2ls/freqanalysis.py,sha256=F4218VSPbgL5tnngh6xNCYuNnfR-F_QjECUUxrPYZss,32594
|
209
209
|
py2ls/ich2ls.py,sha256=3E9R8oVpyYZXH5PiIQgT3CN5NxLe4Dwtm2LwaeacE6I,21381
|
210
|
-
py2ls/ips.py,sha256=
|
210
|
+
py2ls/ips.py,sha256=TMmk9kwxY8KWFWLbNpTxD4nad95uMpXgSqke0S-gAMo,161096
|
211
211
|
py2ls/netfinder.py,sha256=vgOOMhzwbjRuLWMAPyf_kh3HoOhsJ9dlA-tCkMf7kNU,55371
|
212
212
|
py2ls/ocr.py,sha256=5lhUbJufIKRSOL6wAWVLEo8TqMYSjoI_Q-IO-_4u3DE,31419
|
213
|
-
py2ls/plot.py,sha256=
|
213
|
+
py2ls/plot.py,sha256=vkKwppGLjErM6s1L0JOhukX54XbfKXUl6ojhVztCBN4,100538
|
214
214
|
py2ls/setuptools-70.1.0-py3-none-any.whl,sha256=2bi3cUVal8ip86s0SOvgspteEF8SKLukECi-EWmFomc,882588
|
215
215
|
py2ls/sleep_events_detectors.py,sha256=bQA3HJqv5qnYKJJEIhCyhlDtkXQfIzqksnD0YRXso68,52145
|
216
216
|
py2ls/stats.py,sha256=fJmXQ9Lq460StOn-kfEljE97cySq7876HUPTnpB5hLs,38123
|
217
217
|
py2ls/translator.py,sha256=zBeq4pYZeroqw3DT-5g7uHfVqKd-EQptT6LJ-Adi8JY,34244
|
218
218
|
py2ls/wb_detector.py,sha256=7y6TmBUj9exCZeIgBAJ_9hwuhkDh1x_-yg4dvNY1_GQ,6284
|
219
|
-
py2ls-0.1.10.
|
220
|
-
py2ls-0.1.10.
|
221
|
-
py2ls-0.1.10.
|
219
|
+
py2ls-0.1.10.27.dist-info/METADATA,sha256=vby3fz3bfQ7SzPfG49id_MWTInQE1VGqFRxRca7sahs,20040
|
220
|
+
py2ls-0.1.10.27.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
221
|
+
py2ls-0.1.10.27.dist-info/RECORD,,
|
File without changes
|