Python一些可能用的到的函数系列126 UCS函数

说明

UCS(Universal Calculation Standard)要求数据是以块进行组织的:

  • 1 数据的存储要按块
  • 2 数据的处理也是按块

内容

1 已经完成的部分

假设,数据是按照数值顺序编号的。最常见的是mysql的自增ID,因为这种范式比较好,所以我在Mongo(主库)里也实现了一个机制,可以自动进行编号。

三个函数的作用:

  • 1 get_brick_name : 获取某个id对应的brick编号,这个编号看起来像ip地址 0.0.0.0
  • 2 get_brick_list: 给到两个编号,给出中间所有的brick编号
  • 3 get_brick_bounds:给到一个编号,给出上下界id

每个编号(brick)对应1万条记录,然后编号之前是千进位的。所以理论上可以容纳10万亿。

#  ===================  获取编号
def get_brick_name(some_int_idx=None, shard_unit=1e13, part_unit=1e10, block_unit=1e7, brick_unit=1e4):# 确保 some_int_idx 是整数some_int_idx = int(some_int_idx)# 计算 shard 索引shard_idx = some_int_idx // shard_unitsome_int_idx -= shard_idx * shard_unit# 计算 part 索引part_idx = some_int_idx // part_unitsome_int_idx -= part_idx * part_unit# 计算 block 索引block_idx = some_int_idx // block_unitsome_int_idx -= block_idx * block_unit# 计算 brick 索引brick_idx = some_int_idx // brick_unit# 将所有索引转换为整数shard_idx = int(shard_idx)part_idx = int(part_idx)block_idx = int(block_idx)brick_idx = int(brick_idx)# 返回格式化后的字符串return f'{shard_idx}.{part_idx}.{block_idx}.{brick_idx}'这个函数是用来将整数索引转换为一种层次命名方案的。以下是函数的简要说明:它接受一个整数索引作为输入,并可选地接受不同层级的缩放因子。
它依次将整数索引除以这些缩放因子,以提取不同粒度级别的索引(shard、part、block、brick)。
然后将每个级别格式化为一个字符串,并用点号分隔。# ===================   生成列表
def get_brick_list(brick_name1=None, brick_name2=None, shard_unit=1e13, part_unit=1e10, block_unit=1e7, brick_unit=1e4):# 如果没有给定砖块名,则直接返回空列表if brick_name1 is None or brick_name2 is None:return []# 将砖块名解析为四个索引shard_idx1, part_idx1, block_idx1, brick_idx1 = map(int, brick_name1.split('.'))shard_idx2, part_idx2, block_idx2, brick_idx2 = map(int, brick_name2.split('.'))# 计算起始和结束的整数索引index1 = (shard_idx1 * shard_unit) + (part_idx1 * part_unit) + (block_idx1 * block_unit) + (brick_idx1 * brick_unit)index2 = (shard_idx2 * shard_unit) + (part_idx2 * part_unit) + (block_idx2 * block_unit) + (brick_idx2 * brick_unit)# 确定索引范围start_idx = min(index1, index2)stop_idx = max(index1, index2)# 生成两个索引之间的所有砖块名brick_names = []for idx in range(int(start_idx), int(stop_idx), int(brick_unit)):brick_name = get_brick_name(idx, shard_unit, part_unit, block_unit, brick_unit)brick_names.append(brick_name)return brick_names# 测试
# brick_names = get_brick_list("0.0.2.3", "0.0.3.5")
# print(brick_names)# =================== 获得每一个编号的上下界
def get_brick_bounds(brick_name, shard_unit=1e13, part_unit=1e10, block_unit=1e7, brick_unit=1e4):shard_idx, part_idx, block_idx, brick_idx = map(int, brick_name.split('.'))lower_bound = (shard_idx * shard_unit) + (part_idx * part_unit) + (block_idx * block_unit) + (brick_idx * brick_unit)upper_bound = lower_bound + brick_unit return lower_bound, upper_bound这个函数看起来是用来计算给定brick名的边界值的。以下是这个函数的说明:它接受一个brick名作为输入,并可选地接受不同层级的缩放因子。
它将brick名分割成四个部分(shard、part、block、brick),然后计算brick的下限和上限。
下限是所有部分索引相乘并加总,上限则是下限加上brick单元大小再减1

