【问题标题】:Extrapolate data in an excel file using python script使用python脚本推断excel文件中的数据
【发布时间】:2019-04-03 12:37:13
【问题描述】:

我有一些国家的给定数据集,其中包含以下字段:

DATE
SOURCE COMPANY 
DESTINATION COMPANY 
QUANTITY
UNITS

我有 2 天的数据,我需要用每个公司的日期和数量值推断一年的数据,然后在 excel 中打印结果。

我需要每个公司 x 1 行交付给每个公司 y 1 年。日期可以从 2018 年到今天,数量可以相差 +/- 100。

代码

import pandas as pd 
import numpy as np 
import os 
import datetime 
import random 
import sys 
from datetime import timedelta 

df = pd.read_csv("Location") 
df_1 = df 
for i in range(1,366): 
  for i in range(0,df.shape[0]): 
    df['Quantity'][i] = df['Quantity'][i] + random.randint(-100,100)    
    df['Date'][i] = pd.to_datetime(df['Date'])[i] + timedelta(days = -1)

df_1 = pd.concat([df_1,df]) 
df_1.to_csv("Extrapolated_data.csv",sep = '')

但是它消耗的时间是不可接受的,我怎样才能让它变得更好

【问题讨论】:

  • 您想使用过去 2 天的数据推断 6 个月前公司 x 从国家 y 向 Z 公司销售了多少单位?
  • @DanielleM。我需要每家公司 x 1 个单位交付给每家公司 y 1 年,是的,我有 2 天的数据。日期可以从 2018 年至今,数量可以相差 +/- 100
  • 欢迎来到stackoverflow。这不是免费的代码编写服务。您仍然需要编写自己的代码。当您遇到具体问题时,我们可以提供帮助。请edit您的问题并发布您的代码。您可能想阅读How to Ask 并选择tour
  • 您好,欢迎来到 SO!我应用了一些代码突出显示,但现在你的问题不是不言自明的,因为它缺少你刚刚在 cmets 中提到的细节。请使用更多详细信息更新您的问题,以便更多用户可以提供帮助。如果您已经尝试过一些代码,请也发布它。当我们谈论 Excel 导出时,我将 unitrow 交换了这个词,如果这是错误的,请更正并添加定义 unit 应该是什么意思。
  • 未来:请编辑您的问题(您的问题下方有一个“编辑”链接)并包含更多详细信息,例如您在评论中发布的代码,因为格式会丢失。这次是我为你做的。关于您的代码:请在下面我的答案中查看您的代码的固定版本,看看它是否适合您。

标签: python mysql excel pandas extrapolation


【解决方案1】:

我认为您在对问题的评论中发布的代码存在一些问题,您必须注意:

  1. df_1.to_csv() 参数中的sep 需要设置为字符,即“,”或“;” (请参阅here),否则如果您不想使用另一个分隔符,则只需省略它,然后使用“,”
  2. 您的源文件中没有 .csv 扩展名(这可能很好)
  3. 分配df_1 = df 不仅会复制DataFrame 的列/元数据,还会复制DataFrame包括所有数据。这将产生一个包含原始数据和生成数据的文件。

更新代码

由于我还是 Pandas 的新手,我看不到只迭代行的方法,而是必须迭代行和列,这会导致下面的代码。我的示例文件总共有大约 40 行,结果文件有大约 13.000 行,文件大小为 619 KB。创建时间为 60,007 秒。从代码中删除时间计算和随机性将创建时间减少到 54,38 秒。这不是超快,但我也不会称之为超慢。

import pandas as pd 
import numpy as np 
import os 
import datetime 
import random 
import sys 
from datetime import timedelta 
from timeit import default_timer as timer

df = pd.read_csv("orders.csv") 
df_1 = pd.DataFrame(columns=df.columns) 
start = timer()

for d in range(1,366):
  for index, dfc in df.iterrows():

    dfc['Quantity'] = dfc['Quantity'] + random.randint(-100,100)    
    dfc['Date'] = pd.to_datetime(dfc['Date']) + timedelta(days = -d)
    df_1 = df_1.append(dfc, ignore_index=True)

  print("Loop ",d)  

end = timer()
print(end - start) 

df_1.to_csv("Extrapolated_data.csv",sep = ',')

【讨论】:

  • 第一个循环是生成一年的数据,因此 (1,365)random.randint(-100,100) 是随机化并生成一个介于 +/-100 之间的值,以便为我提供一年的随机预测Timedelta(days = -1) 是从 excel 文件中给出的开始日期生成过去一年的数据 最终目标是生成任何给定公司的一年(例如从 2015 年至今)的外推数据,同时随机化它们之间的数量每天 +/-100(即从 2015 年至今生成的日期)
  • @OsamaTariq 我更新了上面的代码,主要问题似乎是基于索引的访问,即df['Quantity'][i]。我还看到 .append() 不如 pd.concat() 快,但我找不到将其合并到我的代码中的方法。
猜你喜欢
  • 2018-08-19
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 2013-10-24
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多