小编Man*_*gia的帖子

使用熊猫在滚动窗口中重新采样

假设我有每日数据(没有规则的间隔),我想计算过去5个月中每个月的移动标准偏差(或任意非线性函数)。例如,对于2012年5月,我将计算从2012年1月到2012年5月(5个月)之间的stddev。对于2012年6月,该期间从2012年2月开始,依此类推。最终结果是一个包含月度值的时间序列。

无法应用滚动窗口,因为这首先是每天的,其次我需要指定值的数量(滚动窗口不按时间范围汇总,一些帖子解决了此问题,但它们与我的问题无关,因为滚动会仍然是每个新的一天)。

无法应用重采样,因为那样采样将是每5个月一次,例如,我将仅具有2012年5月,2012年10月,2013年3月的值...最后,由于函数不是线性的,因此我无法首先对其进行重构做一个每月的样本,然后在其上应用5个周期的滚动窗口。

因此,我需要将某种重采样功能应用于按时间间隔(而不是值的数量)定义的滚动窗口。

如何在熊猫中做到这一点?一种方法是将几个(在此示例中为5个)重新采样(5个月)的时间序列组合在一起,每个时间序列具有一个月的偏移量,然后将所有这些序列对齐为一个序列...但是我不知道如何实现这一点。

python resampling pandas

7
推荐指数
2
解决办法
3954
查看次数

如何保护Python源代码并将其编译成.so库?

我想保护我的python源代码,我知道不可能有绝对的保护,但仍然应该有一些方法让它变得足够困难或相当耗时。我想

1)自动删除所有文档、注释和

2)系统地更改模块内变量和函数的名称(混淆?),以便我可以保留外部接口(具有有意义的名称),而变量和函数的内部名称无法发音。

也许最好的解决方案如下

3)是否有一种简单的方法将python模块编译为.so库,具有清晰的接口并且可以被其他python模块使用?这与使用 distutils 构建 C 和 C++ 扩展类似,只是源代码是 python 本身而不是 C/C++。这个想法是将所有“秘密代码”组织成模块,编译它们,然后将它们导入到不被视为秘密的Python代码的其余部分中。

再次,我知道一切都可以进行逆向工程,我认为从务实的角度来看,大多数普通开发人员将无法对代码进行逆向工程,即使他们能够,道德/法律/时间原因也会使他们如果他们真的想从事这方面的工作,请三思而后行。

python compilation source-code-protection

6
推荐指数
1
解决办法
1万
查看次数

如何比较python中的两个时区?

 import pytz
 b=pytz.timezone('Europe/Rome')
 c=pytz.timezone('Europe/Berlin')
Run Code Online (Sandbox Code Playgroud)

然而,这两个时区有不同的名称,但代表相同的东西

  • b == c返回false
  • b.zone与c.zone不同

有没有办法看到b实际上等于c?

具体的问题是我必须转换pandas数据帧的时区,但只有当这个区域不同于让我们说c时.原始时区可能是b,在这种情况下我不想转换,因为将b转换为c会丢失时间(因为它们代表最后的相同时区....)

谢谢你的帮助.

更新:将'CET'更改为'Europe/Rome'以确保示例中的时区相同,使用答案的反馈

python timezone pandas

6
推荐指数
2
解决办法
727
查看次数

在pandas DataFrame/Series中快速选择时间间隔

我的问题是我想过滤一个DataFrame只包含在[start,end]区间内的时间.如果不关心这一天,我想过滤每天的开始和结束时间.我有一个解决方案,但它很慢.所以我的问题是,是否有更快的方法来进行基于时间的过滤.

import pandas as pd
import time


index=pd.date_range(start='2012-11-05 01:00:00', end='2012-11-05 23:00:00', freq='1S').tz_localize('UTC')
df=pd.DataFrame(range(len(index)), index=index, columns=['Number'])