2 本次要做的内容

还有一种常见的顺序编号是时间。将概念进行对应

shard ~ 年
part ~ 月
block ~ 日
brick ~ 时

例如: 2024.5.1.0。对应的进位关系一目了然,现在就看怎么进行函数封装。

嗯,想想发现,其实标准的时间格式,本来就做了层级的顺序编号。如2024-01-01 11:11:11,无非是要把2024,01,01,11提取出来即可。参照上面的三个函数:

  • 1 get_time_brick_name ~ get_brick_name, 只要将数据转换为字符,然后提取即可。从规范化的角度,可以是2024.01.01.11这样的格式。
  • 2 get_time_brick_bounds ~ get_brick_bounds, 获取当前时间,然后按规则下推一个就可以了。
  • 3 get_time_brick_list ~ get_brick_list ,这个应该是最需要修改的地方了。目前的基础是yymon_dict,
# op043_ATimer2.py
# 基于时间轴进行推算import pandas as pd 
import numpy as np 
class ATimer2:@staticmethod# 分离月 + 日:时:分:秒def depart_mon_ddhhmmss(dt_str):pos = dt_str.rfind('-')yymon = dt_str[:pos]+'-01'ddhhmmss = dt_str[pos+1:]return yymon, ddhhmmss@staticmethoddef ddhhmmss2s(dhms_str):_d, _hms = dhms_str.split()_h,_m,_s = _hms.split(':')return 86400*(int(_d)-1) + 3600 *(int(_h)) + 60 *(int(_m)) + int(_s)@staticmethoddef gapts2day(some_ts):_d = some_ts//86400_res1 = some_ts % 86400_h = _res1 //3600_res2 =  _res1 % 3600_m = _res2 //60_s = _res2 % 60return "-{:02d} {:02d}:{:02d}:{:02d}".format( _d + 1,_h,_m,_s)# 初始化def __init__(self,yymon_dict = None):# 引入yymon_dictself.yymon_dict = yymon_dict# 获取有序列表的数值(时间戳)self.time_axis = np.array(list(yymon_dict.values()))# 获取有序列表的字符(日期)self.dt_axis = list(yymon_dict.keys())# 【变换】 标准时间字符:  2000-01-01 11:11:11def char2num(self, some_dt_str = None):yymon, dhms  =self.depart_mon_ddhhmmss(some_dt_str)the_ts = self.yymon_dict[yymon]  + self.ddhhmmss2s(dhms)return the_ts# 【变换】 def num2char(self, the_ts = None):# 将时间戳转为字符pos= max(np.where(self.time_axis <= the_ts)[0])# 月字符base_dt = self.dt_axis[pos]# 月字符对应的时间戳base_ts = self.time_axis[pos]gap_ts = the_ts - base_tschar_ts = base_dt[:7] + self.gapts2day(gap_ts)return char_ts# 【偏移】 - 默认的时间戳偏移是不必计算的def n_period_btw(self, start_ts = None, end_ts = None):pass # 【偏移】- 通用的字符时间def c_period_btw(self, start_dt = None, end_dt = None):start_ts = self.char2num(start_dt)end_ts = self.char2num(end_dt)return end_ts - start_ts# 【偏移】 - 使用特定轴的时间偏移:采用轴 + 位置索引 + 偏差# 1 维持分钟级时间戳# 2 每分钟数据落库则更新时间戳(因此会有1分钟的延迟)# A_trade_slot_axis 传入交易的分钟级时间轴def n_period_btw_A_trade(self, start_ts = None, end_ts = None, A_trade_slot_axis = None):pass

思路:

根据起止时间,可以获得两个时间对应的起始月。因此,只要生成从起始月(1号)开始的所有天,然后再根据小时就可以生成所有的brick_name。然后再按照起止时间进行筛选即可。

首先,添加一个函数

    # 生成一个月的brickdef _gen_month_brick(self, month_idx = None ):cur_monyy_pos = month_idxnext_monyy_pos = cur_monyy_pos + 1monyy_start = yymon_dict[self.dt_axis[cur_monyy_pos]]monyy_end =  yymon_dict[self.dt_axis[next_monyy_pos]]the_month_days = int((monyy_end - monyy_start)/86400)cur_yymonth = self.dt_axis[cur_monyy_pos][:7].replace('-','.')cur_month_bricks = []for i in range(1, the_month_days + 1):for j in range(24):_tem = '.'.join([cur_yymonth, str(i).zfill(2), str(j).zfill(2)])cur_month_bricks.append(_tem)return cur_month_bricksat2._gen_month_brick(648)
['2024.01.01.00','2024.01.01.01','2024.01.01.02',...'2024.01.31.21','2024.01.31.22','2024.01.31.23']

一个大月有744个brick,一年不到9000, 十年不到9万,感觉上这个切分还是可以的。

get_time_brick_name

    # 生成brick_name | 输入可以是标准时间字符或者是时间戳(int or float)def get_time_brick_name(self, char_or_num = None):if not isinstance(char_or_num, str):the_char = self.num2char(char_or_num)else:the_char = char_or_numdt, hms = the_char.split()brick_name = '.'.join(dt.split('-') +[hms.split(':')[0]] )return brick_name# 样例字符
some_dt_str = '2024-01-31 11:11:11'
# 字符转数值
at2.char2num(some_dt_str)
# 数值转字符
at2.num2char(the_ts=1706670671)
'2024-01-31 11:11:11'
at2.get_time_brick_name(some_dt_str)
'2024.01.31.11'
at2.get_time_brick_name(1706670671)
'2024.01.31.11'

get_time_brick_bounds

    # 生成brick区间 | 可以返回两种区间:字符串区间和时间戳区间(数值型)def get_time_brick_bounds(self, some_brick_name = None, char_or_num = 'char'):y,m,d,h = some_brick_name.split('.')the_char_start = '-'.join([y,m,d]) + ' ' + ':'.join([h,'00','00'])the_num_start = self.char2num(the_char_start)the_num_end = the_num_start+3600the_char_end = self.num2char(the_num_end)if char_or_num =='char':return the_char_start,the_char_endelse:return the_num_start,the_num_endat2.get_time_brick_bounds('2024.01.31.11')
('2024-01-31 11:00:00', '2024-01-31 12:00:00')
at2.get_time_brick_bounds('2024.01.31.23')
('2024-01-31 23:00:00', '2024-02-01 00:00:00')
at2.get_time_brick_bounds('2024.01.31.11', char_or_num='num')
(1706670000, 1706673600)

get_time_brick_list

    # 生成brick_name区间def get_time_brick_list(self,brick_name1 = None,brick_name2= None):start_brick_name, end_brick_name = sorted(list([brick_name1, brick_name2]))start_y, start_m, start_d, start_h = start_brick_name.split('.')end_y, end_m, end_d, end_h = end_brick_name.split('.')start_yymon = '-'.join([start_y,start_m,'01'])end_yymon = '-'.join([end_y,end_m,'01'])start_pos = self.dt_axis.index(start_yymon)end_pos = self.dt_axis.index(end_yymon)brick_name_list = []for some_pos in range(start_pos, end_pos+1):tem_list = self._gen_month_brick(month_idx = some_pos)brick_name_list.append(tem_list)brick_name_list1 = sorted(self.flatten_list(brick_name_list))start_idx = brick_name_list1.index(start_brick_name)end_idx = brick_name_list1.index(end_brick_name)return brick_name_list1[start_idx:end_idx]at2.get_time_brick_list('2024.01.31.11', '2024.01.31.13')
