Files
jupyter/体测单位/体测数据管理.ipynb
T
2024-09-24 19:37:04 +08:00

604 lines
22 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "e6dcc663-e0ed-4ea3-b442-11f229f4af94",
"metadata": {},
"source": [
"## 新增体测单位"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "360f0a97-d73d-43f3-9f7a-0f9582103c82",
"metadata": {
"execution": {
"iopub.execute_input": "2024-09-24T09:50:41.703850Z",
"iopub.status.busy": "2024-09-24T09:50:41.703095Z",
"iopub.status.idle": "2024-09-24T09:50:41.720718Z",
"shell.execute_reply": "2024-09-24T09:50:41.719536Z",
"shell.execute_reply.started": "2024-09-24T09:50:41.703777Z"
},
"tags": []
},
"outputs": [],
"source": [
"import pymongo\n",
"\n",
"myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"mydb = myclient[\"baogao\"]\n",
"mycol = mydb[\"place\"]\n",
"\n",
"place_id = 345321\n",
"place_code = \"14\"\n",
"dw_name = \"中国石化镇海炼化公司\"\n",
"dw_jc = \"中国石化镇海炼化公司\"\n",
"myquery = { \"id\": place_id }\n",
"num = mycol.count_documents(myquery)\n",
"if num>0:\n",
" print(num)\n",
"else:\n",
" mydict = { \"id\":place_id,\"name\": dw_name, \"code\": place_code }\n",
" x = mycol.insert_one(mydict) "
]
},
{
"cell_type": "markdown",
"id": "dcfbd41f-ca70-4f15-9153-60e6aaac27e8",
"metadata": {},
"source": [
"## 生成手机验证码"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "6ce2cbc7-435a-461c-bdb8-abd9a6962fbc",
"metadata": {
"execution": {
"iopub.execute_input": "2024-09-23T09:16:02.614379Z",
"iopub.status.busy": "2024-09-23T09:16:02.613463Z",
"iopub.status.idle": "2024-09-23T09:16:02.633416Z",
"shell.execute_reply": "2024-09-23T09:16:02.632423Z",
"shell.execute_reply.started": "2024-09-23T09:16:02.614298Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ok\n"
]
}
],
"source": [
"import openpyxl\n",
"import os,sys,shutil\n",
"import json\n",
"import math\n",
"import glob\n",
"import random\n",
"from pathlib import Path\n",
"import pymongo\n",
"\n",
"myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"mydb = myclient[\"baogao\"]\n",
"\n",
"place_id = 496534\n",
"place_code = \"12\"\n",
"dw_name = \"天宫院社区\"\n",
"dw_jc = \"天宫院社区\"\n",
"fi_path = '/home/songyi/python/mycrm/flask/pdf/files'\n",
"fls = glob.glob(f'{fi_path}/{str(place_id)}/*.pdf')\n",
"\n",
"code_list = []\n",
"for i in range(10): # 0~9\n",
" code_list.append(str(i))\n",
"list1 = []\n",
"mycol = mydb[\"pdf\"]\n",
"query1 = { \"place_id\": place_id }\n",
"list2 = []\n",
"mydoc = mycol.find(query1,{ \"code\": 1, \"_id\": 0 })\n",
"\n",
"for x in mydoc:\n",
" list2.append(x['code'])\n",
"\n",
"i = 0\n",
"while i < len(fls):\n",
" code = random.sample(code_list,3) #随机取3位数\n",
" code_num = ''.join(code) \n",
" if place_code+code_num not in list1 and place_code+code_num not in list2:\n",
" list1.append(place_code+code_num)\n",
" i +=1\n",
"i = 0\n",
"list2= []\n",
"for fn in fls:\n",
" dict2 = {}\n",
" fi_name =Path(fn).stem.split('-')[0]\n",
" #fi_name =Path(fn).stem\n",
" code = int(fi_name)\n",
" dxm = list1[i]\n",
" dict2 = {'place_id':place_id,'code':dxm,'fn':Path(fn).name}\n",
" list2.append(dict2)\n",
" i +=1\n",
"x = mycol.insert_many(list2)\n",
"print('ok') "
]
},
{
"cell_type": "markdown",
"id": "ad9e943a-bb3a-4d58-93ef-cc442a80effa",
"metadata": {},
"source": [
"## 批量发送短信(测试)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "5f665c0f-8d30-4759-b7f8-fb7e13b98efa",
"metadata": {
"execution": {
"iopub.execute_input": "2024-09-24T06:02:00.787106Z",
"iopub.status.busy": "2024-09-24T06:02:00.786300Z",
"iopub.status.idle": "2024-09-24T06:02:00.838883Z",
"shell.execute_reply": "2024-09-24T06:02:00.838280Z",
"shell.execute_reply.started": "2024-09-24T06:02:00.787028Z"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 13488820384 0014-舒浩轩.pdf\n",
"2 18612703139 0025-李嘉睿.pdf\n",
"3 13522895654 0003-杨宾.pdf\n",
"4 13718367043 0012-杨玉芬.pdf\n",
"5 15210713283 0005-王红柳.pdf\n",
"6 15101087817 0024-茅晴晴.pdf\n",
"7 18810111978 0008-段丽阳.pdf\n",
"8 15224991657 0026-郑慧敏.pdf\n",
"9 15210713283 0006-高天蕴.pdf\n",
"10 15010699019 0021-董润华.pdf\n",
"11 13671026339 0013-王柱明.pdf\n",
"12 15551006319 0029-林景平.pdf\n",
"13 13522895654 0004-武馨怡.pdf\n",
"14 18660799298 0023-程军妮.pdf\n",
"15 18233207289 0019-张傲楠.pdf\n",
"16 13910932179 0017-朱芷祁.pdf\n",
"17 18210661187 0011-张耀聪.pdf\n",
"18 18232370815 0020-尹晓晴.pdf\n",
"19 13426267482 0018-卢浥尘.pdf\n",
"20 13552494958 0031-魏丽.pdf\n",
"21 13681380585 0007-刘颖.pdf\n",
"22 13311183808 0016-张玉后.pdf\n",
"23 18210661187 0001-李雪莉.pdf\n",
"24 17665174761 0027-郑文结.pdf\n",
"25 15588818169 0022-刘小云.pdf\n",
"26 13011189787 0028-潘妍.pdf\n",
"27 13770726975 0030-宋元宵.pdf\n",
"28 18210661187 0002-张进刚.pdf\n",
"29 13671271202 0010-范文兰.pdf\n",
"30 18810111978 0009-段宇辰.pdf\n",
"31 13581907290 0015-罗靖卓.pdf\n"
]
}
],
"source": [
"from tencentcloud.common import credential\n",
"from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n",
"from tencentcloud.sms.v20210111 import sms_client, models\n",
"from tencentcloud.common.profile.client_profile import ClientProfile\n",
"from tencentcloud.common.profile.http_profile import HttpProfile\n",
"import json\n",
"import pymongo\n",
"\n",
"myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"mydb = myclient[\"baogao\"]\n",
"mycol = mydb[\"pdf\"]\n",
"\n",
"dw_jc = \"天宫院社区\"\n",
"filename = 'data/天宫院社区240922.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"dict2 = {}\n",
"#place_id = 571315\n",
"myquery = { \"place_id\": place_id}\n",
"for x in mycol.find(myquery,{ \"_id\": 0, \"place_id\": 0}):\n",
" code = int(x['fn'].split('-')[0])\n",
" if str(code) in dict1.keys() and 'phone' in dict1[str(code)].keys():\n",
" dict2[code] = {'phone':str(dict1[str(code)]['phone']),'code':x['code'],'name':x['fn']}\n",
" else:\n",
" print(code,'no phone')\n",
"#print(dict2)\n",
"i=1\n",
"#dict2 = {375: {'phone': '13793180751', 'code': '0379208'}}\n",
"for k, v in dict2.items():\n",
" phone = '+86'+v['phone']\n",
" yzm = v['code']\n",
" try: \n",
" secretId = \"AKID22rVyvSqbikXFFvav31ykc9YmqjN6KYc\"\n",
" secretKey = \"51XVL1YxDKI6mJh8au6DDuTskS1RhwJX\"\n",
" cred = credential.Credential(secretId, secretKey) \n",
" httpProfile = HttpProfile()\n",
" httpProfile.reqMethod = \"POST\" # post请求(默认为post请求)\n",
" httpProfile.reqTimeout = 60 # 请求超时时间,单位为秒(默认60秒)\n",
" httpProfile.endpoint = \"sms.tencentcloudapi.com\" # 指定接入地域域名(默认就近接入)\n",
" clientProfile = ClientProfile()\n",
" clientProfile.signMethod = \"TC3-HMAC-SHA256\" # 指定签名算法\n",
" clientProfile.language = \"en-US\"\n",
" clientProfile.httpProfile = httpProfile\n",
" client = sms_client.SmsClient(cred, \"ap-guangzhou\", clientProfile)\n",
" req = models.SendSmsRequest()\n",
" req.SmsSdkAppId = \"1400140089\"\n",
" req.SignName = \"坤铭教育\"\n",
" req.TemplateId = \"1875765\" \n",
" req.TemplateParamSet = [dw_jc,yzm]\n",
" req.PhoneNumberSet = [phone]\n",
" req.SessionContext = \"\"\n",
" req.ExtendCode = \"\"\n",
" req.SenderId = \"\"\n",
" #resp = client.SendSms(req)\n",
" #dict3 = json.loads(resp.to_json_string(indent=2))\n",
"\n",
" #print(v['phone'],dict3['SendStatusSet'][0][\"Message\"])\n",
" print(i,v['phone'],v['name'],)\n",
" i+=1\n",
" except TencentCloudSDKException as err:\n",
" print(v['phone'],err)"
]
},
{
"cell_type": "markdown",
"id": "b9a157f4-4772-413e-82f4-ecb7d2af8529",
"metadata": {},
"source": [
"## 批量发送短信"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4b2b5d76-665f-4dfe-bbd3-5c80abd8c3e3",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from tencentcloud.common import credential\n",
"from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n",
"from tencentcloud.sms.v20210111 import sms_client, models\n",
"from tencentcloud.common.profile.client_profile import ClientProfile\n",
"from tencentcloud.common.profile.http_profile import HttpProfile\n",
"import json\n",
"import pymongo\n",
"import time\n",
"\n",
"myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"mydb = myclient[\"baogao\"]\n",
"mycol = mydb[\"pdf\"]\n",
"\n",
"dw_jc = \"天宫院社区测试者\"\n",
"filename = 'data/天宫院社区240922.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"dict2 = {}\n",
"#place_id = 571315\n",
"myquery = { \"place_id\": place_id }\n",
"for x in mycol.find(myquery,{ \"_id\": 0, \"place_id\": 0}):\n",
" code = int(x['fn'].split('-')[0])\n",
" if str(code) in dict1.keys() and 'phone' in dict1[str(code)].keys():\n",
" dict2[code] = {'phone':str(dict1[str(code)]['phone']),'code':x['code'],'name':x['fn']}\n",
" else:\n",
" print('no phone')\n",
"#print(dict2)\n",
"#dw_jc = \"北体体质康健班测试者\"\n",
"#dict2 = {375: {'phone': '13793180751', 'code': '0379208'}}\n",
"for k, v in dict2.items():\n",
" phone = '+86'+v['phone']\n",
" yzm = v['code']\n",
" try: \n",
" secretId = \"AKID22rVyvSqbikXFFvav31ykc9YmqjN6KYc\"\n",
" secretKey = \"51XVL1YxDKI6mJh8au6DDuTskS1RhwJX\"\n",
" cred = credential.Credential(secretId, secretKey) \n",
" httpProfile = HttpProfile()\n",
" httpProfile.reqMethod = \"POST\" # post请求(默认为post请求)\n",
" httpProfile.reqTimeout = 60 # 请求超时时间,单位为秒(默认60秒)\n",
" httpProfile.endpoint = \"sms.tencentcloudapi.com\" # 指定接入地域域名(默认就近接入)\n",
" clientProfile = ClientProfile()\n",
" clientProfile.signMethod = \"TC3-HMAC-SHA256\" # 指定签名算法\n",
" clientProfile.language = \"en-US\"\n",
" clientProfile.httpProfile = httpProfile\n",
" client = sms_client.SmsClient(cred, \"ap-guangzhou\", clientProfile)\n",
" req = models.SendSmsRequest()\n",
" req.SmsSdkAppId = \"1400140089\"\n",
" req.SignName = \"坤铭教育\"\n",
" req.TemplateId = \"1875765\" \n",
" req.TemplateParamSet = [dw_jc,yzm]\n",
" req.PhoneNumberSet = [phone]\n",
" req.SessionContext = \"\"\n",
" req.ExtendCode = \"\"\n",
" req.SenderId = \"\"\n",
" resp = client.SendSms(req)\n",
" dict3 = json.loads(resp.to_json_string(indent=2))\n",
" print(v['phone'],dict3['SendStatusSet'][0][\"Message\"])\n",
" time.sleep(2)\n",
" except TencentCloudSDKException as err:\n",
" print(v['phone'],err)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "df637ce6-7c35-404a-af43-2a5a66b49ba0",
"metadata": {},
"outputs": [],
"source": [
"dict1 = json.loads(resp.to_json_string(indent=2))\n",
"print(dict1['SendStatusSet'][0][\"Message\"])"
]
},
{
"cell_type": "markdown",
"id": "feb02430-8946-4ed2-a99b-7f5106257c8b",
"metadata": {},
"source": [
"## 单个发送短信"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "25a269c3-758f-4e79-ae6d-a6e6f161d64b",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from tencentcloud.common import credential\n",
"from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n",
"from tencentcloud.sms.v20210111 import sms_client, models\n",
"from tencentcloud.common.profile.client_profile import ClientProfile\n",
"from tencentcloud.common.profile.http_profile import HttpProfile\n",
"import json\n",
"import pymongo\n",
"\n",
"myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"mydb = myclient[\"baogao\"]\n",
"mycol = mydb[\"pdf\"]\n",
"\n",
"filename = 'data/北体体质康健.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"dict2 = {}\n",
"#place_id = 571315\n",
"myquery = { \"place_id\": place_id,\"rq\":'20240914' }\n",
"for x in mycol.find(myquery,{ \"_id\": 0, \"place_id\": 0}):\n",
" code = int(x['fn'].split('-')[0])\n",
" if str(code) in dict1.keys() and 'phone' in dict1[str(code)].keys():\n",
" dict2[code] = {'phone':str(dict1[str(code)]['phone']),'code':x['code'],'name':x['fn']}\n",
" else:\n",
" print('no phone')\n",
"#print(dict2)\n",
"dw_jc = \"北体体质康健班测试者\"\n",
"\n",
"phone = '+86'+'18854609676'\n",
"yzm = '13306'\n",
"try: \n",
" secretId = \"AKID22rVyvSqbikXFFvav31ykc9YmqjN6KYc\"\n",
" secretKey = \"51XVL1YxDKI6mJh8au6DDuTskS1RhwJX\"\n",
" cred = credential.Credential(secretId, secretKey) \n",
" httpProfile = HttpProfile()\n",
" httpProfile.reqMethod = \"POST\" # post请求(默认为post请求)\n",
" httpProfile.reqTimeout = 60 # 请求超时时间,单位为秒(默认60秒)\n",
" httpProfile.endpoint = \"sms.tencentcloudapi.com\" # 指定接入地域域名(默认就近接入)\n",
" clientProfile = ClientProfile()\n",
" clientProfile.signMethod = \"TC3-HMAC-SHA256\" # 指定签名算法\n",
" clientProfile.language = \"en-US\"\n",
" clientProfile.httpProfile = httpProfile\n",
" client = sms_client.SmsClient(cred, \"ap-guangzhou\", clientProfile)\n",
" req = models.SendSmsRequest()\n",
" req.SmsSdkAppId = \"1400140089\"\n",
" req.SignName = \"坤铭教育\"\n",
" req.TemplateId = \"1875765\" \n",
" req.TemplateParamSet = [dw_jc,yzm]\n",
" req.PhoneNumberSet = [phone]\n",
" req.SessionContext = \"\"\n",
" req.ExtendCode = \"\"\n",
" req.SenderId = \"\"\n",
" resp = client.SendSms(req)\n",
" dict3 = json.loads(resp.to_json_string(indent=2))\n",
"\n",
" print(phone,dict3['SendStatusSet'][0][\"Message\"])\n",
"except TencentCloudSDKException as err:\n",
" print(v['phone'],err)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b1e90a59-0b09-4786-99a5-036b69f793ae",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from tencentcloud.common import credential\n",
"from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n",
"from tencentcloud.sms.v20210111 import sms_client, models\n",
"from tencentcloud.common.profile.client_profile import ClientProfile\n",
"from tencentcloud.common.profile.http_profile import HttpProfile\n",
"import json\n",
"import pymongo\n",
"\n",
"myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"mydb = myclient[\"baogao\"]\n",
"mycol = mydb[\"pdf\"]\n",
"\n",
"filename = 'data/中安联合.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"dict2 = {}\n",
"place_id = 624770\n",
"myquery = { \"place_id\": place_id,\"code\":\"051067\" }\n",
"for x in mycol.find(myquery,{ \"_id\": 0, \"place_id\": 0}):\n",
" code = int(x['fn'].split('-')[0])\n",
" if str(code) in dict1.keys():\n",
" dict2[code] = {'phone':str(dict1[str(code)]['phone']),'code':x['code']}\n",
" else:\n",
" print('no phone')\n",
"print(dict2)"
]
},
{
"cell_type": "markdown",
"id": "458f1022-ceb9-49f9-b699-3fcc81658335",
"metadata": {},
"source": [
"## 统计短信发送状态"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "411e89ed-8bb2-478b-b180-52188f800adc",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from tencentcloud.common import credential\n",
"from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n",
"from tencentcloud.sms.v20210111 import sms_client, models\n",
"from tencentcloud.common.profile.client_profile import ClientProfile\n",
"from tencentcloud.common.profile.http_profile import HttpProfile\n",
"import json\n",
"import pymongo\n",
"\n",
"\n",
"try: \n",
" secretId = \"AKID22rVyvSqbikXFFvav31ykc9YmqjN6KYc\"\n",
" secretKey = \"51XVL1YxDKI6mJh8au6DDuTskS1RhwJX\"\n",
" cred = credential.Credential(secretId, secretKey) \n",
" httpProfile = HttpProfile()\n",
" httpProfile.reqMethod = \"POST\" # post请求(默认为post请求)\n",
" httpProfile.reqTimeout = 60 # 请求超时时间,单位为秒(默认60秒)\n",
" httpProfile.endpoint = \"sms.tencentcloudapi.com\" # 指定接入地域域名(默认就近接入)\n",
" clientProfile = ClientProfile()\n",
" clientProfile.signMethod = \"TC3-HMAC-SHA256\" # 指定签名算法\n",
" clientProfile.language = \"en-US\"\n",
" clientProfile.httpProfile = httpProfile\n",
" client = sms_client.SmsClient(cred, \"ap-guangzhou\", clientProfile)\n",
" req = models.SendStatusStatisticsRequest()\n",
" req.SmsSdkAppId = \"1400140089\"\n",
" \n",
" # 拉取最大条数,最多100条\n",
" req.Limit = 100\n",
" # 偏移量 注:目前固定设置为0\n",
" req.Offset = 0\n",
" # 开始时间,yyyymmddhh 需要拉取的起始时间,精确到小时\n",
" req.BeginTime = \"2023112700\"\n",
" # 结束时间,yyyymmddhh 需要拉取的截止时间,精确到小时\n",
" # 注:EndTime 必须大于 BeginTime\n",
" req.EndTime = \"2023112723\"\n",
"\n",
"\n",
" # 通过client对象调用SendStatusStatistics方法发起请求。注意请求方法名与请求对象是对应的。\n",
" # 返回的resp是一个SendStatusStatisticsResponse类的实例,与请求对象对应。\n",
" resp = client.SendStatusStatistics(req)\n",
"\n",
"\n",
" # 输出json格式的字符串回包\n",
" print(resp.to_json_string(indent=2))\n",
"\n",
"\n",
"except TencentCloudSDKException as err:\n",
" print(err)\n"
]
},
{
"cell_type": "markdown",
"id": "51c61809-e6a3-489e-bac7-f439b673dcd3",
"metadata": {},
"source": [
"## 拉取短信下发状态"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "50183bba-2f9d-4003-98a7-0ecda96670ef",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from tencentcloud.common import credential\n",
"from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n",
"from tencentcloud.sms.v20210111 import sms_client, models\n",
"from tencentcloud.common.profile.client_profile import ClientProfile\n",
"from tencentcloud.common.profile.http_profile import HttpProfile\n",
"\n",
"\n",
"\n",
"try: \n",
" secretId = \"AKID22rVyvSqbikXFFvav31ykc9YmqjN6KYc\"\n",
" secretKey = \"51XVL1YxDKI6mJh8au6DDuTskS1RhwJX\"\n",
" cred = credential.Credential(secretId, secretKey) \n",
" httpProfile = HttpProfile()\n",
" httpProfile.reqMethod = \"POST\" # post请求(默认为post请求)\n",
" httpProfile.reqTimeout = 60 # 请求超时时间,单位为秒(默认60秒)\n",
" httpProfile.endpoint = \"sms.tencentcloudapi.com\" # 指定接入地域域名(默认就近接入)\n",
" clientProfile = ClientProfile()\n",
" clientProfile.signMethod = \"TC3-HMAC-SHA256\" # 指定签名算法\n",
" clientProfile.language = \"en-US\"\n",
" clientProfile.httpProfile = httpProfile\n",
" client = sms_client.SmsClient(cred, \"ap-guangzhou\", clientProfile)\n",
" req = models.PullSmsSendStatusRequest()\n",
" req.SmsSdkAppId = \"1400140089\"\n",
" req.Limit = 100\n",
" resp = client.PullSmsSendStatus(req)\n",
" # 输出json格式的字符串回包\n",
" print(resp.to_json_string(indent=2))\n",
"\n",
"\n",
"except TencentCloudSDKException as err:\n",
" print(err)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c3b4d384-9f83-4c91-98aa-0bb1f0e1d4ed",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}