# select from 1 to 2 am, include day
now=time.time()
df2=df.ix['2012-11-05 01:00:00':'2012-11-05 02:00:00']
print 'Took %s seconds' %(time.time()-now) #0.0368609428406

# select from 1 to 2 am, for every day
now=time.time()
selector=(df.index.hour>=1) & (df.index.hour<2)
df3=df[selector]
print 'Took %s seconds' %(time.time()-now) #Took  0.0699911117554
Run Code Online (Sandbox Code Playgroud)

如你所知,如果我删除那天(第二个案例)它几乎需要两倍.如果我有很多不同的日子,例如11月5日至7日,计算时间会迅速增加:

index=pd.date_range(start='2012-11-05 01:00:00', end='2012-11-07 23:00:00', freq='1S').tz_localize('UTC')
Run Code Online (Sandbox Code Playgroud)

那么,总结一下,有多快的方法可以按时间过滤多天?

谢谢

python indexing pandas

5
推荐指数
1
解决办法
6415
查看次数

如何将python类包装到C ++类中?

我有一个实现给定功能的python类,例如文件Test_script.py是:

class Test(object):
    def __init__(self,name):
        self.name=name
    def f1(self,n):
        return n**2
    def f2(self,n,m):
        return n+m
    def f3(self,word):
        print word
Run Code Online (Sandbox Code Playgroud)

我如何构建一个仅包装此类和所有函数的C ++类,以便此类反过来可以被其他C ++类/代码使用?boost :: python是否有助于提供一些快捷方式?

为什么这是相关的? 因为在某些特定的用例中,由于可以重用许多经过良好测试和记录的模块(例如,解析,numpy函数...),而不是从头开始,因此在python中实现给定功能会更快,更轻松。在C ++中。上面的类是一个玩具问题,一旦很清楚如何在C ++中包装/嵌入它,将很容易处理更复杂的功能。

谢谢

c++ python wrapper

3
推荐指数
1
解决办法
808
查看次数

带有子进程的python日志记录:获取有序输出,因为它在日志文件中也显示在屏幕上

我有一个python脚本(script1.py),它生成子进程,如下所示:

print 'This is the main script'
status=os.system(command)
Run Code Online (Sandbox Code Playgroud)

现在我执行脚本并重定向stdoutput,如下所示:

python script1.py > log.txt
Run Code Online (Sandbox Code Playgroud)

文件log.txt首先包含subprocess命令的输出(使用os.system调用),并且仅字符串'This is the main script'之后.我期待相反的顺序!

如果我使用subprocess而不是os.system,情况仍然是相同的:

print 'This is the main script'
p=subprocess.Popen(command,shell=True, stdout=None, stderr=subprocess.STDOUT)
status=p.returncode
Run Code Online (Sandbox Code Playgroud)

那么如何将stdoutput重定向到文件并确保所有子进程以正确的顺序写入该文件?请注意,如果我不重定向标准输出,则日志消息的顺序是正确的(因为它显示在屏幕上)!

UPDATE

这解决了我的问题(如描述这里):

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
Run Code Online (Sandbox Code Playgroud)

或者,也可以强制刷新打印的内容:

sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

但是,我认为这并不理想,因为它应该在每个打印命令之后完成.所以我使用了第一种方法,它的优点是我可以实时检查日志,而无需等待计算在写入缓冲输出文件之前结束.

python logging subprocess stdout

3
推荐指数
1
解决办法
3028
查看次数

在熊猫中同步两个大数据帧的最有效方法是什么?

我想同步两个很长的数据帧,在这个用例中性能是关键。使用日期时间或时间戳按时间顺序对这两个数据帧进行索引(应该尽可能快地利用它)。

本例中提供了一种同步方式:

import pandas as pd
df1=pd.DataFrame({'A':[1,2,3,4,5,6], 'B':[1,5,3,4,5,7]}, index=pd.date_range('20140101 101501', freq='u', periods=6))
df2=pd.DataFrame({'D':[10,2,30,4,5,10], 'F':[1,5,3,4,5,70]}, index=pd.date_range('20140101 101501.000003', freq='u', periods=6))