['2024.01.31.11', '2024.01.31.12']
at2.get_time_brick_list('2024.01.31.11', '2024.02.02.13')
['2024.01.31.11','2024.01.31.12','2024.01.31.13','2024.01.31.14',...'2024.02.02.10','2024.02.02.11','2024.02.02.12']

基本上ok了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/831375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络-408考研

后续更新发布在B站账号&#xff1a;谭同学很nice http://【计算机408备考-什么是计算机网络&#xff0c;有什么特点&#xff1f;】 https://www.bilibili.com/video/BV1qZ421J7As/?share_sourcecopy_web&vd_source58c2a80f8de74ae56281305624c60b13http://【计算机408备考…

在idea中连接mysql

IDE&#xff08;集成开发环境&#xff09;是一种软件应用程序&#xff0c;它为开发者提供编程语言的开发环境&#xff0c;通常集成了编码、编译、调试和运行程序的多种功能。一个好的IDE可以大幅提高开发效率&#xff0c;尤其是在进行大型项目开发时。IDE通常包括以下几个核心组…

Docker-Compose编排lnmp(dockerfile) 完成Wordpress

目录 一、创建nginx镜像 二、创建mysql镜像 三、创建php镜像 四、启动wordpress 五、安装Compose 六、准备环境 ​编辑 七、编写docker-compose.yml 八、启动并运行 九、浏览器访问 一、创建nginx镜像 #基于基础镜像 FROM centos:7 #用户信息 MAINTAINER this is ngi…

LabVIEW换智能仿真三相电能表研制

LabVIEW换智能仿真三相电能表研制 在当前电力工业飞速发展的背景下&#xff0c;确保电能计量的准确性与公正性变得尤为重要。本文提出了一种基于LabVIEW和单片机技术&#xff0c;具有灵活状态切换功能的智能仿真三相电能表&#xff0c;旨在通过技术创新提高电能计量人员的培训…

vue初始化项目

打开终端输入vue create project-name 选择Manually select features回车&#xff0c;继续选择如下&#xff1a; 如果要使用pina就可以不选vuex&#xff0c;回车&#xff0c;选择如下&#xff1a; 按下图选即可

BJFUOJ-C++程序设计-实验2-类与对象

A 评分程序 答案&#xff1a; #include<iostream> #include<cstring>using namespace std;class Score{ private:string name;//记录学生姓名double s[4];//存储4次成绩&#xff0c;s[0]和s[1]存储2次随堂考试&#xff0c;s[2]存储期中考试&#xff0c;s[3]存储期…

与 Apollo 共创生态:企业解决方案Apollo X 9.0,七载同舟,携手远航,视频简说

目录 介绍背景方案与项目Apollo 开源项目Apollo X 企业解决方案落地因素助力企业落地流程 预置套件需求定义功能定义场景用例融合技术面向园区功能安全Cyber RT企业硬件套件 开发工具链研发迭代范式协同研发工具链标定工具地图工具仿真平台数据闭环 企业合作模式合作方式 共创计…

概述小样本学习的具体应用场景

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 小样本学习&#xff08;Few-shot Learning&#xff0c;FSL&#xff09;作为机器学习的一个重要分支&#xff0c;特别强调从极少量的标注数据中学习和泛化的能力。这在众多领域都有广泛的应用&#xff0…

windows ubuntu sed,awk,grep篇:12.awk 关联数组

目录 78. 引用数组元素 79.使用循环遍历 awk 数组 80. 删除数组元素 81. 多维数组 82. SUBSEP 下标分隔符 83. 用 asort 为数组排序 84. 用 asorti 为索引排序 相比较与其他编程语言中的传统数组&#xff0c; awk 的数组更为强大。 Awk 的数组&#xff0c;都是关联数组&…

挑战一周完成Vue3项目Day4: 用户管理+角色管理+菜单管理+首页+暗黑模式/主题切换

