Advertisement
Guest User

ftd_analyzer

a guest
Jul 23rd, 2021
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.58 KB | None | 0 0
  1. import pandas as pd
  2. import numpy as np
  3. from pandas import DataFrame
  4. from datetime import datetime
  5. import os
  6.  
  7. class Analyze:
  8. ONE_MILLION = 1_000_000
  9. ONE_BILLION = 1_000_000_000
  10.  
  11. def __init__(self):
  12. self.ftd_data = None
  13. self.file_dir = 'files'
  14. self.tickers_floats = None
  15.  
  16.  
  17. def read_data(self):
  18. concat_data = pd.DataFrame()
  19. for name in os.listdir('files/'):
  20. if name != "tickers_floats.csv":
  21. data = pd.read_csv(f"{self.file_dir}/{name}", delimiter='|')
  22. # last two columns are summary data
  23. concat_data = pd.concat([concat_data, data[0:-2]])
  24. self.ftd_data = concat_data
  25.  
  26. def transform_data(self):
  27. self.ftd_data = self.ftd_data.rename(columns={
  28. 'QUANTITY (FAILS)': 'Quantity'
  29. })
  30. # # Commented stuff was for running web scraping.
  31. # TODO: Clean up
  32. self.ftd_data = self.ftd_data.merge(self.read_float(), on='SYMBOL', how='left')
  33. self.ftd_data['Percentage of Float'] = self.ftd_data.apply(lambda x: x['Quantity'] / x['float'], axis=1)
  34.  
  35. self.ftd_data = self.ftd_data[self.ftd_data['PRICE'] != "."]
  36. self.ftd_data['Total Amount'] = self.ftd_data.apply(lambda x: x['Quantity'] * float(x['PRICE']), axis=1)
  37.  
  38. # custom filters
  39. self.ftd_data = self.ftd_data[self.ftd_data['float'] != -1.0]
  40. self.ftd_data = self.ftd_data.sort_values(by='Percentage of Float', ascending=False)
  41.  
  42.  
  43.  
  44. def read_float(self):
  45. return Analyze.transform_float(pd.read_csv('files/tickers_floats.csv'))
  46.  
  47.  
  48. @staticmethod
  49. def transform_float(df: DataFrame):
  50. df = df[(df['float'] != 'UNKNOWN') | (df['float'].notna())]
  51. df['float'] = df['float'].replace(np.nan, "-1")
  52. def transform_money(amt):
  53. # million
  54. if 'M' in amt:
  55. return float(amt[:-1])*Analyze.ONE_MILLION
  56. # billion
  57. elif 'B' in amt:
  58. return float(amt[:-1])*Analyze.ONE_BILLION
  59. return -1
  60.  
  61. df['float'] = df['float'].apply(lambda x: transform_money(x))
  62. return df
  63.  
  64.  
  65.  
  66. def write_data(self):
  67. self.tickers_floats.to_csv('files/tickers_floats.csv', index=False)
  68.  
  69.  
  70. @staticmethod
  71. def do_print(title, content):
  72. print(f"{title.ljust(40)[:40]}: {content}")
  73.  
  74.  
  75. def run(self):
  76. # self.read_data()
  77. # self.transform_data()
  78. # the above two commands read in and process SEC split data
  79. # below command just reads in file of the result of the above
  80. self.ftd_data = pd.read_csv('aggregate_ftds.csv')
  81. # self.write_data()
  82. Analyze.do_print("Number of tickers (that also have price)", self.ftd_data['SYMBOL'].unique().shape[0])
  83. gme = self.ftd_data[self.ftd_data['SYMBOL'] == 'GME']
  84. Analyze.do_print("Avg % of float, all tickers", self.ftd_data['Percentage of Float'].mean())
  85. Analyze.do_print("Avg % of float, GME", gme['Percentage of Float'].mean())
  86. # divide two above for ratio of gme to all
  87. Analyze.do_print("Avg Net Amount FTD, all tickers", self.ftd_data['Total Amount'].mean())
  88. Analyze.do_print("Avg Net Amount FTD, GME", gme['Total Amount'].mean())
  89.  
  90. print(gme.sort_values(by='Total Amount', ascending=False))
  91.  
  92. Analyze.do_print("Number of dates", self.ftd_data['SETTLEMENT DATE'].unique().shape[0])
  93. Analyze.do_print("GME # of appearances", gme['SETTLEMENT DATE'].unique().shape[0])
  94.  
  95. if __name__ == "__main__":
  96. runner = Analyze()
  97. runner.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement