我有一个带有开始和结束时间(datetime.time)的pandas DataFrame,用于处理列表:
from datetime import time
import pandas as pd
df = pd.DataFrame(columns=['start', 'end'],
index=pd.Index(['proc01', 'proc02'], name='Processes'),
data=[
[time(10), time(14)],
[time(12), time(16)]
])
我想将此信息转换为直方图,以统计正在运行的进程数:
>>> bins = pd.date_range('08:00', '22:00', freq='1H').time
>>> count_processes(df, bins)
array([0, 0, 1, 1, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0])
我有一个实现,但是对于大数据帧(大约2到300万行)来说有点慢,我想知道是否有一种方法可以向量化它,或者至少使其更快:
def count_processes(df, bins):
result = np.zeros_like(bins, dtype=int)
for _, row in df.iterrows():
aux = (row['start'] <= bins) & (bins < row['end'])
result += aux.astype(int)
return result
答案 0 :(得分:3)
在数据框上进行迭代通常是您没有最佳使用pandas
的信号。您可以改为从已经开始的过程中减去已经结束的过程,例如:
res = []
for b in bins:
s = (df['start'] < b).sum()
e = (df['end'] < b).sum()
res.append(s-e)
# [0, 0, 0, 1, 1, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0]
答案 1 :(得分:0)
正在使用Drawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 10, 12, 35);
Chart chart = drawing.createChart(anchor);
CTChart ctChart = ((XSSFChart)chart).getCTChart();
CTPlotArea ctPlotArea = ctChart.getPlotArea();
CTPieChart ctPieChart = ctPlotArea.addNewPieChart();
CTBoolean ctBoolean = ctPieChart.addNewVaryColors();
ctBoolean.setVal(true);
CTPieSer ctPieSer = ctPieChart.addNewSer();
ctPieSer.addNewIdx().setVal(0);
String F1,F2 = new String();
F1 = "query terms vs. Ort!$B$1:$I$1"; F2="query terms vs. Ort!$B$2:$I$2";
CTAxDataSource cttAxDataSource = ctPieSer.addNewCat();
CTStrRef ctStrRef = cttAxDataSource.addNewStrRef();
ctStrRef.setF(F1);
CTNumDataSource ctNumDataSource = ctPieSer.addNewVal();
CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
ctNumRef.setF(F2);
CTLegend ctLegend = ctChart.addNewLegend();
ctLegend.addNewLegendPos().setVal(STLegendPos.B);
ctLegend.addNewOverlay().setVal(false);
// title
CTTitle ctTitle = ctChart.addNewTitle();
ctTitle.addNewOverlay().setVal(false);
ctTitle.addNewTx().addNewRich().addNewBodyPr();
ctTitle.getTx().getRich().addNewP().addNewR().setT(S);
董事会广播,很遗憾,这是O(m * n)解决方案,请尝试使用您的真实数据,如果您有任何问题,请告诉我
numpy