我被要求生成一些Excel报告.我目前正在为我的数据大量使用pandas,所以我当然希望使用pandas.ExcelWriter方法来生成这些报告.但是固定的列宽是个问题.
到目前为止我的代码很简单.假设我有一个名为'df'的数据框:
writer = pd.ExcelWriter(excel_file_path)
df.to_excel(writer, sheet_name="Summary")
Run Code Online (Sandbox Code Playgroud)
我正在查看pandas代码,我真的没有看到任何设置列宽的选项.宇宙中有没有一个技巧可以使列自动调整到数据?或者我可以在xlsx文件之后做些什么来调整列宽?
(我正在使用OpenPyXL库,并生成.xlsx文件 - 如果这有任何区别.)
谢谢.
A B
DATE
2013-05-01 473077 71333
2013-05-02 35131 62441
2013-05-03 727 27381
2013-05-04 481 1206
2013-05-05 226 1733
2013-05-06 NaN 4064
2013-05-07 NaN 41151
2013-05-08 NaN 8144
2013-05-09 NaN 23
2013-05-10 NaN 10
Run Code Online (Sandbox Code Playgroud)
说我有上面的数据框.获得具有相同索引的系列的最简单方法是什么,即A列和B列的平均值?平均需要忽略NaN值.扭曲的是,此解决方案需要灵活地向数据框添加新列.
我最接近的是
df.sum(axis=1) / len(df.columns)
Run Code Online (Sandbox Code Playgroud)
但是,这似乎并没有忽略NaN值
(注意:我对熊猫图书馆还有点新意,所以我猜这有一种明显的方法可以做到这一点,我的有限大脑根本就没有看到)
我正在分发一个内部python lib,我希望这样做,如果用户在运行此文件时使用anaconda,将自动更新库的依赖项.(这是请求.如果由我决定,我会让用户控制他们自己的包.)
到目前为止,我想出了类似的东西
def _user_has_conda():
cmd = 'conda --help'
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
if len(out) > 0 and len(err) == 0:
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
但这实际上只告诉我用户是否在他们的系统上安装了anaconda,而不是当前的python进程是否在anaconda环境中运行.
我注意到当我启动python或ipython shell时,我看到"Python 3.3.3 | Continuum Analytics,Inc |" 在顶部.我的下一个想法是尝试找到如何获取此字符串以查看是否存在"Continuum Analytics",如果存在,则假设用户在anaconda中运行.
我相信那里有更好的想法,这就是我在这里的原因.
谢谢.
我维护一个内部Python包,供公司中一些不太技术的人使用.由于他们的需求(或者更确切地说,他们的需求)几乎每天都在变化,我必须经常更新库,并且为了他们的喜好我经常为他们创建新的安装程序.
lib提供对自定义内部数据库的高级访问.此时,我知道我可以将lib版本与查询请求一起发送,并向用户显示一条消息,其结果是他们需要安装更新.
但是,由于这些人似乎认为花几秒钟点击.exe文件并点击安装程序上的"下一步"按钮需要太长时间,我被要求查看是否有办法自动更新该库在进行"导入X"调用时.
我从来没有遇到过这样的请求,我想如果有可能,大多数流行的图书馆都会提供这个选项.但我以前经常犯错.有没有人成功地做过这件事?
import OpenSSL
key = ...
signature = ...
data = ...
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_ASN1, key)
OpenSSL.crypto.verify(x509, signature, data, 'sha1')
Run Code Online (Sandbox Code Playgroud)
到目前为止,我能够毫无问题地完成所有这些工作.但是,它并不觉得这是足够的安全性,因为密钥本身是通过URL(我应该信任*)给我的,并且构建签名的方法是公开可用的.
因此,据说密钥被"VeriSign Class 3 Code Signing 2010 CA"验证,有人能告诉我如何检查这是一个有效的声明吗?
我猜我需要在我的机器上本地获得VeriSign证书.假设我这样做,我从那里去哪里?
谢谢!
*URL作为JSON请求中的参数提供给我.当然,URL将是HTTPS,我可以检查域名和所有这些.但似乎我应该对证书本身进行检查
我目前正在使用这个lib来测试我设置的kafka服务器:https://github.com/dsully/pykafka
import kafka
import time
def test_kafka_server(n=1):
for i in range(0,n):
producer = kafka.producer.Producer('test',host='10.137.8.192')
message = kafka.message.Message(str(time.time()))
producer.send(message)
producer.disconnect()
def main():
test_kafka_server(100000)
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
最终发生的事情是我最终超载了我自己的本地机器.
我得到错误10055,根据谷歌意味着"Windows已经用完了TCP/IP套接字缓冲区,因为有太多连接一次打开." 根据netstat,producer.disconnect()没有关闭套接字,而是将其置于某个TIME_WAIT状态.
ipython调试器指向这一行:
C:\Python27\lib\socket.pyc in meth(name, self, *args)
222 proto = property(lambda self: self._sock.proto, doc="the socket protocol")
223
--> 224 def meth(name,self,*args):
225 return getattr(self._sock,name)(*args)
226
Run Code Online (Sandbox Code Playgroud)
作为罪魁祸首,但这似乎陷入了低于我感到满意的事情.
我搜索过,发现这个Python套接字没有正确关闭连接,建议这样做:
setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Run Code Online (Sandbox Code Playgroud)
所以,我在io.py文件中使用该选项重建了pykafka lib:
def connect(self):
""" Connect to the Kafka server. """ …Run Code Online (Sandbox Code Playgroud) 我的类有很多惰性属性,我想对其进行调试以查看它们何时在应用程序过程中加载。不幸的是,调试器的变量查看器本身调用属性的代码以显示其值。
有人知道是否有一个选项可以禁用自动加载并仅在进程调用它时显示该值,或者直到用户单击显示它为止?
我需要在Flask服务器上编写一个方法,它将部分请求写入日志文件.但是,如果我理解正确,Flask是多线程的,并且很有可能写入文件是不安全的.
不可否认,我或多或少都是python和多线程编程的新手一般,所以我需要有人稍微握住我的手一点点:)
到目前为止我的代码(略有修改,没有任何部分会让我在网上发布麻烦)
@app.route('/store_test')
def store_test():
now = str(time.time())
ip_address = request.remote_addr
agent = request.user_agent.string
log_data = [now,ip_address,agent]
log_data_string = "\t".join(log_data)
filename = "log.dat"
f = open(filename,'a')
f.write(log_data_string + "\n")
f.close()
return 'OK'
Run Code Online (Sandbox Code Playgroud)
我猜我需要围绕open和close语句包含一些代码,但我不知道是什么,我正在阅读"果壳中的Python"一书中的Threads and Processes章节,它并没有真正给我很多关于如何实际使用这些方法的想法.
任何帮助,将不胜感激.
这里的场景是我有一个带有原始整数数据的数据帧,以及一个将这些int映射到字符串值的dict
我需要使用地图中的相应值替换数据框中的值,但如果它没有映射到任何内容,请保留原始值.
到目前为止,我能够找到如何做我想要的唯一方法是使用临时列.但是,由于我正在使用的数据大小,这有时会有点毛茸茸.所以,我想知道是否有一些技巧可以在熊猫中做到这一点而不需要临时列...
import pandas as pd
import numpy as np
data = pd.DataFrame(np.random.randint(1,5, size=(100,1)))
map_array = {1:'one', 2:'two', 4:'four'}
data['__temp__'] = data[0].map(map_array, na_action=None)
#I've tried varying the na_action arg to no effect
nan_index = data['__temp__'][data['__temp__'].isnull() == True].index
data['__temp__'].ix[nan_index] = data[0].ix[nan_index]
data[0] = data['__temp__']
data = data.drop(['__temp__'], axis=1)
Run Code Online (Sandbox Code Playgroud) 设置场景:我有一个 dtype int64 的 Series 对象。我需要将这些转换为仅包含日期的 datetime 对象(没有小时和秒)
到目前为止我有什么工作...
foo.head() =
0 1382400000
1 1382400000
2 1382054400
3 1381708800
4 1380758400
Name: da_0, dtype: int64
Run Code Online (Sandbox Code Playgroud)
这个功能:
def convert_stamp_to_date(stamp):
try:
d = datetime.datetime.utcfromtimestamp(stamp)
except:
d = datetime.datetime.utcfromtimestamp(0)
d = datetime.datetime(d.year, d.month, d.day)
return d
Run Code Online (Sandbox Code Playgroud)
当我处理有问题的系列时,我会打电话给:
foo = foo.apply(lambda x: convert_stamp_to_date(x))
Run Code Online (Sandbox Code Playgroud)
这给了我正确的解决方案:
0 2013-10-22 00:00:00
1 2013-10-22 00:00:00
2 2013-10-18 00:00:00
3 2013-10-14 00:00:00
4 2013-10-03 00:00:00
Name: da_0, dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)
这给了我想要的东西,但是我发现它很慢(应该是这样,对吧?因为它只是做这项工作的天真方式)。
对于长度约 5000 的小型系列对象,平均需要约 27 毫秒进行转换。不坏......不过,我可以轻松拥有它增长到数百万行的Series对象。对于那些,我看到转换时间进入 1-2 分钟范围。与我使用相同大小的 Series …