假设我有每日数据(没有规则的间隔),我想计算过去5个月中每个月的移动标准偏差(或任意非线性函数)。例如,对于2012年5月,我将计算从2012年1月到2012年5月(5个月)之间的stddev。对于2012年6月,该期间从2012年2月开始,依此类推。最终结果是一个包含月度值的时间序列。
我无法应用滚动窗口,因为这首先是每天的,其次我需要指定值的数量(滚动窗口不按时间范围汇总,一些帖子解决了此问题,但它们与我的问题无关,因为滚动会仍然是每个新的一天)。
我无法应用重采样,因为那样采样将是每5个月一次,例如,我将仅具有2012年5月,2012年10月,2013年3月的值...最后,由于函数不是线性的,因此我无法首先对其进行重构做一个每月的样本,然后在其上应用5个周期的滚动窗口。
因此,我需要将某种重采样功能应用于按时间间隔(而不是值的数量)定义的滚动窗口。
如何在熊猫中做到这一点?一种方法是将几个(在此示例中为5个)重新采样(5个月)的时间序列组合在一起,每个时间序列具有一个月的偏移量,然后将所有这些序列对齐为一个序列...但是我不知道如何实现这一点。
我想保护我的python源代码,我知道不可能有绝对的保护,但仍然应该有一些方法让它变得足够困难或相当耗时。我想
1)自动删除所有文档、注释和
2)系统地更改模块内变量和函数的名称(混淆?),以便我可以保留外部接口(具有有意义的名称),而变量和函数的内部名称无法发音。
也许最好的解决方案如下:
3)是否有一种简单的方法将python模块编译为.so库,具有清晰的接口并且可以被其他python模块使用?这与使用 distutils 构建 C 和 C++ 扩展类似,只是源代码是 python 本身而不是 C/C++。这个想法是将所有“秘密代码”组织成模块,编译它们,然后将它们导入到不被视为秘密的Python代码的其余部分中。
再次,我知道一切都可以进行逆向工程,我认为从务实的角度来看,大多数普通开发人员将无法对代码进行逆向工程,即使他们能够,道德/法律/时间原因也会使他们如果他们真的想从事这方面的工作,请三思而后行。
例
import pytz
b=pytz.timezone('Europe/Rome')
c=pytz.timezone('Europe/Berlin')
Run Code Online (Sandbox Code Playgroud)
然而,这两个时区有不同的名称,但代表相同的东西
有没有办法看到b实际上等于c?
具体的问题是我必须转换pandas数据帧的时区,但只有当这个区域不同于让我们说c时.原始时区可能是b,在这种情况下我不想转换,因为将b转换为c会丢失时间(因为它们代表最后的相同时区....)
谢谢你的帮助.
更新:将'CET'更改为'Europe/Rome'以确保示例中的时区相同,使用答案的反馈
我的问题是我想过滤一个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类,例如文件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 ++中包装/嵌入它,将很容易处理更复杂的功能。
谢谢
我有一个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)
但是,我认为这并不理想,因为它应该在每个打印命令之后完成.所以我使用了第一种方法,它的优点是我可以实时检查日志,而无需等待计算在写入缓冲输出文件之前结束.
我想同步两个很长的数据帧,在这个用例中性能是关键。使用日期时间或时间戳按时间顺序对这两个数据帧进行索引(应该尽可能快地利用它)。
本例中提供了一种同步方式:
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 …
为什么乘法的顺序会影响结果?请考虑以下代码
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
假设我们想绘制一个时间序列,例如:
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)?
python ×9
pandas ×6
c++ ×1
compilation ×1
dataframe ×1
indexing ×1
logging ×1
matplotlib ×1
performance ×1
plot ×1
resampling ×1
rounding ×1
sample-data ×1
stdout ×1
subprocess ×1
timezone ×1
wrapper ×1