# synch data frames
df3=df1.merge(df2, how='outer', right_index=True, left_index=True).fillna(method='ffill')
Run Code Online (Sandbox Code Playgroud)

我的问题是这是否是最有效的方法?如果有更快的方法来解决这个任务,我准备探索其他解决方案(例如使用 numpy 或 cython)。

谢谢

注意:时间戳通常不是等距间隔的(如上例所示),该方法也适用于这种情况

阅读答案后发表评论

我认为有很多用例既不对齐也不合并或加入帮助。关键是不要使用与 DB 相关的语义进行对齐(在我看来,这对于时间序列并不是那么相关)。对我来说,对齐意味着将系列 A 映射到 B 并有一种处理缺失值的方法(通常是采样和保持方法),对齐和连接会导致不想要的效果,例如由于连接而重复的几个时间戳。我仍然没有完美的解决方案,但似乎 np.searchsorted 可以提供帮助(它比使用多个调用来加入/对齐来完成我需要的要快得多)。到目前为止,我找不到熊猫的方法来做到这一点。

如何将 A 映射到 B 以便 B 使结果具有 A 和 B 的所有时间戳但没有重复(除了那些已经在 A 和 B 中的时间戳)?

另一个典型的用例是采样和保持同步,它可以通过如下有效的方式解决(同步 A 与 B,即为 A 中的每个时间戳取 B 中的相应值:

idx=np.searchsorted(B.index.values, A.index.values, side='right')-1
df=A.copy()
for i in B:
    df[i]=B[i].ix[idx].values
Run Code Online (Sandbox Code Playgroud)

结果 df 包含 A 的相同索引和 B …

python performance dataframe pandas

3
推荐指数
1
解决办法
8904
查看次数

python中的舍入错误

为什么乘法的顺序会影响结果?请考虑以下代码

a=47.215419672114173
b=-0.45000000000000007
c=-0.91006620964286644
result1=a*b*c
temp=b*c
result2=a*temp
result1==result2
Run Code Online (Sandbox Code Playgroud)

我们都知道,RESULT1 应该是平等的,以RESULT2,但是我们得到:

result1==result2 #FALSE!
Run Code Online (Sandbox Code Playgroud)

差异很小

result1-result2 #3.552713678800501e-15
Run Code Online (Sandbox Code Playgroud)

但是,对于特定应用程序,此错误可能会放大,以便执行相同计算的两个程序的输出(一个使用result1,另一个使用result2)可能完全不同.

为什么会如此以及如何在数字/科学应用中解决这些问题呢?

谢谢!

UPDATE

很好的答案,但我还是很怀念的原因,为什么顺序的乘法问题,如

temp2=a*b
result3=temp2*c
result1==result3 #True
Run Code Online (Sandbox Code Playgroud)

所以似乎编译器/解释器将*b*c视为(a*b)*c

python rounding numerical-computing

2
推荐指数
3
解决办法
967
查看次数

如何比较熊猫的频率/采样率?

有没有办法用熊猫的频率表示法说'13Min'>> 59S'和<'2H'?

python sample-data pandas

2
推荐指数
1
解决办法
697
查看次数

如何使用月/年分辨率绘制大熊猫时间序列(只需几行代码)?

假设我们想绘制一个时间序列,例如:

import pandas as pd
import numpy as np

a=pd.DatetimeIndex(start='2010-01-01',end='2014-01-01' , freq='D')
b=pd.Series(np.randn(len(a)), index=a)
b.plot()
Run Code Online (Sandbox Code Playgroud)

结果是一个数字,其中x轴有多年作为标签,我想得到月份标签.有没有一种快速的方法(可能避免使用数十行复杂的代码调用matplotlib)?

plot matplotlib pandas

0
推荐指数
1
解决办法
5344
查看次数