我想使用特定日期(或月份)作为第一个 bin 的边缘对 Pandas 对象重新采样。例如,在下面的代码片段中,我希望我的第一个索引值是2020-02-29
,我很乐意指定start=2
or start="2020-02-29"
。
>>> dates = pd.date_range("2020-01-29", "2021-07-04")
>>> s = pd.Series(range(len(dates)), index=dates)
>>> s.resample('4M').count()
2020-01-31 3
2020-05-31 121
2020-09-30 122
2021-01-31 123
2021-05-31 120
2021-09-30 34
Freq: 4M, dtype: int64
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我能想到的最干净的用途,pd.cut
并且groupby
:
>>> rule = "4M"
>>> start = pd.Timestamp("2020-02-29") - pd.tseries.frequencies.to_offset(rule)
>>> end = s.index.max() + pd.tseries.frequencies.to_offset(rule)
>>> bins = pd.date_range(start, end, freq=rule)
>>> gb = s.groupby(pd.cut(s.index, bins)).count()
>>> gb.index = gb.index.categories.right
>>> gb
2020-02-29 32
2020-06-30 …
Run Code Online (Sandbox Code Playgroud) 对数据帧进行重新采样可以使数据帧达到更高或更低的时间分辨率。大多数时候,这用于降低分辨率(例如,将 1 分钟数据重新采样为每月值)。当数据集稀疏时(例如,2020 年 2 月没有收集任何数据),2020 年 2 月的行将填充重采样数据帧的 NaN。问题是,当数据记录很长且稀疏时,会有大量 NaN 行,这使得数据帧不必要地变大并占用大量 CPU 时间。例如,考虑这个数据帧和重新采样操作:
import numpy as np
import pandas as pd
freq1 = pd.date_range("20000101", periods=10, freq="S")
freq2 = pd.date_range("20200101", periods=10, freq="S")
index = np.hstack([freq1.values, freq2.values])
data = np.random.randint(0, 100, (20, 10))
cols = list("ABCDEFGHIJ")
df = pd.DataFrame(index=index, data=data, columns=cols)
# now resample to daily average
df = df.resample(rule="1D").mean()
Run Code Online (Sandbox Code Playgroud)
该数据框中的大部分数据都是无用的,可以通过以下方式删除:
df.dropna(how="all", axis=0, inplace=True)
Run Code Online (Sandbox Code Playgroud)
然而,这是草率的。是否有另一种方法来重新采样数据帧,该方法不会用 NaN 填充所有数据间隙(即在上面的示例中,生成的数据帧将只有两行)?
我的第一篇文章在这里,请耐心等待......
我正在使用 PyInstaller 捆绑 tkinter 应用程序,并且在使用该inspect
库时遇到了问题。基本上,我可以调用我编写的类的源代码,但不能调用函数。我做了这个人为的案例来证明:
我有一个像这样的文件夹结构:
experiment/
---experiment.py
---init.py
---resources/
/---resources.py
/---init.py
---loader/
/---loader.py
/---init.py
Run Code Online (Sandbox Code Playgroud)
resources.py
定义一个函数一个类:
def foo(a):
print(str(a) + ' is what you entered.')
class Bar:
def __init__(self, b):
self.b = b
Run Code Online (Sandbox Code Playgroud)
loader.py
导入该函数和该类并定义一个函数来打印它们的源代码:
import inspect
from resources import resources
def testfunc():
source_Bar = inspect.getsource(resources.Bar)
print(source_Bar)
source_foo = inspect.getsource(resources.foo)
print(source_foo)
Run Code Online (Sandbox Code Playgroud)
并experiment.py
从中加载打印函数loader.py
并调用它:
from loader.loader import testfunc
testfunc()
Run Code Online (Sandbox Code Playgroud)
我可以experiment.py
在 Python 控制台中运行并获得预期的输出(foo
和的源代码Bar
)。
然后,我使用 PyInstaller 创建可执行文件experiment.py
(从仅添加 PyInstaller …
我经常看到pandas
关于 SO 使用时间戳中包含空格的时间序列的示例:
A
2020-01-01 09:20:00 0
2020-01-01 09:21:00 1
2020-01-01 09:22:00 2
2020-01-01 09:23:00 3
2020-01-01 09:24:00 4
Run Code Online (Sandbox Code Playgroud)
或者这是时间不是索引的一部分:
dates values cat
0 2020-01-01 09:20:00 0.758513 a
1 2020-01-01 09:21:00 0.337325 b
2 2020-01-01 09:22:00 0.618372 b
3 2020-01-01 09:23:00 0.878714 b
4 2020-01-01 09:24:00 0.311069 b
Run Code Online (Sandbox Code Playgroud)
有没有一种好方法可以将这些(或类似的)数据复制回 Python 以进行处理? 我发现像帖子这个和这个这是为获得很多例子了SO的救星,但我通常无法找到复制/粘贴的方法(使用pd.read_clipboard()
或pd.read_table()
),对这些数据的作品。这通常会阻止我尝试回答1。
上面的例子是这样创建的:
#one
import pandas as pd
import numpy
dr = pd.date_range('01-01-2020 9:20', …
Run Code Online (Sandbox Code Playgroud) 这是一个比较宽泛的话题,但我将尝试将其缩减为一些具体问题。
在开始回答关于 SO 的问题时,我发现自己在制作玩具数据时有时会遇到这样的愚蠢错误:
In[0]:
import pandas as pd
df = pd.DataFrame({"values":[1,2,3,4,5,6,7,8,9]})
df[df < 5] = np.nan
Out[0]:
NameError: name 'np' is not defined
Run Code Online (Sandbox Code Playgroud)
我很用来自动导入numpy
使用pandas
,这并不通常发生在实际的代码。但是,它确实让我想知道为什么pandas
没有自己的值/对象来表示空值。
我最近才意识到你可以使用 PythonNone
代替类似的情况:
import pandas as pd
df = pd.DataFrame({"values":[1,2,3,4,5,6,7,8,9]})
df[df < 5] = None
Run Code Online (Sandbox Code Playgroud)
它按预期工作并且不会产生错误。但是我觉得我看到的 SO 的约定是使用np.nan
,人们np.nan
在讨论空值时通常会提到这个约定(这也许是我没有意识到None
可以使用的原因,但也许那是我自己的特质) .
简要地研究一下,我现在看到它自 1.0.0 以来pandas
确实具有pandas.NA
价值,但我从未见过有人在帖子中使用它:
In[0]:
import pandas as pd
import numpy as np
df = pd.DataFrame({'values':np.random.rand(20,)})
df['above'] …
Run Code Online (Sandbox Code Playgroud) 这是一个比较宽泛的话题,但我将尝试将其缩减为一些具体问题。
我在想Python 中的某个~meta~属性,其中许多基本数据类型的控制台表示等效于用于构造这些对象的代码:
l = [1,2,3]
d = {'a':1,'b':2,'c':3}
s = {1,2,3}
t = (1,2,3)
g = "123"
###
>>> l
[1, 2, 3]
>>> d
{'a': 1, 'b': 2, 'c': 3}
>>> s
{1, 2, 3}
>>> t
(1, 2, 3)
>>> g
'123'
Run Code Online (Sandbox Code Playgroud)
因此,对于这些对象中的任何一个,我都可以将控制台输出复制到代码中以创建这些结构或将它们分配给变量。
这不适用于某些对象,例如函数:
def foo():
pass
f = foo
L = [1,2,3, foo]
###
>>> f
<function foo at 0x00000235950347B8>
>>> L
[1, 2, 3, <function foo at 0x00000235950347B8>]
Run Code Online (Sandbox Code Playgroud)
虽然l
上面的列表有这个属性,但L
这里的列表没有;但这似乎只有 …
以下是我的图论与算法课程中的一个例子:
让A
为带权无向图(不同权重)的边的最小子集G
,这样,如果我们A
从中删除G
,G
则变得断开连接。中最亮的边A
必须位于任何 MST 中。
为什么这是一个正确的事实?我无法理解。
algorithm graph shortest-path minimum-spanning-tree data-structures
python ×6
pandas ×5
dataframe ×2
time-series ×2
algorithm ×1
clipboard ×1
console ×1
copy-paste ×1
graph ×1
inspect ×1
missing-data ×1
null ×1
numpy ×1
pyinstaller ×1