pandas 在Python中进行矢量化以查找当前汽车数-无循环

unguejic  于 2023-03-06  发布在  Python
关注(0)|答案(1)|浏览(155)

我希望这样做没有一个循环(速度和学习如何)。
为了找出目前市场上有多少辆汽车,假设你有从1923年到今天的所有年份的销量。
这是5个不同国家的情况。
对于所有国家,我也有一个衰减向量,因为汽车在某个点停止工作,向量包含了在生产后给定年数时发生故障并退出市场的汽车数量。
它可能看起来像这样:

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(100,1000,size=(100, 5)), columns=list('ABCDE'))

break_vector = np.random.dirichlet(np.ones(100),size=1)

break_vector的和为1,因为我们可以假设这些汽车中没有一辆能在道路上行驶超过100年。
我们要计算的是每个国家每年的剩余汽车数量,所以计算基本上是针对每个市场:
df中取出1923年售出的汽车数量,乘以break_vector,在1924年,我们需要做同样的事情,然后加上1923年以来尚未分解的汽车数量(break_vector中前两位的总和乘以1923年售出的汽车数量),依此类推。
最后,我们得到了一个 Dataframe ,其中包含了每个国家每年仍在行驶的汽车数量--国家是列,指数是年。
我想要的是一个 Dataframe ,其中包含在任何一年中有多少辆汽车在A国行驶的信息。
我已经在一个循环中完成了它,但是我如何使用向量来完成它,并希望得到更容易调试和运行更快的代码呢?
我试着用循环的方式来做,它工作了(这意味着它做了我上面描述的事情),但是在更大的范围内,如果我们能看到向量/矩阵是如何完成的,那将是令人惊讶的,而且如果我们谈论的是50个国家的话,它会快多少。

import pandas as pd
import numpy as np
#Creating data
df = pd.DataFrame(np.random.randint(100,1000,size=(100, 5)), columns=list('ABCDE'))
break_vector = np.random.dirichlet(np.ones(100),size=1)
#Empty dataframe to store results
all_markets = pd.DataFrame()
#The countries to include
countries = list('ABCDE')
#Loopty loop stuff
for country in countries:
    zero_data = np.zeros(shape=(1000,1000))
    d = pd.DataFrame(zero_data)
    sold = df[country].cumsum()
    for sales in range(0,100):
        sales_year=df.iloc[sales,countries.index(country)]
        for breaks in range(0,100):
            breakdowns = sales_year*break_vector[0,breaks]
            d.iloc[breaks+sales,sales]=breakdowns
            print(breaks+sales)
    #Remaining in market - row sums
    result1 = sold-d.sum(axis=1).cumsum()[0:100]
    all_markets[country] = result1
´´´
von4xj4u

von4xj4u1#

我的解决方案的要点是,当你把生存向量(break_vector)乘以新车时,你会得到每年坏掉的所有汽车,作为矩阵中对角线的总和,其中偏移量=0是现在,99是最老的一辆:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randint(100,1000,size=(100, 5)), columns=list('ABCDE'))

age = np.arange(0,100)
survival = np.random.dirichlet(np.ones(100),1).T
broken_cars_matrix = survival * np.flip(df.A.values)
broken_cars = np.cumsum([np.trace(broken_cars_matrix, i) for i in reversed(age)])
remaining = np.cumsum(df.A) - broken_cars

您可以使用以下方法可视化解决方案:

plt.plot(df.A)
plt.plot(np.cumsum(df.A))
plt.plot(broken_cars)
plt.plot(remaining)
plt.show()

每个国家的迭代,我会做一个循环,但也可以矢量化使用三维矩阵以同样的方式。

相关问题