- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个数据框 df1,其中包含 date_1 列,其值从 01/09/2019 到 30/09/2019。即 30 个值和各自的计数。
DF1
date_1 count
01/09/2019 5
02/09/2019 4
03/09/2019 5
04/09/2019 6
05/09/2019 7
06/09/2019 8
07/09/2019 10
08/09/2019 9
09/09/2019 11
10/09/2019 12
11/09/2019 13
12/09/2019 14
13/09/2019 15
14/09/2019 16
我想使用 df1 生成数据帧 df2,并具有一些约束:
有一个新列 date_2。
date_2 是根据 df1 中存在的计数特征生成的。
例如:新的数据框 df2 将在 01/09/2019 有 5 个条目(因为计数 = 5),并且 date_2 列可以采用 date_1 之前 30 天到 30/08/2019 的值(date_1 - 1 中的当前日期) ),即对于 01/09/2019,date_2 可以采用的值是从 (01/09/2019 - 30 = 01/08/2019) 到 (01/09/2019 - 1 = 30/08/2019)。
date_2 可以从范围(30 - date_1
到 date_1 - 1
)中随机选择,即在我们的示例中为 01/09/2019,从 02/08/2019年至2019年8月30日
需要注意的重要一点是,date_2 在 df2 中的计数也应该递增。
预期输出:
date_1 count date_2
01/09/2019 5 02/08/2019
01/09/2019 5 10/08/2019
01/09/2019 5 12/08/2019
01/09/2019 5 25/08/2019
01/09/2019 5 28/08/2019
02/09/2019 4 03/08/2019
02/09/2019 4 10/08/2019
02/09/2019 4 20/08/2019
02/09/2019 4 25/08/2019
编辑
我能够使用以下函数生成 date_2:
def pick_random_delta_in_range(min_days=1, max_days=30):
if min_days is None and max_days is None:
return datetime.timedelta(days=1, minutes=0, seconds=0)
if min_days is None:
return max_days
if max_days is None:
return min_days
days_to_be_added = random.randint(min_days, max_days)
return datetime.timedelta(days=days_to_be_added, minutes=0, seconds=0)
def gen_date_by_delta(src_dates, date_format, delta_min, delta_max):
gen_dates = []
for dt in src_dates:
src_date = datetime.datetime.strptime(dt, date_format)
if src_date is None:
gen_dates.append("")
continue
chosen_delta = pick_random_delta_in_range(min_days=delta_min, max_days=delta_max)
result_date = (src_date + chosen_delta).strftime(date_format)
gen_dates.append(result_date)
return gen_dates
date_2 = gen_date_by_delta(src_dates=df1["date_1"], date_format=date_format, delta_min=1, delta_max=30)
*目前,增量是随机生成的,可能会为相同的 date_1 生成相同的增量,从而导致重复条目。我不想生成重复的条目。 *
我也无法理解如何根据计数复制数据框中的字段并相应地生成日期。
任何人都可以帮助/建议一种生成相同内容的方法。
谢谢
最佳答案
定义以下“复制”函数:
def repl(row):
d1 = row.date_1
cnt = row['count']
dates = [ d1 - pd.Timedelta(n, 'D') for n in
np.sort(np.random.choice(30, cnt, False))[::-1] ]
return pd.DataFrame({'date_1': d1, 'count': cnt, 'date_2': dates})
然后应用它,连接结果并保存为DF2:
DF2 = pd.concat(df.apply(repl, axis=1).tolist(), ignore_index=True)
请注意,上面代码中的row['count']可以不被替换与 row.count,因为有一个 Pandas 具有此名称的方法。实际上,这只是不分配列名称的示例。您不应该不使用现有方法的名称。
要消耗该范围内的所有日期,过程更加复杂并且涉及创建一个专用类来从池中生成日期。
日期分配算法如下:
这个类还包含一个“技巧”,以弥补以下事实:第一行应用的函数被调用两次。这是 Pandas 中包含的一项优化,但在本例中它有一个副作用(消耗一些“初始”日期,这不是实际上包含在结果中),所以我必须对此进行补偿。
按如下方式进行:
创建一对在各个点使用的Timedelta变量:
td1 = pd.Timedelta(1, 'D')
td30 = pd.Timedelta(30, 'D')
然后定义一个日期生成器类:
class DateGen:
''' Dates generator
d1, d2 - date range
'''
def __init__(self, d1, d2):
rng = pd.date_range(d1, d2, freq='D')
self.dates = pd.Series(rng, index=rng)
self.firstCall = True
def popDate(self, d1, d2):
wrk = self.dates[self.dates.between(d1, d2)]
siz = wrk.size
if siz > 0:
dat = wrk.sample().iloc[0] if siz > 1 else wrk.iloc[0]
self.dates.pop(dat)
return dat, True
return None, False
def popDates(self, d1, d2, n):
ret = []
if self.firstCall:
self.firstCall = False
return ret
# Step 1: Get the first possible date
dat, ok = self.popDate(d1, d1)
if ok:
ret.append(dat)
# Step 2: Get further dates not consumed so far
while len(ret) < n:
dat, ok = self.popDate(d1, d2)
if not ok:
break
ret.append(dat)
# Step 3: Repeat dates already consumed
while len(ret) < n:
shft = np.random.randint(30)
dat = d2 - pd.Timedelta(shft, 'D')
if dat not in ret: # Without repetitions
ret.append(dat)
return ret
根据日期实例化该类的具有日期范围的对象在DF1中:
dg = DateGen(DF1.date_1.min() - td30, DF1.date_1.max())
这次的复制功能有点不同:
def repl(row):
d1 = row.date_1
cnt = row['count']
dates = np.sort(dg.popDates(d1 - td30, d1 - td1, cnt))
return pd.DataFrame({'date_1': d1, 'count': cnt, 'date_2': dates})
它从生成器对象中弹出日期,然后对它们进行排序并返回在返回的 DataFrame 中。
最后一步是应用它:
DF2 = pd.concat(DF1.sort_values('date_1').\
apply(repl, axis=1).tolist(), ignore_index=True)
因为现在日期顺序很重要,所以我首先按 date_1 排序。
关于python - 根据超过 1 个约束生成日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58681380/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!