一、用户管理 1.静态搭建 src/views/acl/user/index.vue <template><el-card style"height:80px;"><el-form :inline"true" class"form"><el-form-item label"用户名&#xff1a;"><el-input placehold…

Docker——生产案例(如何修改Docker部署服务的端口映射)

目录 前言 1. 测试环境中新建Apache服务 2.停止容器和Docker服务 3.修改容器配置 4.重启Docker服务并访问测试 前言 由于接替原工作人员的工作之后&#xff0c;上级需要修改Docker部署Apache服务的端口映射&#xff0c;将89端口修改为99端口&#xff0c;那我们该如何修改呢…

JAVA 学习·泛型(二)——通配泛型

有关泛型的基本概念&#xff0c;参见我的前一篇博客 JAVA 学习泛型&#xff08;一&#xff09;。 协变性 泛型不具备协变性 在介绍通配泛型之前&#xff0c;先来看一下下面的例子。我们定义了一个泛型栈&#xff1a; import java.util.ArrayList; class GenericStack<E>…

如何完全卸载QT

第一步&#xff0c;用QT自带的软件卸载QT 第二步&#xff0c;卸载下面路径的所有QT配置 C:用户/(你的用户)/AppData/Local/目录下所有与Qt相关内容 C:用户/(你的用户)/AppData/Local/Temp/所有与Qt相关内容 C:用户/(你的用户)/AppData/Roaming/所有与Qt相关内容

android init进程启动流程

Android系统完整的启动流程 android 系统架构图 init进程的启动流程 init进程启动服务的顺序 bool Service::Start() {// Starting a service removes it from the disabled or reset state and// immediately takes it out of the restarting state if it was in there.flags_…

【C语言笔记】【有点逗系列】 一个打印 Hello, world! 的程序

【C语言笔记】【有点逗系列】 一个打印 Hello, world! 的程序 有点逗系列内容。用于记录各式各样有点逗甚至没有什么用的C语言用法☺。 功能说明 在网上看到了一个表面上很混乱但是实则没什么用处的打印 Hello, world! 的程序。 程序如下&#xff1a; main(){int i,n[]{(((…

开发和运维同学必备的文件操作相关的bash命令

开发和运维同学必备的文件操作相关的Linux命令&#xff1a; ls&#xff1a;列出当前目录的文件和文件夹。 lscd&#xff1a;切换目录。 cd /path/to/directorypwd&#xff1a;显示当前所在目录。 pwdmkdir&#xff1a;创建新目录。 mkdir directory_namerm&#xff1a;删除文件…

vue快速入门(五十一)历史模式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 历史模式配置方法 默认哈希模式&#xff0c;历史模式与哈希模式在表层的区别是是否有/#/ 其他差异暂不深究 源码 //导入所需模块 import Vue from "vue"; import VueRouter from "vue-router"; import m…

201903青少年软件编程(Python)模拟考试试卷(一级)

第 1 题 【单选题】 假设 a10, b30,那么a/b的值的的&#xff08; &#xff09; A :300 B :20 C :3 D :0.33333 正确答案:D 试题解析: 第 2 题 【单选题】 下面代码的输出结果是 print&#xff08;round(0.1 0.2,1) 0.3&#xff09; A :0 B :1 C :True D :False 正确答…

Hive 表定义主键约束

文章目录 1.建表语句2.主键约束3.主键约束的意义参考文献 1.建表语句 先看一下官方给的完整的见表语句&#xff1a; CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)[(col_name data…

关于YOLO8学习(一)环境搭建,官方检测模型部署到手机

一,环境的搭建 环境 win10 python 3.11 cmake pytorch pycharm 过程 首先安装好一个pycharm,这里就不一一叙述了。 其次,选择好一个python版本,是关键所在。有些YOLO的版本,并不支持很高的python版本,博主选用的是python3.11版本。经过实际的测试,这个版本比较合适。…